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 |

2008-10-15

lisp2で、functionがうざい問題

| 07:28 | lisp2で、functionがうざい問題 - わだばLisperになる を含むブックマーク はてなブックマーク - lisp2で、functionがうざい問題 - わだばLisperになる

一定周期で耳にするCLの#'がうざい問題ですが、今日のチャットでも話題になったので、また色々考えてみました。

前のネタとしては、symbol-valueに、symbol-functionの値をグローバルにセットしてしまえば、#'を書く手間だけは省けるだろうというものでしたが、

そういえば、lisp1という、CLをlisp1的に書く試みがどっかにあったなと思い出したので、探して試してみました。

ちょっと試してみたのですが、ネタ的には、やはり、symbol-functionの値をsymbol-valueにセットするというのが骨子なようです(笑)

ついでにローカルな感じでlisp1的に書けるwith-lisp1ってのを考えてみました。ちなみに局所関数には対応してません。

(import 'kmrcl:flatten)

(defmacro with-lisp1 (&body body)
  (let ((syms (remove-if-not (lambda (x) 
                               (and (symbolp x) 
                                    (fboundp x)
                                    (not (eq 'quote x))))
                             (flatten body))))
    `(let ,(mapcar (lambda (x) `(,x (symbol-function ',x))) syms)
       (declare (ignorable ,@syms))
       ,@body)))

;; 動作
(with-lisp1
  (mapcar 1+ '(1 2 3 4)))
;=> (2 3 4 5)

(with-lisp1 
  (sort (list 38 29 3 1) <))

;=> (1 3 29 38)