Мне было интересно узнать о происхождении «let», используемого в Lisp, Clojure и Haskell. Кто-нибудь знает, на каком языке он появился первым?
Мне было интересно узнать о происхождении «let», используемого в Lisp, Clojure и Haskell. Кто-нибудь знает, на каком языке он появился первым?
Ответы:
Что ж, BASIC имел LETназначение в качестве части синтаксиса с самого начала в 1964 году, так что это было бы до использования letв Лиспе, который, как указывает Крис Джестер-Янг, не появлялся до 1970-х годов, согласно Evolution of Lisp .
Я не верю, что COBOL, Fortran или ALGOL также имеют LETв своем синтаксисе. Так что я собираюсь пойти с Бейсиком.
letпо сути, это не лексически ограниченная привязка. Таким образом, правильным ответом будет что-то вроде «оно впервые появилось на английском языке до 12 века».
letв этом контексте ( letx 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(последний сахар для первого в любом случае) динамически связывает свои параметры.