На каком языке программирования впервые появилось слово «let»?

24

Мне было интересно узнать о происхождении «let», используемого в Lisp, Clojure и Haskell. Кто-нибудь знает, на каком языке он появился первым?

carinmeier
источник
Ассемблер использует MOV вместо LET с 1954 года. Разве этого недостаточно?
Гангнус
1
LISP достаточно взрослый, чтобы быть хорошим кандидатом.
Мувисиэль
2
на любой вопрос «На каком языке программирования впервые появился Х», Lisp - довольно удачное предположение для правильного ответа
Захари К
2
пусть происхождение от математики, а не от других языков программирования.
Питер Б
Вы делаете неверное предположение, что первое использование «let» в языке программирования является источником «let» -use в Lisp, Clojure и Haskell.
Питер Б

Ответы:

41

Что ж, BASIC имел LETназначение в качестве части синтаксиса с самого начала в 1964 году, так что это было бы до использования letв Лиспе, который, как указывает Крис Джестер-Янг, не появлялся до 1970-х годов, согласно Evolution of Lisp .

Я не верю, что COBOL, Fortran или ALGOL также имеют LETв своем синтаксисе. Так что я собираюсь пойти с Бейсиком.

Greg
источник
11
Но семантика очень разная - letпо сути, это не лексически ограниченная привязка. Таким образом, правильным ответом будет что-то вроде «оно впервые появилось на английском языке до 12 века».
SK-logic
12
Но возникает вопрос: на каком языке программирования впервые появилось слово «let»? Я не считаю английский язык программирования (по крайней мере, в этом контексте).
Грег
7
letв этом контексте ( letx isчто- inто следующее выражение) впервые появилось в математических текстах на английском языке, и именно здесь оно пришло в программирование. Я не вижу разницы между формальными системами - математическими языками, языками программирования, чем угодно - все они одинаковы.
SK-logic
3
«пусть х 3» не является правильной грамматикой. Вы никогда не увидите этого ни в одном учебнике на английском языке. У вас неправильное время от глагола "быть". Это должно быть «пусть х будет 3» или «пусть х будет равно 3». Так или иначе, семантика или нет, автор вопроса задавал вопрос о языке программирования. Так что, если вы не знаете компьютер, который использует инструкции на английском языке, предшествующий бейсику, я не куплю его. В противном случае мы могли бы просто ответить на «псевдо-код», и это было бы правильно, но не удовлетворило бы дух ее вопроса.
Грег
1
конечно, я использовал обозначение ML, и я имел в виду equals, нет is. И да, псевдокод - лучший ответ на данный момент.
SK-logic
30

Я хотел бы добавить теоретическую точку зрения: в классическом лямбда-исчислении 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 : σ.

Вы можете попробовать это сами в Хаскеле. Во время let id = \x -> x in id id :: t -> tпроверки типа ввод (\id -> id id)(\x -> x)не выполняется с

Происходит проверка: невозможно создать бесконечный тип: t0 = t0 -> t0
в первом аргументе id, а именно id
в выражении: id id
в выражении:\id -> id id

Петр Пудлак
источник
+1 за очень интересный ответ. В качестве дополнительной темы, если вы ее знаете, не могли бы вы опубликовать (в комментарии, поскольку это не связано с основным вопросом) ссылку на строгое определение «синтаксического сахара».
Джорджио
3
@Giorgio Процитировать словарь «Новый хакер» : функции, добавленные к языку или другому формализму, чтобы сделать его «более сладким» для людей, функции, которые не влияют на выразительность формализма. Используется ESP. когда есть очевидный и тривиальный перевод «сахарного» признака в другие конструкции, уже присутствующие в обозначениях. a[i]Обозначение Си является синтаксическим сахаром для *(a + i). Статья в Википедии также имеет хорошее объяснение.
Петр Пудлак
3
интересные вещи, но вряд ли связанные letс введением в России
wirrbel
2
Это хорошо написанный ответ, но он не отвечает на первоначальный вопрос.
Йохан Карлссон
1
@JohanKarlsson Я не утверждаю, что это прямой ответ, но я думаю, что это также относится к теме. В частности, почему был letвведен, так как вопрос начинается с того, что мне было интересно
узнать
22

Лисп является самым старым языком этих Выпустив в настоящее время . Но Бейсик был первым, кто получил его, потому что Лисп получил его намного позже.

В Ada Lovelace Analytical Engine (1843) - нет LET, программа выглядит так:

N0 6 N1 1 N2 1 × L1 L0 S1  L0 L2 S0 L2 L0 CB?11 '

В Plankalkül of Zuse (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 compiler, 1952, используется ->

В Манчестерском университете Алик Гленни развивался Autocodeв начале 1950-х годов. Первый код и компилятор был разработан в 1952 году для компьютера Mark 1 в Университете Манчестера и считается первым скомпилированным языком программирования высокого уровня. Опять же ->для назначения

Чарльз Адамс, FORTRAN 0 группы Бакуса, Autocode 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)

не давай для назначения. Или нет , в случае LISP.


Dartmouth BASIC - оригинальная версия языка программирования BASIC. Первая интерактивная версия была доступна для обычных пользователей в июне 1964 года ;

 LET / = — assign formula results to a variable
Гангнус
источник
14

Ну, между этими тремя Лисп определенно имел это первым. Haskell появился в 80-х, а Clojure - в 00-х, и letсуществовал задолго до любой из этих дат. :-)

Что касается ли Лисп язык выдумали это, я не могу поручиться за это, но я буду делать некоторые исследования и посмотреть. :-)

Обновление: Согласно Evolution of Lisp (см. Стр. 46), упоминалось, что оно letбыло изобретено в 70-х годах:

LET- сам макрос, впервые изобретенный и заново изобретенный локально на каждом сайте, - опоздал в мир MacLisp; Согласно Lisp Archive, он был задним числом поглощен в PDP-10 MacLisp из Lisp-Machine Lisp в 1979 году одновременно DEFMACROсо сложным DEFUNсинтаксисом аргументов Lisp Machine .

Конечно, до сих пор не совсем понятно, было ли оно изобретено ранее на другом языке, но это еще одна точка данных. :-)

Крис Шут-Янг
источник
4
ML был также разработан в 70-х годах, так что, возможно, идея была внедрена в ML и Lisp в этот период.
Джорджио
9

Первый пересмотренный отчет об отчете AIM-452 от января 1978 года LET. Страница 9.

обратите внимание, что Lisp ранее использовал другую конструкцию PROGдля представления локальных переменных.

(let ((a 1)
      (b 1))
  (+ a b))

было бы написано ранее примерно как

(prog (a b)
  (setq a 1)
  (setq b 1)
  (+ a b))
Райнер Йосвиг
источник
был letвсегда лексически ограничен в диалектах Лисп?
wirrbel
1
AIM-452 - это первый пересмотренный отчет по схеме. Первый отчет - AIM-349 от 1975 года. А AIM-848 - это пересмотренный пересмотренный отчет. А тот, который после этого назывался «пересмотренный отчет ^ 3» (т. Е. Первый, который использовал именование «R ^ nRS»), был первым, который был не AIM, а реальной спецификацией языка. Погуглив немного, вы найдете PDF-файлы всех этих документов, чтобы вы могли прочитать их сами. Если вы хотите пойти еще дальше, вы можете найти старое руководство по MacLisp в Software Preservation Group, и, возможно, вы сможете найти и некоторые отчеты LISP 1.5.
TaylanUB
@wirrbel, кажется let, примерно так же стар, как лексическая область видимости (Scheme, '75), и потребовалось некоторое время, чтобы лексическая область видимости получила признание, поэтому я предполагаю, что первые экземпляры letбыли в контексте динамически ограниченного Лиспа. На сегодняшний день Emacs Lisp по-прежнему имеет динамическую область видимости по умолчанию, lambdaи and let(последний сахар для первого в любом случае) динамически связывает свои параметры.
TaylanUB