[英]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.