讨论CommonLisp中list和'的区别


#1

对于普通数据类型,下面的结果是一样的

(list 1 2 3 4)   ;; => (1 2 3 4)
'(1 2 3 4)       ;; => (1 2 3 4)

对于lambda,下面的结果就不一样了,哪位帮解释一下?

(let ((count 0))
  (list
   #'(lambda () (incf count))
   #'(lambda () (decf count))
   #'(lambda () count)))
;; =>(#<CLOSURE (LAMBDA ()) {10033FCA7B}> 
;;    #<CLOSURE (LAMBDA ()) {10033FCA9B}>
;;    #<CLOSURE (LAMBDA ()) {10033FCABB}>)
;; 列表的成员是闭包

(let ((count 0))
  '(#'(lambda () (incf count))
    #'(lambda () (decf count))
    #'(lambda () count)))
;;=>(#'(LAMBDA () (INCF COUNT)) 
;;   #'(LAMBDA () (DECF COUNT))
;;   #'(LAMBDA () COUNT))
;; 列表的成员是lambda

#2

刚才试了一下,改成下面的写法,就和list一致了

(let ((count 0))
  `(,#'(lambda () (incf count))
    ,#'(lambda () (decf count))
    ,#'(lambda () count)))

说明,list会先对成员进行求值,这就是’与list之间的区别。不知解释对了没有。


#3

对,就是是否求值的区别,更简单的例子

(list (+ 1 1))
'((+1 1))

#4

好的,多谢!