Мне было интересно узнать о происхождении «let», используемого в Lisp, Clojure и Haskell. Кто-нибудь знает, на каком языке он появился первым?
Мне было интересно узнать о происхождении «let», используемого в Lisp, Clojure и Haskell. Кто-нибудь знает, на каком языке он появился первым?
Ответы:
Что ж, BASIC имел LET
назначение в качестве части синтаксиса с самого начала в 1964 году, так что это было бы до использования let
в Лиспе, который, как указывает Крис Джестер-Янг, не появлялся до 1970-х годов, согласно Evolution of Lisp .
Я не верю, что COBOL, Fortran или ALGOL также имеют LET
в своем синтаксисе. Так что я собираюсь пойти с Бейсиком.
let
по сути, это не лексически ограниченная привязка. Таким образом, правильным ответом будет что-то вроде «оно впервые появилось на английском языке до 12 века».
let
в этом контексте ( let
x 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 : σ
.
Вы можете попробовать это сами в Хаскеле. Во время 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]
Обозначение Си является синтаксическим сахаром для *(a + i)
. Статья в Википедии также имеет хорошее объяснение.
let
с введением в России
let
введен, так как вопрос начинается с того, что мне было интересно
Лисп является самым старым языком этих Выпустив в настоящее время . Но Бейсик был первым, кто получил его, потому что Лисп получил его намного позже.
В 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
Ну, между этими тремя Лисп определенно имел это первым. 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 .
Конечно, до сих пор не совсем понятно, было ли оно изобретено ранее на другом языке, но это еще одна точка данных. :-)
Первый пересмотренный отчет об отчете 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
всегда лексически ограничен в диалектах Лисп?
let
, примерно так же стар, как лексическая область видимости (Scheme, '75), и потребовалось некоторое время, чтобы лексическая область видимости получила признание, поэтому я предполагаю, что первые экземпляры let
были в контексте динамически ограниченного Лиспа. На сегодняшний день Emacs Lisp по-прежнему имеет динамическую область видимости по умолчанию, lambda
и and let
(последний сахар для первого в любом случае) динамически связывает свои параметры.