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 |

2009-09-25

バリューセルにも関数

| 23:32 | バリューセルにも関数 - わだばLisperになる を含むブックマーク はてなブックマーク - バリューセルにも関数 - わだばLisperになる

「#'とか付けるのだるい」「美しくない」という声を良く聞くのですが、目的のシンボルのバリューセルに関数を詰めれば、#'を付けなくても、まあ、大体似たことはできるんですよね。

ということで、fvletというfletでローカル関数を定義しつつ、関数のシンボルのバリューセルにも関数を詰めるというマクロを書いてみました。

「ああ、なんかバリューセルが潰れて損した気がする」と思った貴方は、心の底からLISP2の人です。

(DEFMACRO FVLET ((&REST SPECS) &BODY BODY)
  (LET ((SYMS (MAPCAR #'CAR SPECS)))
    `(FLET (,@SPECS)
       (LET (,@(MAPCAR (LAMBDA (X) `(,X (FUNCTION ,X)))
                       SYMS))
         ,@BODY))))
(IMPORT 'KMRCL:COMPOSE)

(FVLET ((FOO (X) (* 2 X))
        (BAR (X) (LIST X X)))
  (MAPCAR (COMPOSE BAR FOO) 
          '(1 2 3 4)))
;=> ((2 2) (4 4) (6 6) (8 8))

※追記

正確にはバリューセルを使うにはletの変数をスペシャルにしないといけないとzicさんより指摘がありました。

まったくその通りで、上記fvletの中でfooやbarをsymbol-valueするとどういうことかが分かります。

上記のコードだとletで作ったレキシカル環境を操作することになります。