2010-11-13 10 views
1

J'essaye d'imbriquer des instances de defstructs comme certains des arguments clés & dans un autre defstruct, comme démontré par le code ci-dessous. Pour une raison quelconque, les variables à insérer dans la structure externe ne sont pas remplacées par les valeurs qui leur sont liées (ce à quoi je m'attendrais). Toutes les explications et/ou suggestions seraient appréciées.Est-ce que l'instanciation de defstruct évalue ses arguments & key?

(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

Il peut être utile de lire un livre d'introduction Lisp plus basique. Comme la Terre de Lisp, ou Gentle Introduction de Touretzky. Ceux-ci expliquent les règles d'évaluation de base. –

Répondre

4

'(y my) est une liste littérale qui contient deux symboles - Y et MY. (list y my) créerait une liste de deux valeurs, la première est la valeur de la variable Y, la seconde est la valeur de la variable MY. La même chose est avec '('John x) - c'est une liste littérale qui contient deux éléments - une liste (QUOTE JOHN) et le symbole X.

+0

Ah! Je pensais que les notations '() et (liste) étaient équivalentes. Merci pour la clarification! –