自从我使用LISP以来已经有一段时间了。我现在正在使用它来创建一个属性列表来表示语义网络。我似乎无法弄清楚这个基本问题,而且它暂时阻止了所有进展。
我们期待的输入类型如下:
(FACT (IS-A SEAT1 SEAT))
(FACT (IS-A L1 LEG))
(FACT (IS-A L2 LEG))
(FACT (IS-A L3 LEG))
以第一个为例。首先,我对如何在另一个内部调用函数感到有点困惑。我最初的想法是创建一个名为fact的函数,并使用cond语句来查看它是否正在使用" is-a"或"已连接" (另一种可能性),但在那之前的那个额外的括号是"是-a"或者"连接",我不确定我是如何处理的。
为了至少看看我是否得到了基本的想法,我决定直接跳到" is-a"部分。这基本上应该是创建对象。
(defun is-a (name type)
(setf (get type 'name) name)
)
理想情况下这可行,但为了实际调用函数,您需要将引号运算符放在参数前面,因为它们不是变量。所以电话会是这样的:
(is-a 'seat1 'seat)
如果没有这些引用,CLISP会抱怨变量没有价值。那么,如果没有引用,我将如何制作能够完全按照上面所示输入的内容?
答案 0 :(得分:1)
您的财产清单无意评估。他们的意思是read
进入和处理。然后,您的处理功能可以选择fact
和is-a
以及connected
等符号并对其进行适当处理。
但是,由于您没有对它们进行评估,因此不应为fact
,is-a
或connected
定义程序(或宏!)。
答案 1 :(得分:0)
这里有一些可能性。如果您尝试直接评估这些行,并且希望(FACT (IS-A SEAT1 SEAT))
定义名为seat1
seat
的变量,则可以这样做:
(defvar input '(FACT (IS-A SEAT1 SEAT)))
(defmacro fact (&body expr)
`(progn . ,expr))
(defmacro is-a (name type)
`(defparameter ,name (make-instance ',type)))
(defclass seat () ())
(eval input)
或者,您可以通过定义seat1
来使is-a
成为哈希表中的键:
(defvar *objects* (make-hash-table))
(defmacro is-a (name type)
`(setf (gethash ',name *objects*) (make-instance ',type)))
(defclass seat () ())
(eval input)
有destructuring-bind
:
(defvar input '(FACT (IS-A SEAT1 SEAT)))
(destructuring-bind (type (operator operand-1 operand-2)) input
(format t "It is a ~a that ~a ~a ~a~%" type operand-1 operator operand-2))
输出:
It is a FACT that SEAT1 IS-A SEAT
LOOP宏也可以解构:
(loop for (type (operator operand-1 operand-2)) in list-of-inputs
do
(format t "It is a ~a that ~a ~a ~a~%" type operand-1 operator operand-2))