P: Kiedy, jeśli w ogóle, użyteczne jest precyzyjne zacytowanie a lambda
, a kiedy, jeśli w ogóle, nie powinniśmy ostro zacytować a lambda
?
Ludzie używają lambda
s na trzy sposoby:
- Równina:
(lambda (x) x)
- zacytowany:
'(lambda (x) x)
- ostre cytaty:
#'(lambda (x) x)
Ten wątek SO omawia trzy typy, ten wątek SO wyjaśnia, dlaczego nie cytować (NB: nie ostre-cytowanie ) lambda
, a ten wątek SO omawia także różnice między cytowaniem a ostrym cytowaniem.
Teraz ręczny węzeł funkcji anonimowych i dokumentacja dla lambda
uwagi, że lambda
s są cytatami:
Wywołanie formularza
(lambda ARGS DOCSTRING INTERACTIVE BODY)
jest cytatem własnym; wynikiem oceny wyrażenia lambda jest samo wyrażenie. Wyrażenie lambda można następnie traktować jako funkcję ...
Tak więc wydaje się, że (lambda (x) x)
i #'(lambda (x) x)
są równoważne, ale '(lambda (x) x)
nie jest (co najważniejsze, gdy bajt kompilacji).
Wygląda na to, że rzadko chcą zacytowaćlambda
, ale to jest dla mnie jasne, kiedy, jeśli w ogóle, to powinien, czy nie powinien, ostrych cytat:
- Czy ostre cytowanie jest
lambda
po prostu stylistycznym wyborem, czy też są okoliczności, w których ostre cytowanie jest rzeczywiście przydatne? - Istnieją okoliczności, w których musimy nie ostrych zacytować
lambda
, to znaczy, gdy spowodowałoby to zmianę znaczenia kodu?
lambda
zostało ono zdefiniowane jako makro, które dodaje słowo „function
tak”, jak tylko mogłem. IOW, jeśli#'
był kiedyś potrzebny, był w bardzo wczesnym kodzie programistycznym. Z pewnością nie był już potrzebny w Emacs-18.Ponieważ
lambda
nie ma sensu, gdy nie jest cytowany, najnowsze wersje Emacsa Lispa śledzą (ANSI) Common Lisp w interpretacji nie cytowanej(lambda...)
jako#'(lambda...)
. Te dwa oznaczenia są prawie dokładnie równoważne (z wyjątkiem struktury cytowanej).Czy preferować,
(lambda...)
czy#'(lambda...)
też jest to wyłącznie kwestia stylu. Niektórzy wolą formę nagą, która unika szumu syntaktycznego, podczas gdy inni (w tym ja) wolą cytowaną formę.źródło
Dodanie odrobiny dodatkowej historii, ze względu na to, że Czy # '(lambda ...) jest dziedzictwem historycznym?
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=4290 sugeruje, że:
Nie wiem o kompilatorze bajtów, ale widzę, że przynajmniej w 1993 r.
lambda
Samo makro zwróciło(function (lambda ...))
formularz.https://www.iro.umontreal.ca/~monnier/hopl-4-emacs-lisp.pdf mówi również:
źródło
Po prostu chcę podać praktyczny przykład użycia zwrotnego wyrażenia lambda. Chodzi o powiązanie leksykalne / cieniowanie zmiennych, użycie zwrotnego wyrażenia lambda, a odwołanie do zmiennych przecinkiem umożliwia uzyskanie ich wartości globalnej.
M-x [RET] eval-buffer
wyprowadza „Losowo stary”M-x [RET] eval-buffer
wyprowadza „Losowo”Trzeci przykład łączenia zmiennej globalnej i zmiennej lokalnej zmiennej
M-x [RET] eval-buffer
wyprowadza „Random” „Random old”źródło