以下例子都来自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
可以接收任意数量的参数。list
和 quote
有时其实并不像,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 个赞