将函数设置为符号时遇到一些问题。例如,我向符号添加了一些属性:
(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>
答案 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表达式(这就是我想要的)。
您可以编写一个包装函数来设置符号的height
或width
属性,并重新计算符号square
属性。