"quote就是构造一个list"似乎不对 quote会对多层生效吗

以下例子都来自M-x ielm

我原以为'(...)(list ...)是一样的,但是现在发现他们不一样,后者造出的list似乎更纯:

ELISP> (car (list 1 2))
1 (#o1, #x1, ?\C-a)
ELISP> (car '(1 2))
1 (#o1, #x1, ?\C-a)
ELISP> (numberp (car (list 1 2)))
t
ELISP> (numberp (car '(1 2)))
t
ELISP> (keymapp (car (list ivy-mode-map swiper-map)))
t
ELISP> (keymapp (car '(ivy-mode-map swiper-map)))
nil

原以为quote只quote一层,似乎不对:

ELISP> (car (car '((define-key))))
define-key
ELISP> (car (car '('(define-key))))
quote
1 个赞

quote 是个特殊形式,参数不会被求值,list 则是个函数,所有参数都会求值。

4 个赞

这种使用quote肯定是不对的,因为你是要对ivy-mode-map进行求值,而不是想得到 ‘ivy-mode-map。 正确的方法是:

(keymapp (car `(,ivy-mode-map ,swiper-map)))

1 个赞
'(a b)
     => (a b)

(quote (a b))
     => (a b)

(list 'a 'b)
     => (a b)

(list (quote a) (quote b))
     => (a b)

'...(quote ...) 的简写,它和 list 的另一个不同是参数的个数——quote 只能接收一个参数,而 list 可以接收任意数量的参数。listquote 有时其实并不像,list 不能取代 quote'(...)(list ...) 看起来对称应该是个错觉。

'((one 1) (two 2))
     => ((one 1) (two 2))

(list (one 1) (two 2))
error-> Symbol’s function definition is void: one

(list ((one 1) (two 2)))
error-> Invalid function: (one 1)

(list (list 'one 1) (list 'two 2))
     => ((one 1) (two 2))
1 个赞

这些都跟“给ivy-mode-map求值再keymapp就对了”符合,但是我还有另外一个问题:不是只有函数才能求值么?(ivy-mode-map) => *** Eval error *** Symbol's function definition is void: ivy-mode-map。这里的“求值”好像跟平时所说的求值不大一样。

求函数值和求变量值是不一样的。

Symbol,List 和 数字都能求值:

;; 变量(Symbol)
emacs-version
     => "26.0.50"

;; 函数调用(List)
(+ 1 2)
     => 3

;; 数字、字符串、和 Vector
1
     => 1
"str"
     => "str"

[a b c]
     => [a b c]
1 个赞

看来你对Symbol还不太理解。 (define x 3) (define y 4) 'x => x x => 3 '(x y) => '(x y) `(,x ,y) => (3 4)

2 个赞

symbol 求值规则就是: 如果它代表一个变量,按变量的规则求值,如果它代表一个函数,按函数的规则求值

1 个赞