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-02-24

たまにするならこんな拡張

| 01:03 | たまにするならこんな拡張 - わだばLisperになる を含むブックマーク はてなブックマーク - たまにするならこんな拡張 - わだばLisperになる

Arcのafn(On Lispでのalambda)は、使い捨て感覚の関数に付ける名前を考えなくても良いので、個人的に気に入って使っているのですが、引数の取り方がlambdaと一緒のため本体部分が長くなると読み辛くなるかなあと思います。

そこで、形式をlambdaからletにしたものはどうかなと思い、そんなのを作ってみることにしました。要するに名前付きletのアナフォリック版ということですね。

それで名前をどうするか考えたんですが、Arcでletは1引数なので、そうなるとwithになるかと思い、awithにしてみました。

全体的には割とすっきり書けて良い感じにも思えるのですが、引数部分がなんとなくごちゃごちゃしてる気もします。

また、ドットで連結するのに馴れると(+ 1 foo)のようなものも1+.cntのように書きたくなってくるので、 古式ゆかしいadd1という名前の復活も試してみることにしました。

(mac awith (binds . body)
  (let b (pair binds)
    `((afn ,(map car b)
	,@body)
      ,@(map cadr b))))

(set add1 [+ _ 1])
(set sub1 [- _ 1])

;; 使用例
(def rotate (lst pos)
  (let pos (mod pos len.lst)
    (awith (lst lst acc () cnt 0)
      (if (or no.lst (is pos cnt))
          (join lst rev.acc)
	  (self cdr.lst
		(cons car.lst acc)
		add1.cnt)))))