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-01-19

俺Arc祭り 2008冬 (3)

| 00:55 | 俺Arc祭り 2008冬 (3) - わだばLisperになる を含むブックマーク はてなブックマーク - 俺Arc祭り 2008冬 (3) - わだばLisperになる

だんだん疲れて来てしまいました。俺Arc祭り。段々恥ずかしい駄目駄目なコードを晒すのも恥ずかしくなってまいりました。

実際のところは駄目なところが分からないのと、恥ずかしいところが分からない自分が恥かしいのですが。

それはさておき、

9. Binding

  • with, let

Arcの変数束縛機構ですが、letは、変数を一組しかとらないことにするみたいです。Gaucheのlet1と同じ感じ。

複数の場合には、withを使用するとのこと。

また、(let x 3 (foo x))は((fn (x) (foo x) ) 3)に展開されるんだそうです。letがlambdaに展開されるってことでしょうか。

色々深いんだと思いますが、単にletに展開するだけにしました。


;; 動作
(with (x 'a y 'b)
  (list x y))
;=> (A B)

(let x 'a
     (cons x 5))
;=> (A . 5)

;; 定義
(cl:defmacro with ((&rest spec) &body body)
  `(cl:let ,(cl:do ((s spec (cddr s)) res)
		   ((endp s) (nreverse res))
		   (push `(,(car s) ,(cadr s)) res))
	   ,@body))

(shadow 'let)
(cl:defmacro let (var val &body body)
  `(cl:let ((,var ,val))
	   ,@body))