2010-11-13 61 views
1

我试图将嵌套的实例嵌套为另一个defstruct中的一些&关键参数,如下面的代码所示。出于某种原因,插入到外层构造中的变量不会被绑定到它们的值所取代(这是我所期望的)。任何解释和/或建议,将不胜感激。defstruct实例化是否评估其关键参数?

(defstruct (compound (:conc-name nil)) op args) 
(defstruct (var (:conc-name nil)) name) 

(let* ((x (make-var :name 'x)) 
     (y (make-var :name 'y)) 
     (my (make-compound :op 'Mother :args y)) 
     (s1 (make-compound :op 'knows :args '(y my))) 
     (s2 (make-compound :op 'knows :args '('John x)))) 
    s1) 

=> #S(COMPOUND :OP KNOWS :ARGS (Y MY)) 
+0

这可能有助于阅读一些更基本的Lisp入门书。像Lisp的土地,或Touretzky的温柔介绍。这些解释了基本评估规则。 – 2010-11-13 09:14:43

回答

4

'(y my)是包含两个符号的文字列表 - YMY(list y my)会创建两个值的列表,第一个是变量的值Y,第二个是变量的值MY。 '('John x)也是如此 - 它是一个包含两个元素的文字列表 - 列表(QUOTE JOHN)和符号X

+0

啊!我认为'()和(列表)符号是等价的。感谢您的澄清! – 2010-11-13 20:23:34