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-09-16

超リードマクロに対して超普通

| 21:03 | 超リードマクロに対して超普通 - わだばLisperになる を含むブックマーク はてなブックマーク - 超リードマクロに対して超普通 - わだばLisperになる

この前、Twitterで深町さんがCLer同士のブログエントリーへのツッコまなさ加減を嘆いていました。

思いあたるところも多いですし、積極的にツッコんで行くのも面白いかもしれないのでこれからはツッコんで行ってみます。

深町さんのエントリーの趣旨はREADを上書きして、

'(1..10)
;⇒ '(1 2 3 4 5 6 7 8 9)

と書けるようにするというアイデアです。

自分は、これくらいだったら色々な方面のバランスを考えるとREADを改造するまでもないかな、思いました。

費用対効果を考えると、quekさんの

(N.. 2 5)
;⇒ (2 3 4 5)

(1... 10)
;⇒ (1 2 3 4 5 6 7 8 9)

が良い感じです。

自分だったら、どう書くかというと、quekさんと似た感じですが、

(DEFUN LIST.. (START END)
  (LOOP :FOR I :FROM START :TO END :COLLECT I))

(DEFUN VECTOR.. (START END)
  (ATAP (MAKE-ARRAY (1+ (- END START)))
    (LOOP :FOR IDX :FROM 0 
          :FOR VAL :FROM START :TO END
          :DO (SETF (AREF IT IDX) VAL))))

(DEFUN QUOTE.. (START END)
  `',(LOOP :FOR I :FROM START :TO END :COLLECT I))
(LIST.. 1 10)
;⇒ (1 2 3 4 5 6 7 8 9 10)

(QUOTE.. 1 10)
;⇒ '(1 2 3 4 5 6 7 8 9 10)

(VECTOR.. 1 10)
;⇒ #(1 2 3 4 5 6 7 8 9 10)

くらいかなあと思いました。

他にリーダーマクロで実装するとしたら、☺等をマクロ文字にして、

(☺1..5PRINT ..)

が、

(PROGN
  (PRINT 1)
  (PRINT 2)
  (PRINT 3)
  (PRINT 4)
  (PRINT 5))

;; もしくはちょっと自動解析して
(LOOP :FOR #:G1 :FROM 1 :TO 5 :DO (PRINT #:G1))

のように展開されるようにするかもしれないなと思いました。

あと、READを再定義するところまで行くとすると、

(1..5)だけでなくて、

(let ((start 10) (end 100))
  (start..end))

とも書きたくなりそうです。

ともあれ、READを再定義というのは面白いと思いましたので、これからもどんどんREADやEVALを再定義してみて欲しいです!

ゲスト



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