Установить функцию на символ - PullRequest
1 голос
/ 13 декабря 2011

У меня проблемы с установкой функции на символ. Например, я добавляю некоторые свойства к символу:

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

Как я могу установить функцию как свойство символа? Если я установлю свойство как лямбда, symbol-plist получит мне что-то вроде #<Closure-square: #12345>

Ответы [ 2 ]

2 голосов
/ 15 декабря 2011

Я использую 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 голосов
/ 13 декабря 2011

Установка свойства символа для лямбда-выражения не приводит к автоматическому применению этого лямбда-выражения каждый раз, когда изменяются другие свойства (что, я думаю, вам нужно).

Вы можете написать функцию-обертку, которая устанавливает свойство height или width символа и пересчитывает свойство square символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...