Emacs dla apply-partially
to:Jak działa definicja "apply-partial" w Emacs 24?
(defun apply-partially (fun &rest args)
"Return a function that is a partial application of FUN to ARGS.
ARGS is a list of the first N arguments to pass to FUN.
The result is a new function which does the same as FUN, except that
the first N arguments are fixed at the values with which this function
was called."
`(closure (t) (&rest args)
(apply ',fun ,@(mapcar (lambda (arg) `',arg) args) args)))
To zwraca listę, która wygląda trochę jak wyrażenia lambda, oprócz tego, że lambda
zastępuje closure (t)
. Na przykład, (apply-partially 'cons 1)
powraca w ten sposób:
(closure (t) (&rest args) (apply (quote cons) (quote 1) args))
który, o ile wiem, wygląda i działa dokładnie tak:
(lambda (&rest args) (apply (quote cons) (quote 1) args))
wyjątkiem tego, że „zamknięcie” wyrażenie nie ma „ja -quoting "właściwość lambda, więc kiedy próbuję to ocenić, Emacs informuje mnie, że closure
nie ma definicji funkcji: Lisp error: (void-function closure)
.
Nie mogę znaleźć żadnych odniesień w podręczniku Elisp do korzystania z symbolu closure
w ten sposób. Wydaje się, że jest to jakaś wewnętrzna magia Emacsa. Wyrażenie zamknięcia wyraźnie nie jest oceniane zgodnie z normalnymi regułami (ponieważ ręczne wykonanie powoduje błąd).
Co tu się dzieje? Czy muszę pobrać kod C w celu uzyskania odnośników do "zamknięcia", aby się dowiedzieć?
EDYCJA: Wydaje się, że w Emacs 23 i poniżej, apply-partially
po prostu używa lexical-let
z pakietu cl, aby dokonać zamknięcia. Powyższa definicja pochodzi z wersji "24.0.90.1".
Racja, w przypadku stosowania-częściowo, środowisko leksykalne jest puste, ale wciąż jest jedna różnica: argument "args" będzie leksykalny, podczas gdy z 'lambda' będzie dynamicznie związany. Zapewnia to, że nazwa 'args' nie będzie zakłócać innych zastosowań tej zmiennej w innym miejscu. – Stefan
Jeśli chodzi o brak cytatów, to nie jest to naprawdę niedopatrzenie, po prostu nie jest potrzebne: '(zamknięcie ...)' nigdy nie powinno występować w kodzie źródłowym. – Stefan