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-08-12

CLで学ぶ「プログラミングGauche」 (9.7)

| 20:58 | CLで学ぶ「プログラミングGauche」 (9.7) - わだばLisperになる を含むブックマーク はてなブックマーク - CLで学ぶ「プログラミングGauche」 (9.7) - わだばLisperになる

9.7 準クォート

準クォートの扱いもCLとGaucheとであまり違いはないかと思います。

あまり使用されませんが、CLの場合は、,@以外に、,.のようなものがあり、,@がリストをappend的につくけるのに対し、,.は、nconc的にくつけます。

また、古いコードでは、,@の代りに`(foo . ,bar)と書いたコードも良く見かけます。当然といえば、当然なのですが、これは、,@と違ってリストの最後の要素になった時にしか使えません。

ドットとコンマはくつけて書けるので、.,fooの様に書いていることもあるのですが、見た目が,.と紛らわしいです(;´Д`)

(let ((foo (copy-list '(1 2 3 4 5)))
      (bar (copy-list '(6 7 8 9 0))))
  (list `(,foo ,bar)
        foo))
;=> (((1 2 3 4 5) (6 7 8 9 0)) (1 2 3 4 5))

(let ((foo (copy-list '(1 2 3 4 5)))
      (bar (copy-list '(6 7 8 9 0))))
  (list `(,@foo ,@bar)
        foo))
;=> ((1 2 3 4 5 6 7 8 9 0) (1 2 3 4 5))

(let ((foo (copy-list '(1 2 3 4 5)))
      (bar (copy-list '(6 7 8 9 0))))
  (list `(,.foo ,.bar)
        foo))
;=> ((1 2 3 4 5 6 7 8 9 0) (1 2 3 4 5 6 7 8 9 0))

(let ((foo (copy-list '(1 2 3 4 5)))
      (bar (copy-list '(6 7 8 9 0))))
  (list `(,.foo .,bar) ; ,@barと同じ
        foo))

また、ネストすると非常に難解になりますが、大概ネストさせる必要があるのは、マクロを書くマクロを作成する時位のものだと思うので、ある程度パターンは決まってくるかと思います。

つまり、`(,x ,y)という表記をどうやって作るか、というような問題に大体集約できるかと思いますので、適当に例題を作って遊んでみると良い練習になるかもしれません。

;; `(,x ,y) を作りたい。(xとyはそれぞれ変数に格納)
(let ((foo 'x) (bar 'y))
  ``(,,foo ,,bar))

;=> `(,X ,Y)

;; '(x y z) '(a b c)を合成して、`(,x ,y ,z ,a ,b ,c)を作りたい。(元リストはそれぞれ変数に格納)
(let ((foo '(x y z))
      (bar '(a b c)))
  ``(,,@foo ,,@bar))

;=> `(,X ,Y ,Z ,A ,B ,C)