In quale linguaggio di programmazione è apparso prima "let"?


24

Mi chiedevo quali fossero le origini del "let" utilizzato in Lisp, Clojure e Haskell. Qualcuno sa in quale lingua è apparso per primo?


L'assemblatore usa MOV invece di LET del 1954. Non è abbastanza?
Gangnus,

1
LISP è abbastanza grande per essere un buon candidato.
mouviciel,

2
per qualsiasi domanda "In quale linguaggio di programmazione è apparso X per la prima volta" lisp è una supposizione abbastanza buona per una risposta corretta
Zachary K

2
lascia che le origini provengano dalla matematica, non da altri linguaggi di programmazione.
Pieter B,

Si assume erroneamente che il primo utilizzo di "let" in una lingua di programmazione sia l'origine di "let" in Lisp, Clojure e Haskell.
Pieter B,

Risposte:


41

Bene, BASIC aveva LETper incarico come parte della sintassi fin dall'inizio nel 1964, quindi questo avrebbe preceduto l'uso di letLisp, 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 LETnella loro sintassi. Quindi vado con BASIC.


11
Ma la semantica è molto diversa - letin 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".
SK-logic

12
Ma la domanda è: quale linguaggio di programmazione è apparso per la prima volta? Non considero davvero l'inglese un linguaggio di programmazione (almeno in questo contesto).
Greg

7
letin questo contesto ( letx isqualcosa inla 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.
SK-logic

3
"let x is 3" non è una grammatica adeguata. Non lo vedresti mai in nessun libro di testo inglese. Hai il tempo sbagliato del verbo "essere". Dovrebbe essere "let x be 3" o "let x equal 3". Ad ogni modo, semantica o no, l'autore della domanda stava chiedendo un linguaggio di programmazione. Quindi, a meno che tu non conosca un computer che accetta istruzioni in inglese precedenti a BASIC, non lo sto comprando. Altrimenti, avremmo potuto semplicemente rispondere a "psuedo-code" e questo sarebbe valido, ma non onorerebbe lo spirito della sua domanda.
Greg,

1
ovviamente ho usato la notazione ML, e intendevo equalsno is. E sì, lo pseudo-codice è la risposta migliore finora.
SK-logic,

30

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 idcontrolli di tipo - il suo tipo è id id : τ → τper τ arbitrario. (Per il primo idassegniamo τ → τa αe per la seconda idassegniamo τ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 λ iddeve 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 -> ti 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 di id, ovvero id
nell'espressione: id id
nell'espressione:\id -> id id


+1 per una risposta molto interessante. Come argomento secondario, se ne conosci uno, potresti pubblicare (in un commento, poiché questo non è correlato alla domanda principale) un riferimento a una rigorosa definizione di "zucchero sintattico".
Giorgio,

3
@Giorgio Per citare il dizionario del nuovo hacker : funzionalità aggiunte a un linguaggio o altro formalismo per renderlo "più dolce" per l'uomo, caratteristiche che non influiscono sull'espressività del formalismo. Usato esp. quando esiste una traduzione ovvia e banale della caratteristica "zucchero" in altri costrutti già presenti nella notazione. La a[i]notazione di C è zucchero sintattico per *(a + i). L'articolo di Wikipedia ha anche una bella spiegazione.
Petr Pudlák,

3
cose interessanti ma difficilmente legate alla letpresentazione
wirrbel,

2
È una risposta ben scritta, ma non risponde alla domanda originale.
Johan Karlsson,

1
@JohanKarlsson Non sto affermando che si tratti di una risposta diretta, ma penso che questo sia rilevante anche per l'argomento. In particolare perché è stato letintrodotto, poiché la domanda inizia con me mi chiedevo quali fossero le origini del "let" ...
Petr Pudlák,

22

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ò Autocodenei 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

14

Bene, tra questi tre, Lisp lo ha sicuramente avuto per primo. Haskell nacque negli anni '80 e Clojure negli anni '00, ed letera 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 è letstato 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 contemporaneamente DEFMACROalla complessa DEFUNsintassi dell'argomento Lisp Machine .

Ovviamente non risponde del tutto se è stato inventato in un'altra lingua prima, ovviamente, ma è ancora un altro punto dati. :-)


4
La ML fu sviluppata anche negli anni '70, quindi potrebbe essere stata introdotta l'idea sia in ML che in Lisp in quel periodo.
Giorgio,

9

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 PROGper 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))

era letsempre con finalità lessicale nei dialetti di Lisp?
Wirrbel,

1
AIM-452 è il primo rapporto rivisto sullo schema. Il primo rapporto è AIM-349 del 1975. E AIM-848 è il rapporto rivisto rivisto. E quello successivo, chiamato il rapporto "rivisto ^ 3" (ovvero il primo ad usare il nome "R ^ nRS") fu il primo che non era un AIM ma una specifica del linguaggio. Cercando un po 'in giro troverai i PDF di tutti questi documenti in modo da poterli leggere da soli. Se vuoi tornare indietro puoi trovare un vecchio manuale MacLisp dal Software Preservation Group e forse sarai in grado di trovare anche alcuni rapporti LISP 1.5.
TaylanUB,

@wirrbel, sembra letessere 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 leterano nel contesto di Lisps con ambito dinamico. Oggi, Emacs Lisp ha ancora un ambito dinamico di default, con lambdae let(quest'ultimo zucchero per il primo comunque) che lega i loro parametri in modo dinamico.
TaylanUB,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.