Мені було цікаво про походження «хай», що використовується в Ліспі, Клуджуре та Хаскеллі. Хтось знає, на якій мові вона з’явилася спочатку?
Мені було цікаво про походження «хай», що використовується в Ліспі, Клуджуре та Хаскеллі. Хтось знає, на якій мові вона з’явилася спочатку?
Відповіді:
Ну, BASIC мав LET
призначити як частину синтаксису з самого початку в 1964 році, так що це передувало б використанню let
в Ліспі, яке, як зазначає Кріс Єстер-Янг, з'явилося до 1970-х років згідно з Еволюцією Ліспа .
Я не вірю, що COBOL, Fortran або ALGOL також не мають LET
свого синтаксису. Тому я збираюся їхати з БАЗОВИМ.
let
в основному це не лексично обмежений зв'язок. Отже, правильною відповіддю було б щось на зразок "воно вперше з'явилося англійською мовою, до 12 століття".
let
в цьому контексті ( let
х is
що - то in
такий вираз) вперше з'явився в математичних текстах англійською мовою, і це, де він прийшов в програмування. Я не бачу різниці між формальними системами - математичними мовами, мовами програмування, що б там не було - вони однакові.
equals
, ні is
. І так, псевдо-код - найкраща відповідь поки що.
Я хотів би додати теоретичну точку зору: У класичних лямбда-калькулях - let
це просто синтаксичний цукор. Наприклад
let x = N in M
можна переписати просто як
(λx.M)N
Тож його перша поява на ранніх (функціональних) мовах не така цікава.
Однак це стає дуже важливим із винаходом системи типу Хіндлі-Мілнера та її алгоритму виводу типу. У цьому типі система let
є незамінною, оскільки є поліморфною (на відміну від λ-абстракції в HM). Наприклад, розглянемо цей простий вираз:
let id = λx . x in id id
Ось id
поліморфний, він має тип ∀α.α → α
, а тому id id
перевіряє тип - це тип id id : τ → τ
для довільного τ. (Для перших id
ми відносимо τ → τ
до α
і по друге id
ми відносимо τ
до α
.)
Однак ми не можемо переписати його, використовуючи λ абстракцію та додаток. Вираз
(λid . id id)(λx.x)
не тип-чека, тому що в першому Л абстракції id
повинні бути присвоєно мономорфіческім типом id : σ
для деяких а, і немає σ такого , що ми могли б застосувати id : σ
до id : σ
.
Ви можете спробувати це самостійно в Haskell. Під час let id = \x -> x in id id :: t -> t
перевірки типу введення тексту (\id -> id id)(\x -> x)
не вдається
Зустрічається перевірка: не може побудувати нескінченний тип:
t0 = t0 -> t0
У першому аргументіid
, а самеid
у виразі:id id
у виразі:\id -> id id
a[i]
Позначення C - синтаксичний цукор для *(a + i)
. Стаття у Вікіпедії також має приємне пояснення.
let
з вступом '
let
запроваджено, оскільки питання починається з того, що я цікавився походженням "хай" ...
Lisp - найдавніша з них, яка має LET зараз . Але BASIC був першим, хто отримав це, оскільки Лісп отримав його набагато пізніше.
У аналітичному двигуні Ada Lovelace (1843) - немає LET, програма виглядає так:
N0 6 N1 1 N2 1 × L1 L0 S1 L0 L2 S0 L2 L0 CB?11 '
У Планкалкюль-Зузе (1943-45) програма виглядає так:
P1 max3 (V0[:8.0],V1[:8.0],V2[:8.0]) → R0[:8.0]
max(V0[:8.0],V1[:8.0]) → Z1[:8.0]
max(Z1[:8.0],V2[:8.0]) → R0[:8.0]
END
Короткий кодекс був запропонований Джоном Мохлі в 1949 році
X3 = ( X1 + Y1 ) / X1 * Y1
Проміжна ПЛ Беркса, 1950, використана для призначення ->
Рутисхаузер у 1952 р. Використовував =>=
Компілятор Böhms, 1952, б / в ->
У Манчестерському університеті Алік Гленні розвивався Autocode
на початку 1950-х. Перший код і компілятор був розроблений в 1952 році для комп'ютера Марк 1 в Манчестерському університеті і вважається першою складеною мовою програмування високого рівня. Знову ->
для призначення
Чарльз Адамс, FORTRAN 0 з групи Бекуса, Автокод Брукера 2, ПП1 Любимського та Камініна; все в 1954 р., знову=
BACAIC (Гремс, Портер), 1954 р., *
Для завдання!
Компілер, ADES, 1955 р., =
IT, 1956, <-
ФОРТРАН, 1957 р., =
AT-3 (1956), Math-Matic (1957), знову =
,
але Flow-Matic у 1957 р. мав два завдання, і обидва слова
TRANSFER a TO b
і MOVE a TO b
Машина Бауера та Самельсона, 1957 р .: =>
На жаль, я не можу охопити всі мови між 1957 і 1964 роками, але більші мови
1957 - COMTRAN (forerunner to COBOL)
1958 - LISP
1958 - ALGOL 58
1959 - FACT (forerunner to COBOL)
1959 - COBOL
1959 - RPG
1962 - APL
1962 - Simula
1962 - SNOBOL
1963 - CPL (forerunner to C)
не LET для призначення. Або не було , у випадку LISP.
Dartmouth BASIC - це оригінальна версія мови програмування BASIC. Перша інтерактивна версія була доступна загальним користувачам у червні 1964 року ;
LET / = — assign formula results to a variable
Ну, між цими трьома, Лісп, безумовно, був першим. Haskell з'явився в 80-х, а Clojure в 00-х, і let
був довгий час до будь-якої з цих дат. :-)
Що стосується Лисп мову вигадали це, я не можу поручитися за це, але я буду робити деякі дослідження і подивитися. :-)
Оновлення: Згідно з Evolution of Lisp (див. Стор. 46), вона згадувала, що let
була винайдена у 70-х роках:
LET
—Це сам макрос, що був вперше винайдений та заново створений на локальному рівні на кожному сайті - був пізнім відвідувачем світу MacLisp; Згідно з архівом Lisp, він був заднім числом поглинений у PDP-10 MacLisp від Lisp-Machine Lisp у 1979 році одночасноDEFMACRO
із складнимDEFUN
синтаксисом аргументів Lisp Machine .
Все ще не зовсім відповідає, чи був він винайдений іншою мовою раніше, звичайно, але все ж інша точка даних. :-)
Перший переглянутий звіт схеми AIM-452 від січня 1978 р LET
. Сторінка 9.
зауважимо, що Лісп раніше використовував іншу конструкцію PROG
для введення локальних змінних.
(let ((a 1)
(b 1))
(+ a b))
було б написано раніше приблизно так
(prog (a b)
(setq a 1)
(setq b 1)
(+ a b))
let
завжди лексично охоплювались у ліспських говірках?
let
це так само стара, як і лексичне обстеження (схема, 75 р.), і для отримання лексичного обстеження знадобилося певний час, щоб отримати визнання, тому я б здогадався, що перші екземпляри let
були в контексті динамічно оброблених Lisps. Сьогодні Emacs Lisp все ще має динамічну сферу застосування за замовчуванням, lambda
і let
(останній цукор для колишнього все одно) динамічно пов'язує свої параметри.