将功能设置为符号

时间:2011-12-13 06:25:07

标签: lisp

将函数设置为符号时遇到一些问题。例如,我向符号添加了一些属性:

(putprop 'rectangle '10 'width)
(purprop 'rectangle '2 'height)
(putprop 'rectangle (* (get 'rectangle 'width) (get 'rectangle 'height)) 'square)

当我输入(symbol-plist 'rectangle)时,我得到:

(SQUARE 20 HEIGHT 2 WIDTH 10)

但如果我改变高度或值,我会得到旧的平方值:

(putprop 'rectangle 10 'height)
(symbol-plist 'rectangle)

如何将函数设置为符号属性?如果我将property设置为lambda,symbol-plist会得到类似#<Closure-square: #12345>

的内容

2 个答案:

答案 0 :(得分:2)

我使用symbol-function为具有良好但长名称的函数定义别名:

* (defun hello-world () (format t "Hello, World!~%"))
HELLO-WORLD
* (hello-world)
Hello, World!
NIL
* (setf (symbol-function 'hw) #'hello-world)
#<FUNCTION HELLO-WORLD>
* (hw)
Hello, World!
NIL

这是我为此创建的一个函数:

(defun defalias (function alias)
  "Defines an alias for FUNCTION, so it can be called with ALIAS as well."
  (setf (symbol-function alias) function))

答案 1 :(得分:0)

将符号的属性设置为lambda表达式,每次其他属性更改时都不会自动应用该lambda表达式(这就是我想要的)。

您可以编写一个包装函数来设置符号的heightwidth属性,并重新计算符号square属性。