編輯:快速和骯髒的選項,如果您的實現打印的flet
或labels
函數的名稱:
(defmacro nlambda (name (&rest lambda-list) &body body)
`(labels ((,name (,@lambda-list)
,@body))
#',name))
請繼續閱讀,如果您需要可靠的打印功能名稱。跟隨你的最後一個問題,假設你的Common Lisp實現
一個例子如下元對象協議(MOP):
(defclass funcallable-object()
((name :initarg :name :initform nil :accessor funcallable-name)
(function :initarg :function :initform nil :accessor funcallable-function)
(:metaclass mop:funcallable-standard-class))
(defmethod initialize-instance :after ((object funcallable-object) &key function &allow-other-keys)
(setf (funcallable-function object) function))
(demethod (setf funcallable-function) :after (function (object funcallable-object))
(mop:set-funcallable-instance-function object (or function #.(constantly nil))))
(defmethod print-object ((object funcallable-object) stream)
(print-unreadable-object (object stream :type t :identity t)
(with-slots (name) object
(when name
(write name stream)))))
請注意,你必須根據你的實現替換mop
包的名稱,或如果你使用cl-mop。
編輯:這裏有幾種方法可以使用它。
直接:
(make-instance 'funcallable-object
:name 'foo
:function #'(lambda (<args>)
<body>))
了宏:
(defmacro nlambda (name (&rest lambda-list) &body body)
`(labels ((,name (,@lambda-list)
,@body))
(make-instance 'funcallable-object
:name ',name
:function #',name)))
(nlambda foo (<args>)
<body>)
我用的例子,而不是flet
labels
,因爲我相信一個名爲拉姆達的更大的效用是其遞歸的能力。
關於你最後的問題,在一個具有MOP(元對象協議)的實現上,你可以使用['funcallable-standard-class'](http://www.alu.org/mop/dictionary.html )並專門爲您的目的['print-object'](http://www.lispworks.com/documentation/HyperSpec/Body/f_pr_obj.htm)。 – acelent 2014-12-22 02:44:07