在没有引号运算符的情况下输入LISP中的参数(属性列表/语义网络/基本功能)

时间:2015-03-22 23:58:13

标签: lisp common-lisp property-list

自从我使用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会抱怨变量没有价值。那么,如果没有引用,我将如何制作能够完全按照上面所示输入的内容?

2 个答案:

答案 0 :(得分:1)

您的财产清单无意评估。他们的意思是read进入和处理。然后,您的处理功能可以选择factis-a以及connected等符号并对其进行适当处理。

但是,由于您没有对它们进行评估,因此不应为factis-aconnected定义程序(或宏!)。

答案 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))