2011-12-13 33 views
1

將函數設置爲符號有一些問題。舉例來說,我的一些屬性添加到符號:將函數設置爲符號

(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) 

如何將函數設置爲符號屬性?如果我將屬性設置爲lambda,symbol-plist使我得到類似#<Closure-square: #12345>

+1

您可以[funcall(HTTP:/ /www.lispworks.com/documentation/HyperSpec/Body/f_funcal.htm)關閉,並且您可以使用[symbol-function](http://www.lispworks.com/documentation/HyperSpec/Body/f_symb_1.htm )來訪問給定符號的功能。 – Daimrod

+0

是的,我可以使用funcall,但你能解釋我如何使用符號函數嗎? – Boo

+1

嗯我錯了,我認爲我們可以像符號一樣操縱屬性 ,但問題依然存在。我們不能製作一個函數,它會立即返回一個函數並對其進行評估(不帶funcall)。 I 認爲這是因爲Common Lisp是一個lisp-2而不是一個lisp-1。即 一個符號可以同時具有一個值和一個函數。 – Daimrod

回答

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)) 
0

將符號的屬性設置爲lambda表達式,不會在每次其他屬性更改時自動應用該lambda表達式(這是我想要的)。

您可以編寫一個包裝函數,該函數設置符號的heightwidth屬性並重新計算符號square屬性。

+0

有沒有其他的方法,以當前'寬度'和'高度'來獲得'square'值?符號可以有方法嗎? – Boo

+0

有什麼特別的原因讓你首先使用符號屬性來解決這個問題? –

+0

是的,這是我老師的任務:-)我找不到這方面的任何信息,這就是爲什麼我在這裏問這個問題 – Boo