簡體   English   中英

LISP從另一個變量中取出對象名稱后如何從變量中調用對象

[英]LISP how to call an object from a variable after taking out the name of the object from another variable

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

以下是我的代碼。 如您所見,我正在嘗試通過功能testvalue讀取對象TestObject2的詳細信息。 我的主要目的是能夠首先從另一個對象(在本例中為TestObject )確定對象的名稱( TestObject2 ),因為我還不知道名稱TestObject2

但是,一旦設法成功檢索名稱TestObject2 ,當我嘗試訪問對象( TestObject2 )中的元素時,它不再將持有TestObject2的變量(在本例中為“ aaa”)標識為對象。 因此,它無法讀取其testvalue值,從而導致錯誤。

我是LISP的初學者,我不知道如何解決此問題。 如果有人可以為此提供示例解決方案,那將是非常不錯的。 謝謝。

P / S:另外,請問這行中的NIL NIL是什么? 並以任何方式刪除它?

#S(TEST :NIL NIL :TESTVALUE 10 :TESTCHILD (D E F))

第二個問題:

(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的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM