TL; DR To nie jest tak proste, jak to ujęłeś. Składnia jest nieco bardziej odmienna i za każdym razem, gdy ktoś tworzy język, decyduje się na nową składnię, zwykle w celu uczynienia go bardziej zwięzłym, że poprzednie języki lub język ma projekt, który tego wymaga. Oczywiście to, co jest "lepsze", jest kwestią opinii.
W Schemacie (i Renie potomka) masz jedną przestrzeń nazw dla zmiennych i funkcji. W ten sposób używasz define
do wszystkiego.
(define variable 10)
(define function (lambda (arg1 arg2) body ...))
Teraz define
ma skrót dla tego ostatniego, który jest:
(define (function arg1 arg2) body ...)
więc regułą jest, jeśli pierwsza część jest pair?
to ma być rozszerzona do dłuższej formy z lambda
. To, jak przypuszczam, przypomina aplikację. Ta dodatkowa funkcja służy tylko do zapisywania niektórych klawiszy i jest często pomijana w takich książkach jak "Mały Schemat", ponieważ jest myląca, ponieważ ma dwie drogi, a osoba ucząca się i mogą myśleć, że zdefiniowanie wiązania dla funkcji jest bardziej wyjątkowe niż zdefiniowanie 10
, co jest niedorzeczne. Reszta argumentów zwykle się myli. na przykład. Są to te same:
(define (test . x) x)
(define test (lambda x x))
W Common Lisp masz dwie przestrzenie nazw, a więc defun
służy tylko do zasięgu globalnym i istnieją odpowiedniki funkcji zmiennych form sprawia, że funkcje. w defun
masz listę pierwszy argument w Common Lisp też, ale robi coś zupełnie innego:
(defun (setf name) (new-value)
body ...)
ten zapewnia sposób, aby uzyskać taką samą symetrię jak innych akcesorów w CL. na przykład. jeśli (car x)
otrzyma wartość samochodu od kantu (setf (car x) 10)
zmieni go. W moim przykładzie name
można używać w taki sam sposób, jak car
. Jest bardzo przydatny.
Clojure robi to z def
i fn
i wykorzystuje tablicę dla parametrów:
(def function (fn [arg1 agr2] body ...))
defn
jest tylko skróconą wersję podobnie jak define
zaczynającej się parą. To, że nie jest bardziej podobny do Schematu, jest być może faktem, że dane parametru są tablicą lub że składnia zachowała składnię jak najbliżej oryginału. Jeśli dobrze pamiętam, możesz mieć nazwę funkcji jako drugi argument z wartością fn
, co powoduje, że wyglądanie jest prawie identyczne.
myślę prawdziwa odpowiedź brzmi „Historia” : Schemat i jego warianty stanowiły jeden wybór, MACLISP i jego potomkowie byli kolejnymi. Jestem całkiem pewien, że inne wczesne Lispy, które nie mają żywych potomków, miały jeszcze inne składnie: zapomniałem, co zrobił InterLisp, ale prawdopodobnie było to coś dziwnego i innego. – tfb