簡體   English   中英

如何在elisp表達式中傳遞運算符?

[英]How to pass operators in expressions in elisp?

我正在閱讀Lisp的根目錄 ,並遇到以下示例:

(
 (lambda (f) (f '(b c)))
 '(lambda (x) (cons 'a x)))

但是,如果我在Emacs對其進行了評估,

Symbol's function definition is void: f

如果我在https://repl.it/languages/scheme上嘗試,它使用Schema作為Lisp解釋器,我得到了

Error: ('lambda ('x) ('cons ('quote 'a) 'x)) is not a function [(anon), (anon)]

如果刪除第二個lambda表達式上的quote ,則此示例在repl.it上有效,但在Emacs上仍然出現相同的錯誤。

將函數f應用於'(bc)必須使用funcall完成。 因此,以下工作:

(
 (lambda (f) (funcall f '(b c)))
 '(lambda (x) (cons 'a x)))

並計算為(abc)

Paul Graham可能在他的文章中使用了lisp的某種變體,其中只有一個名稱空間用於函數名稱和數據變量( Lisp-1或Scheme模型),而Elisp是一種Lisp-2語言,具有用於函數/變量的不同命名空間。 這樣可以使函數和變量具有相同的名稱。

所以對於像

(some-function some arguments)

elisp執行程序僅在函數名稱空間中搜索some-function ,當您要從變量名稱空間調用與變量關聯some-function ,該函數會使諸如funcall的結構或apply必需。

如果不理解,elisp中單獨的函數/變量名稱空間可能會導致意外行為:

(defun do-something () (1))
(setq do-something #'(lambda () (2)))

(do-something) ;; => 1
(funcall do-something) ;; => 2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM