Mi chiedevo quali fossero le origini del "let" utilizzato in Lisp, Clojure e Haskell. Qualcuno sa in quale lingua è apparso per primo?
Mi chiedevo quali fossero le origini del "let" utilizzato in Lisp, Clojure e Haskell. Qualcuno sa in quale lingua è apparso per primo?
Risposte:
Bene, BASIC aveva LET
per incarico come parte della sintassi fin dall'inizio nel 1964, quindi questo avrebbe preceduto l'uso di let
Lisp, che come sottolinea Chris Jester-Young non apparve fino agli anni '70 secondo Evolution of Lisp .
Non credo nemmeno che COBOL, Fortran o ALGOL abbiano LET
nella loro sintassi. Quindi vado con BASIC.
let
in base non è un'associazione con ambito lessicale. Quindi, la risposta corretta sarebbe qualcosa del tipo "apparve per la prima volta in inglese, prima del XII secolo".
let
in questo contesto ( let
x is
qualcosa in
la seguente espressione) è apparso per la prima volta in testi matematici in inglese, ed è qui che è entrato in programmazione. Non vedo alcuna differenza tra i sistemi formali - linguaggi matematici, linguaggi di programmazione, qualsiasi altra cosa - sono tutti uguali.
equals
no is
. E sì, lo pseudo-codice è la risposta migliore finora.
Vorrei aggiungere un punto di vista teorico: nei classici calcoli di lambda, let
è solo zucchero sintattico. Per esempio
let x = N in M
può essere riscritto semplicemente come
(λx.M)N
Quindi la sua prima apparizione nelle prime lingue (funzionali) non è poi così interessante.
Tuttavia, diventa molto importante con l'invenzione del sistema di tipo Hindley-Milner e il suo algoritmo di inferenza del tipo. In questo tipo di sistema let
è indispensabile, perché è polimorfico (a differenza dell'astrazione λ in HM). Ad esempio, considera questa semplice espressione:
let id = λx . x in id id
Qui id
è polimorfico, ha tipo ∀α.α → α
e quindi id id
controlli di tipo - il suo tipo è id id : τ → τ
per τ arbitrario. (Per il primo id
assegniamo τ → τ
a α
e per la seconda id
assegniamo τ
per α
.)
Tuttavia, non possiamo riscriverlo usando l'astrazione e l'applicazione λ. Espressione
(λid . id id)(λx.x)
non tipo-controllo, perché all'interno della prima astrazione λ id
deve essere assegnato un tipo monomorfica id : σ
per qualche σ, e non c'è σ tale che potremmo applicare id : σ
a id : σ
.
Puoi provarlo tu stesso in Haskell. Durante let id = \x -> x in id id :: t -> t
i controlli del tipo, la digitazione (\id -> id id)(\x -> x)
non riesce
Verifica occorrente: impossibile costruire il tipo infinito:
t0 = t0 -> t0
nel primo argomento diid
, ovveroid
nell'espressione:id id
nell'espressione:\id -> id id
a[i]
notazione di C è zucchero sintattico per *(a + i)
. L'articolo di Wikipedia ha anche una bella spiegazione.
let
presentazione
let
introdotto, poiché la domanda inizia con me mi chiedevo quali fossero le origini del "let" ...
Lisp è il linguaggio più antico di questi che hanno LET ora . Ma BASIC fu il primo ad ottenerlo, perché Lisp l'aveva ottenuto molto più tardi.
In Ada Lovelace Analytical Engine (1843) - nessuna LET, un programma si presenta come:
N0 6 N1 1 N2 1 × L1 L0 S1 L0 L2 S0 L2 L0 CB?11 '
Nel Plankalkül di Zuse (1943-45) il programma appare:
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
Il codice corto fu proposto da John Mauchly nel 1949
X3 = ( X1 + Y1 ) / X1 * Y1
PL intermedio di Burks, 1950, utilizzato per l'incarico ->
Rutishauser nel 1952 usato =>=
Compilatore Böhms, 1952, usato ->
All'università di Manchester, Alick Glennie si sviluppò Autocode
nei primi anni '50. Il primo codice e compilatore fu sviluppato nel 1952 per il computer Mark 1 all'Università di Manchester ed è considerato il primo linguaggio di programmazione ad alto livello compilato. Ancora una volta, ->
per incarico
Charles Adams, FORTRAN 0 del gruppo di Backus, Autocode 2 di Brooker, ПП1 di Lubimsky e Kamynin; tutto nel 1954, di nuovo=
BACAIC (Grems, Porter), 1954, *
per incarico!
Kompiler, ADES, 1955, =
IT, 1956, <-
FORTRAN, 1957, =
AT-3 (1956), Math-Matic (1957), di nuovo =
,
ma Flow-Matic nel 1957 aveva due incarichi, ed entrambi sono a parole
TRANSFER a TO b
e MOVE a TO b
La macchina di Bauer e Samelson, 1957: =>
Siamo spiacenti, non posso coprire tutte le lingue tra il 1957 e il 1964, ma lingue più grandi
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)
non LET per l'assegnazione. O no , nel caso di LISP.
Dartmouth BASIC è la versione originale del linguaggio di programmazione BASIC. La prima versione interattiva fu resa disponibile agli utenti generici nel giugno del 1964 ;
LET / = — assign formula results to a variable
Bene, tra questi tre, Lisp lo ha sicuramente avuto per primo. Haskell nacque negli anni '80 e Clojure negli anni '00, ed let
era stato in giro molto prima di una di quelle date. :-)
Se Lisp fosse la lingua per averlo inventato, non posso ancora garantirlo, ma farò qualche ricerca e vedrò. :-)
Aggiornamento: Secondo Evolution of Lisp (vedi pagina 46), ha affermato che è let
stato inventato negli anni '70:
LET
—Se una macro inventata e reinventata per la prima volta localmente in ogni sito — è stata una novità per il mondo MacLisp; secondo Lisp Archive, è stato assorbito retroattivamente in MacLisp PDP-10 da Lisp-Machine Lisp nel 1979 contemporaneamenteDEFMACRO
alla complessaDEFUN
sintassi dell'argomento Lisp Machine .
Ovviamente non risponde del tutto se è stato inventato in un'altra lingua prima, ovviamente, ma è ancora un altro punto dati. :-)
La prima relazione sullo schema rivisto AIM-452 del gennaio 1978 ha LET
. Pagina 9
si noti che Lisp ha usato in precedenza un costrutto diverso PROG
per introdurre variabili locali.
(let ((a 1)
(b 1))
(+ a b))
sarebbe stato scritto prima approssimativamente come
(prog (a b)
(setq a 1)
(setq b 1)
(+ a b))
let
sempre con finalità lessicale nei dialetti di Lisp?
let
essere vecchio quanto lo scoping lessicale (Scheme, '75), e ci è voluto un po 'prima che lo scoping lessicale ottenesse l'accettazione, quindi immagino che i primi esempi di let
erano nel contesto di Lisps con ambito dinamico. Oggi, Emacs Lisp ha ancora un ambito dinamico di default, con lambda
e let
(quest'ultimo zucchero per il primo comunque) che lega i loro parametri in modo dinamico.