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)

8/16 第12回 慢性的CL勉強会@Lingr 8時だョ!全員集合 告知

| 18:02 | 8/16 第12回 慢性的CL勉強会@Lingr 8時だョ!全員集合 告知 - わだばLisperになる を含むブックマーク はてなブックマーク - 8/16 第12回 慢性的CL勉強会@Lingr 8時だョ!全員集合 告知 - わだばLisperになる

今週も、開催させて頂きます!

今回は「CLの落し穴」の続きで"Packages."からの再開ですが、お盆休み真最中ということで参加者人数的にはどうなることでしょう(*'-')

ちょっと時間があまるかもしれないので、その場合、cl-cookbookよりパターンマッチの個所の予習というか、どういう感じでみなさんは対処しているかを議論のテーマにしてみたいと思います。

  • CLの落し穴集(コーディングではまるところ)
場所:Lingr: Common Lisp部屋
日時8/16 (土) 20:00から適当(途中参加/離脱/ROM歓迎)
勉強会の進行テキストを最初から参加者が眺めてゆき、質問があったり、議論になりそうなことがあったら議論してゆきます。
勉強会の目標CLに関して一つ位賢くなった気になること
時刻お題対象者参考リンク
20:00-21:30位までCommon Lisp PitfallsCLでコーディングする方Common Lisp Pitfalls

勉強会のネタがあれば、このブログにコメント頂くか、Lingr等に書き置きしてみて下さい。好きなテーマを持ち込んでみて頂くというのも大歓迎です!

ゲスト



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