Lisp, Clojure ve Haskell'de kullanılan "izin" in kökenlerini merak ediyordum. Önce hangi dilde göründüğünü bilen var mı?
Lisp, Clojure ve Haskell'de kullanılan "izin" in kökenlerini merak ediyordum. Önce hangi dilde göründüğünü bilen var mı?
Yanıtlar:
Eh, TEMEL vardı LET
o kullanımını öncesine ait diye, 1964 yılında baştan sözdizimi bir parçası olarak atama için let
Chris Jester-Young işaret ettiği gibi uygun 1970'lere kadar ortaya çıkmadı ki, Lisp'te Lisp Evrimi .
COBOL, Fortran veya ALGOL'ün de LET
sözdiziminde olduğuna inanmıyorum . Bu yüzden BASIC ile gideceğim.
let
temelde sözcüksel olarak kapsamalı bir bağlanma değil. Dolayısıyla, doğru cevap "ilk olarak 12. yüzyıldan önce İngilizce olarak göründü" gibi bir şey olurdu.
let
Bu bağlamda ( let
x is
şey in
o programlama içine geldiği ilk İngilizce olarak matematiksel metinlerde ortaya şu ifade) ve burası. Biçimsel sistemler arasında bir fark görmüyorum - matematiksel diller, programlama dilleri, başka herhangi bir şey - hepsi aynı.
equals
istemedim is
. Ve evet, sözde kod, şu ana kadarki en iyi cevap.
Teorik bir bakış açısı eklemek isterim: Klasik lambda calculi'de let
sadece sözdizimsel bir şekerdir. Örneğin
let x = N in M
olduğu gibi yeniden yazılabilir
(λx.M)N
Bu yüzden erken (işlevsel) dillerdeki ilk görünümü o kadar ilginç değil.
Bununla birlikte, Hindley-Milner tipi sistemin icadı ve onun tip çıkarım algoritması ile çok önemli hale geldi . Bu tip sistemde let
vazgeçilmezdir, çünkü polimorfiktir (HM'deki ab-soyutlamanın aksine). Örneğin, bu basit ifadeyi göz önünde bulundurun:
let id = λx . x in id id
İşte id
polimorfik, türüne sahip ∀α.α → α
ve bu nedenle id id
tür denetimleri - türü id id : τ → τ
keyfi τ içindir. (İlk için id
biz assign τ → τ
etmek α
, ikincisi için id
biz assign τ
için α
.)
Ancak λ soyutlama ve uygulama kullanarak tekrar yazamayız. ifade
(λid . id id)(λx.x)
tip-çek vermez, çünkü ilk λ soyutlama içinde id
bir monomorfik türü atanmalıdır id : σ
bazı σ için ve biz geçerli olabilir böyle hiçbir σ yoktur id : σ
için id : σ
.
Bunu Haskell'de deneyebilirsiniz. let id = \x -> x in id id :: t -> t
Yazma kontrolleri yaparken , yazarken (\id -> id id)(\x -> x)
başarısız
Kontrol oluşur: sonsuz türünü oluşturamaz:
t0 = t0 -> t0
İlk argümandaid
, yaniid
ifadede:id id
İfadesinde:\id -> id id
a[i]
gösterimi, sözdizimsel şekerdir *(a + i)
. Wikipedia makalesinin de güzel bir açıklaması var.
let
bireyin tanıtım
let
sorusu başlar başlamaz, tanıtılan ile ... Ben "let" nin kökeni hakkında merak
Lisp, şimdi LET'e sahip olanların en eski dilidir . Fakat bunu ilk yapan BASIC oldu, çünkü Lisp daha sonra elde etti.
Ada Lovelace Analitik Motorunda (1843) - LET yok, bir program şöyle görünür:
N0 6 N1 1 N2 1 × L1 L0 S1 L0 L2 S0 L2 L0 CB?11 '
Zuse Plankalkül'de (1943-45) program şöyle görünür:
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
Kısa Kod, 1949'da John Mauchly tarafından önerildi.
X3 = ( X1 + Y1 ) / X1 * Y1
Intermediate PL of Burks, 1950, ödev için kullanılır. ->
1952'de Rutishauser kullanılmış =>=
Böhms derleyicisi, 1952, kullanılmış ->
Manchester Üniversitesi'nde Alick Glennie Autocode
, 1950'lerin başında gelişti . İlk kod ve derleyici, 1952'de Manchester Üniversitesi'ndeki Mark 1 bilgisayarı için geliştirildi ve ilk derlenmiş yüksek seviye programlama dili olarak kabul edildi. Yine, ->
ödev için
Backus grubunun FORTRAN 0'ından Charles Adams, Brooker's Autocode 2, Lubimsky ve Kamynin'den ПП1; hepsi 1954’te tekrar=
BACAIC (Grems, Porter), 1954, *
ödev için!
Kompiler, ADES, 1955, =
Bilişim, 1956, <-
FORTRAN, 1957, =
AT-3 (1956), Math-Matic (1957), yine =
,
ancak 1957’deki Flow-Matic’in iki görevi vardı ve her ikisi de kelimelerdeydi
TRANSFER a TO b
ve MOVE a TO b
Bauer ve Samelson'ın makinesi, 1957: =>
Maalesef 1957 ve 1964 arasındaki tüm dilleri kapsayamıyorum, ancak daha büyük dilleri
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)
atamak için LET almamış. LISP durumunda da yoktu .
Dartmouth BASIC , BASIC programlama dilinin orijinal sürümüdür. İlk interaktif versiyon Haziran 1964’te genel kullanıcılara sunuldu ;
LET / = — assign formula results to a variable
Eh, bu üç arasında, Lisp kesinlikle önce sahipti. Haskell 80'lerde, Clojure 00'larda ortaya çıktı ve bu tarihlerden herhangi birinden çok önce let
vardı . :-)
Lisp'in onu icat eden dil olup olmadığına gelince, bunun için henüz kefil olamıyorum ama biraz araştırma yapacağım ve göreceğim. :-)
Güncelleme: Lisp'in Evrimine göre (bkz. Sayfa 46), let
70'lerde icat edildiğinden bahsetti :
LET
- önce her sitede yerel olarak icat edilen ve yeniden icat eden bir makro - MacLisp dünyasının son zamanlarıydı; Lisp Arşivi'ne göre, 1979'da Lisp-Machine Lisp'ten PDP-10 MacLisp'eDEFMACRO
ve karmaşık Lisp MachineDEFUN
argüman sözdizimi ile aynı anda geriye dönük olarak absorbe edildi .
Elbette daha önce başka bir dilde icat edilip edilmediğine henüz cevap vermedi elbette, ama yine de başka bir veri noktası. :-)
İlk Revize Edilmiş Şema raporu Ocak 1978'den AIM-452'ye sahiptir LET
. Sayfa 9.
Lisp'in daha önce PROG
yerel değişkenleri tanıtmak için farklı bir yapı kullandığını unutmayın .
(let ((a 1)
(b 1))
(+ a b))
yaklaşık olarak önceden yazılmış
(prog (a b)
(setq a 1)
(setq b 1)
(+ a b))
let
hep lexically Lisp lehçelerinde kapsamlı?
let
sözcüksel kapsamlaştırma kadar eski (Scheme, '75) ve sözcüksel kapsamlamanın kabul görmesi biraz zaman aldı, bu yüzden ilk örneklerinin let
dinamik olarak kapsamda olan Lisps bağlamında olduğunu tahmin ediyorum. Bugün, Emacs Lisp hala varsayılan olarak dinamik kapsamını sahiptir lambda
ve let
dinamik parametrelerini bağlayıcı (eski için yine de ikinci şeker).