Zastanawiałem się, skąd pochodzi słowo „let” używane w Lisp, Clojure i Haskell. Czy ktoś wie, w jakim języku się pojawił?
Zastanawiałem się, skąd pochodzi słowo „let” używane w Lisp, Clojure i Haskell. Czy ktoś wie, w jakim języku się pojawił?
Odpowiedzi:
Cóż, BASIC miał LET
do przydzielenia jako część składni od samego początku w 1964 roku, więc to byłoby wcześniejsze niż użycie let
w Lisp, które, jak podkreśla Chris Jester-Young, pojawiło się dopiero w 1970 roku, według Evolution of Lisp .
Nie wierzę też, że COBOL, Fortran lub ALGOL mają LET
swoją składnię. Więc idę z BASIC.
let
w zasadzie nie jest powiązaniem o zasięgu leksykalnym. Prawidłowa odpowiedź brzmiałaby więc tak: „po raz pierwszy pojawiła się w języku angielskim przed XII wiekiem”.
let
w tym kontekście ( let
x is
coś in
w poniższym wyrażeniu) po raz pierwszy pojawił się w tekstach matematycznych w języku angielskim i tutaj przyszedł do programowania. Nie widzę różnicy między systemami formalnymi - językami matematycznymi, językami programowania, czymkolwiek innym - wszystkie są takie same.
equals
, że nie is
. I tak, pseudo-kod jest jak dotąd najlepszą odpowiedzią.
Chciałbym dodać teoretyczny punkt widzenia: w klasycznych obliczeniach lambda let
jest po prostu cukrem syntaktycznym. Na przykład
let x = N in M
można przepisać po prostu jako
(λx.M)N
Więc jego pierwsze pojawienie się we wczesnych (funkcjonalnych) językach nie jest tak interesujące.
Jednak stało się to bardzo ważne wraz z wynalezieniem systemu typu Hindley-Milner i jego algorytmem wnioskowania typu. W tym typie system let
jest niezbędny, ponieważ jest polimorficzny (w przeciwieństwie do λ-abstrakcji w HM). Rozważmy na przykład to proste wyrażenie:
let id = λx . x in id id
Tutaj id
jest polimorficzny, ma typ ∀α.α → α
, a zatem id id
sprawdza typ - jest typem id id : τ → τ
dla dowolnego τ. (Na pierwszym id
przypisujemy τ → τ
do α
i dla drugiego id
przypiszemy τ
do α
).
Nie możemy go jednak przepisać przy użyciu abstrakcji i aplikacji λ. Wyrażenie
(λid . id id)(λx.x)
nie typ-czek, bo w pierwszym X abstrakcji id
musi być przypisany jednokształtnym rodzaj id : σ
jakiegoś Ď, a nie ma σ takie, że możemy zastosować id : σ
do id : σ
.
Możesz tego spróbować w Haskell. Podczas let id = \x -> x in id id :: t -> t
sprawdzania typu pisanie (\id -> id id)(\x -> x)
kończy się niepowodzeniem
Występuje sprawdzenie: nie można skonstruować typu nieskończonego:
t0 = t0 -> t0
W pierwszym argumencieid
, mianowicieid
W wyrażeniu:id id
W wyrażeniu:\id -> id id
a[i]
Notacja C to cukier syntaktyczny *(a + i)
. Artykuł w Wikipedii ma również dobre wyjaśnienie.
let
wprowadzeniem
let
wprowadzony, ponieważ pytanie zaczyna się od zastanawiania się nad początkami „let” ...
Lisp jest najstarszym językiem tych mającego LET teraz . Ale BASIC był pierwszym, który go otrzymał, ponieważ Lisp uzyskał go znacznie później.
W Ada Lovelace Analytical Engine (1843) - brak LET, program wygląda następująco:
N0 6 N1 1 N2 1 × L1 L0 S1 L0 L2 S0 L2 L0 CB?11 '
W Plankalkül of Zuse (1943-45) program wygląda następująco:
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
Krótki kod został zaproponowany przez Johna Mauchly'ego w 1949 roku
X3 = ( X1 + Y1 ) / X1 * Y1
Pośredni PL of Burks, 1950, wykorzystany do zadania ->
Używany Rutishauser w 1952 roku =>=
Używany kompilator Böhm, 1952 ->
Na uniwersytecie w Manchesterze Alick Glennie rozwinął się Autocode
na początku lat pięćdziesiątych. Pierwszy kod i kompilator został opracowany w 1952 roku dla komputera Mark 1 na University of Manchester i jest uważany za pierwszy skompilowany język programowania wysokiego poziomu. Ponownie, ->
do zadania
Charles Adams, FORTRAN 0 z grupy Backusa, Autokod 2 Brookera, ПП1 Lubimskiego i Kamynina; znowu w 1954 roku=
BACAIC (Grems, Porter), 1954, *
za zadanie!
Kompiler, ADES, 1955, =
IT, 1956, <-
FORTRAN, 1957 r., =
AT-3 (1956), Math-Matic (1957), ponownie =
,
ale Flow-Matic w 1957 r. miał dwa zadania i oba są słowne
TRANSFER a TO b
i MOVE a TO b
Maszyna Bauera i Samelsona, 1957: =>
Niestety, nie mogę objąć wszystkich języków między 1957 a 1964 rokiem, ale większych języków
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)
nie LET dla zadania. Lub nie , w przypadku LISP.
Dartmouth BASIC to oryginalna wersja języka programowania BASIC. Pierwsza interaktywna wersja została udostępniona ogólnym użytkownikom w czerwcu 1964 r . ;
LET / = — assign formula results to a variable
Pomiędzy tymi trzema Lisp zdecydowanie miał go pierwszy. Haskell powstał w latach osiemdziesiątych, a Clojure w latach dziewięćdziesiątych i let
był na długo przed którąkolwiek z tych dat. :-)
Czy Lisp był język wymyślili go, nie mogę ręczyć za to jeszcze, ale będę robić jakieś badania i zobaczymy. :-)
Aktualizacja: Według Evolution of Lisp (patrz strona 46) wspomniała, że let
została wynaleziona w latach 70-tych:
LET
- samo makro wymyślone i wymyślone lokalnie w każdym miejscu - spóźniło się ze światem MacLisp; Według Archiwum Lisp został on wstecznie zaabsorbowany do PDP-10 MacLisp z Lisp-Machine Lisp w 1979 roku w tym samym czasie coDEFMACRO
złożonaDEFUN
składnia argumentów Lisp Machine .
Nadal nie do końca odpowiada, czy został wcześniej wynaleziony w innym języku, ale wciąż inny punkt danych. :-)
Pierwszy raport zmienionego programu AIM-452 ze stycznia 1978 r LET
. Ma . Strona 9.
zauważ, że Lisp użył wcześniej innej konstrukcji PROG
do wprowadzenia zmiennych lokalnych.
(let ((a 1)
(b 1))
(+ a b))
zostałby napisany wcześniej mniej więcej jako
(prog (a b)
(setq a 1)
(setq b 1)
(+ a b))
let
zawsze był w zakresie dialektu Lisp w zakresie leksykalnym?
let
jest prawie tak stary, jak zakres leksykalny (Scheme, '75), i zajęło trochę czasu, zanim zakres zakresu leksykalnego zyskał akceptację, więc zgaduję, że pierwsze przypadki let
były w kontekście dynamicznie skalowanego Lispsa. Dzisiaj Emacs Lisp nadal ma domyślnie zakres dynamiczny, a lambda
i let
(ten drugi cukier dla tych pierwszych i tak) wiążą ich parametry dynamicznie.