LISP如何在从另一个变量中取出对象的名称后从变量中调用对象

时间:2015-01-10 15:46:19

标签: object lisp common-lisp

我仍然是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

1 个答案:

答案 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的值。