Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2010-08-31

KMRCLを眺める(197) FUNCTION-TO-STRING

| 14:27 | KMRCLを眺める(197) FUNCTION-TO-STRING - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める(197) FUNCTION-TO-STRING - わだばLisperになる

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以外は、有用な結果になってない気がします…。

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20100831