Saya bertanya-tanya tentang asal-usul "biarkan" yang digunakan dalam Lisp, Clojure, dan Haskell. Adakah yang tahu bahasa mana yang pertama kali muncul?
Saya bertanya-tanya tentang asal-usul "biarkan" yang digunakan dalam Lisp, Clojure, dan Haskell. Adakah yang tahu bahasa mana yang pertama kali muncul?
Jawaban:
Nah, BASIC memiliki LET
tugas sebagai bagian dari sintaks sejak awal tahun 1964, sehingga akan mendahului penggunaan let
dalam Lisp, yang seperti yang ditunjukkan Chris Jester-Young tidak muncul sampai tahun 1970-an menurut Evolution of Lisp .
Saya tidak percaya COBOL, Fortran, atau ALGOL memiliki LET
sintaks mereka juga. Jadi saya akan pergi dengan BASIC.
let
pada dasarnya tidak mengikat secara leksikal. Jadi, jawaban yang benar adalah "pertama kali muncul dalam bahasa Inggris, sebelum abad ke-12".
let
dalam konteks ini ( let
x is
sesuatu in
ungkapan berikut) pertama kali muncul dalam teks matematika dalam bahasa Inggris, dan ini adalah tempat pemrograman. Saya tidak melihat perbedaan antara sistem formal - bahasa matematika, bahasa pemrograman, apa pun yang lain - semuanya sama.
equals
, tidak is
. Dan, ya, kode semu adalah jawaban terbaik sejauh ini.
Saya ingin menambahkan sudut pandang teoretis: Dalam kalkulus lambda klasik, let
hanyalah gula sintaksis. Sebagai contoh
let x = N in M
dapat ditulis ulang hanya sebagai
(λx.M)N
Jadi penampilan pertamanya dalam bahasa-bahasa awal (fungsional) tidak begitu menarik.
Namun, menjadi sangat penting dengan penemuan sistem tipe Hindley-Milner dan algoritme inferensi tipenya. Dalam sistem jenis let
ini sangat diperlukan, karena itu polimorfik (tidak seperti λ-abstraksi di HM). Misalnya, perhatikan ungkapan sederhana ini:
let id = λx . x in id id
Berikut id
adalah polimorfik, ia memiliki tipe ∀α.α → α
, dan karenanya id id
tipe-cek - tipenya adalah id id : τ → τ
untuk τ acak. (Untuk yang pertama id
kami tetapkan τ → τ
untuk α
dan untuk yang kedua id
kami tetapkan τ
untuk α
.)
Namun, kami tidak dapat menulis ulang menggunakan abstraksi λ dan aplikasi. Ekspresi
(λid . id id)(λx.x)
tidak mengetik-cek, karena dalam abstraksi λ pertama id
harus ditugaskan jenis monomorfik id : σ
untuk beberapa σ, dan tidak ada σ sehingga kita bisa berlaku id : σ
untuk id : σ
.
Anda dapat mencobanya sendiri di Haskell. Saat let id = \x -> x in id id :: t -> t
mengetik-cek, pengetikan (\id -> id id)(\x -> x)
gagal dengan
Terjadi cek: tidak dapat membangun tipe infinite:
t0 = t0 -> t0
Pada argumen pertamaid
, yaituid
Dalam ekspresi:id id
Dalam ekspresi:\id -> id id
a[i]
Notasi C adalah gula sintaksis untuk *(a + i)
. Artikel Wikipedia juga memiliki penjelasan yang bagus.
let
perkenalan
let
diperkenalkan, sebagai pertanyaan dimulai dengan aku bertanya-tanya tentang asal-usul dari "membiarkan" ...
Lisp adalah bahasa tertua yang memiliki LET sekarang . Tetapi BASIC adalah yang pertama mendapatkannya, karena Lisp telah mendapatkannya jauh kemudian.
Dalam Ada Lovelace Analytical Engine (1843) - no LET, sebuah program terlihat seperti:
N0 6 N1 1 N2 1 × L1 L0 S1 L0 L2 S0 L2 L0 CB?11 '
Dalam Plankalkül of Zuse (1943-45) program tersebut terlihat:
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
Kode Pendek diusulkan oleh John Mauchly pada tahun 1949
X3 = ( X1 + Y1 ) / X1 * Y1
PL Menengah Burks, 1950, digunakan untuk penugasan ->
Rutishauser pada tahun 1952 digunakan =>=
Böhms compiler, 1952, digunakan ->
Di Universitas Manchester, Alick Glennie berkembang Autocode
pada awal 1950-an. Kode dan kompiler pertama dikembangkan pada tahun 1952 untuk komputer Mark 1 di Universitas Manchester dan dianggap sebagai bahasa pemrograman tingkat tinggi pertama yang dikompilasi. Sekali lagi, ->
untuk penugasan
Charles Adams, FORTRAN 0 dari grup Backus, Brooker's Autocode 2, ПП1 dari Lubimsky dan Kamynin; semua pada tahun 1954, lagi=
BACAIC (Grems, Porter), 1954, *
untuk penugasan!
Kompiler, ADES, 1955, =
ITU, 1956, <-
FORTRAN, 1957, =
AT-3 (1956), Math-Matic (1957), sekali lagi =
,
tetapi Flow-Matic pada tahun 1957 memiliki dua tugas, dan keduanya dalam kata-kata
TRANSFER a TO b
dan MOVE a TO b
Mesin Bauer dan Samelson, 1957: =>
Maaf, saya tidak bisa mencakup semua bahasa antara tahun 1957 dan 1964, tetapi bahasa yang lebih besar
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)
belum BIARKAN untuk tugas. Atau tidak , dalam kasus LISP.
Dartmouth BASIC adalah versi asli dari bahasa pemrograman BASIC. Versi interaktif pertama dibuat tersedia untuk pengguna umum pada bulan Juni 1964 ;
LET / = — assign formula results to a variable
Nah, di antara mereka bertiga, Lisp pasti yang pertama. Haskell muncul sekitar tahun 80-an, dan Clojure pada tahun 00-an, dan let
telah ada jauh sebelum tanggal-tanggal tersebut. :-)
Seperti apakah Lisp adalah yang bahasa telah menemukan itu, aku tidak bisa menjamin untuk itu, tapi saya akan melakukan penelitian dan melihat. :-)
Pembaruan: Menurut Evolusi Lisp (lihat halaman 46), disebutkan bahwa let
ditemukan pada tahun 70-an:
LET
—Diri makro yang pertama kali ditemukan dan diciptakan kembali secara lokal di setiap situs — adalah pendatang baru ke dunia MacLisp; menurut Lisp Archive, ia diserap secara surut ke dalam PDP-10 MacLisp dari Lisp-Machine Lisp pada 1979 bersamaan dengan sintaksis argumenDEFMACRO
Lisp Machine yang kompleksDEFUN
.
Masih tidak cukup menjawab apakah itu ditemukan dalam bahasa lain sebelumnya, tentu saja, tetapi masih merupakan data lain. :-)
Laporan Skema Revisi pertama AIM-452 dari Januari 1978 LET
. Halaman 9.
perhatikan bahwa Lisp sebelumnya menggunakan konstruk yang berbeda PROG
untuk memperkenalkan variabel lokal.
(let ((a 1)
(b 1))
(+ a b))
akan ditulis lebih awal sebagai
(prog (a b)
(setq a 1)
(setq b 1)
(+ a b))
let
selalu leksikal scoped dalam dialek Lisp?
let
sudah setua leksikal pelingkupan (Skema, '75), dan butuh beberapa saat untuk pelingkupan leksikal untuk mendapatkan penerimaan, jadi saya kira contoh pertama let
dalam konteks Lisps yang dicakup secara dinamis. Hari ini, Emacs Lisp masih memiliki ruang lingkup dinamis secara default, dengan lambda
dan let
(gula terakhir untuk yang sebelumnya) mengikat parameter mereka secara dinamis.