我仍然是LISP的初学者,希望大家能就如何解决以下问题给我一些建议。
(CG-USER(1):defstruct Test()
(TestValue 10)
(TestChild 'none)
)
TEST
CG-USER(2): (defun testvalue(item)
(slot-value item 'TESTCHILD))
TESTVALUE
CG-USER(3):(setf TestObject(make-Test :TestChild '(TestObject2 B C)))
#S(TEST :NIL NIL :TESTVALUE 10 :TESTCHILD (TESTOBJECT2 B C))
CG-USER(4): (setf TestObject2(make-Test :TestChild '(D E F)))
#S(TEST :NIL NIL :TESTVALUE 10 :TESTCHILD (D E F))
CG-USER(5): (setf aaa (car (testvalue TestObject)))
TESTOBJECT2
CG-USER(6): (testvalue aaa)
Error: The slot TESTCHILD is missing from the object TESTOBJECT2 of class #<BUILT-IN-CLASS SYMBOL> during
operation SLOT-VALUE
[condition type: PROGRAM-ERROR]
以下是我的代码。如您所见,我试图通过函数TestObject2
读取对象testvalue
中的详细信息。我的主要目的是能够首先从另一个对象(在这种情况下,TestObject2
)确定对象的名称(TestObject
),因为我不知道名称{{1}的名称尚未。
但是,一旦我成功检索到名称TestObject2
,当我尝试访问对象内的元素(TestObject2
)时,它就不再识别持有TestObject2
的变量(在这种情况下,&#34; aaa&#34;)作为对象。因此,它无法读取TestObject2
,导致错误。
我是LISP的初学者,我无法弄清楚如何解决这个问题。如果有人能为此提供样本解决方案,那将是非常好的。感谢。
P / S:另外,请问这行中testvalue
是什么?还有什么方法可以删除它?
NIL NIL
答案 0 :(得分:1)
第二个问题:
(defstruct Test()
(TestValue 10)
(TestChild 'none))
让我们的格式略有不同:
(defstruct Test ; the structure has a name `TEST`
() ; the first slot is named `NIL`
(TestValue 10) ; the second slot is named `TESTVALUE`
(TestChild 'none)) ; the third slot is named `TESTCHILD`
所以,删除第一个插槽...... ;-)是有意义的,我们得到:
(defstruct Test ; the structure has a name `TEST`
(TestValue 10) ; the first slot is named `TESTVALUE`
(TestChild 'none)) ; the second slot is named `TESTCHILD`
第一个问题:
TESTOBJECT2
是一个符号。如果符号具有值,则可以使用函数SYMBOL-VALUE
检索它。
(symbol-value 'testobject2)
通常,您希望稍微修改一下代码:
CL-USER 42 > (defstruct test
(value 10)
(child 'none))
TEST
在上面我们不需要test
前缀。 DEFSTRUCT
已经创建了以TEST-
作为前缀的访问者。
CL-USER 43 > (setf test-object (make-test :child '(test-object2 b c)))
#S(TEST :VALUE 10 :CHILD (TEST-OBJECT2 B C))
请注意,在您的示例和上面的代码中,:child
不是结构。它只是三个符号的列表。
CL-USER 44 > (setf test-object2 (make-test :child '(d e f)))
#S(TEST :VALUE 10 :CHILD (D E F))
同样,上面的孩子是三个符号的列表。
CL-USER 45 > (setf aaa (car (test-child test-object)))
TEST-OBJECT2
上图:该列表的第一个是符号TEST-OBJECT2
。
CL-USER 46 > (test-value (symbol-value aaa))
10
上图:我们可以检索符号TEST-OBJECT2
的符号值,这是变量AAA
的值。