KMRCLを眺める(197) FUNCTION-TO-STRING — #:g1

Posted 2010-08-31 05:27:00 GMT

datetime.lispも前回で眺め終えたので、今回は、KMRCLのequal.lispからFUNCTION-TO-STRINGです。
関数を文字列にするってなんだろうという感じですが、FUNCTION-LAMBDA-EXPRESSIONの結果をどうにか文字列にしている感じです。

(defun function-to-string (obj)
  "Returns the lambda code for a function. Relies on
Allegro implementation-dependent features."
  (multiple-value-bind (lambda closurep name) (function-lambda-expression obj)
    (declare (ignore closurep))
    (if lambda
          (format nil "#'~s" lambda)
      (if name
          (format nil "#'~s" name)
        (progn
          (print obj)
          (break))))))
しかし、FUNCTION-LAMBDA-EXPRESSIONの動作はかなり実装依存なため、大分ばらばらな動きになっています。
(KL::FUNCTION-TO-STRING (LAMBDA (X) X))
; Allegro CL
; ⇒ "#'(LAMBDA (X) X)"

; SBCL ; ⇒ "#'(LAMBDA (X))"

; CCL (BREAK) ; NIL, NIL, NILが返ってくるため

Allegro CL以外は、有用な結果になってない気がします…。

comments powered by Disqus