【发布时间】:2017-02-07 21:30:28
【问题描述】:
为了在 common-lisp 中进行快速原型设计,能够轻松地对任意数据结构中的对象进行函数修改会很方便。这似乎涉及在数据结构中的某个位置调用任意函数,用函数调用的结果替换该位置的对象。 Common-lisp 有许多专门的修改宏(例如,incf、push、getf 等)用于特定类型的对象,setf 用于通用位置修改(例如,setf-second、@987654327 @、setf-gethash 等)。但是,与其为其他对象类型发明新的专用宏,或者不必考虑每个宏的特性(减慢开发速度),不如拥有一个比setf 更易于使用的通用 setf 修改功能。 .例如,代替(setf (second (getf plist indicator)) (1+ (second (getf plist indicator)))) 或(incf (second (getf plist indicator))),可以写(callf (second (getf plist indicator)) #'1+),使用由common-lisp 或用户提供的任何正常的单参数函数(或lambda 表达式)。这是代码的尝试:
(defun call (object function) (funcall function object))
(define-modify-macro callf (&rest args) call)
这样的事情是否适用于所有一般情况,它实际上可以在实践中简化代码吗?
【问题讨论】:
-
DEFINE-MODIFY-MACRO是您要找的吗?
标签: reference macros common-lisp