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-30

8/30第14回慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ

| 22:53 | 8/30第14回慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ - わだばLisperになる を含むブックマーク はてなブックマーク - 8/30第14回慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ - わだばLisperになる

昨日、8/30 20:00から14回目の勉強会を開催させて頂きました!

発言して頂いた方約6名、observer(ROM)の方約7名前後で、大体13名前後を推移しつつでした。

LL Futureと思いっきりぶつかってしまったのが原因か、はたまた腑甲斐無い進行のため飽きられて来てしまったか(^^;

このままではまずいような気も!

とりあえず、今回のお題は、cl-cookbookより関数篇と、I/O篇でした。

反省と課題

考えていたよりも、お題が早目に終ってしまい、予備に準備していたところまで進んでしまい、後半の密度が非常に薄くなってしまった。

…準備は万全にしようと思いました(笑)

ログ:

謝辞

  • zickさん

お題の予習エントリありがとうございます!

ページへの勉強会のロゴ設置ありがとうございます!

今回も勉強会の一員に加えて頂いてありがとうございます!

2008-08-27

Getting Started in *LISP (13)

| 20:56 | Getting Started in *LISP (13) - わだばLisperになる を含むブックマーク はてなブックマーク - Getting Started in *LISP (13) - わだばLisperになる

投げ出さないように細かく進めて行くことにしたにも関わらず、夏バテのためか、また1ヶ月以上放置してしまっておりました*Lispのチュートリアル。

3.3.3 Grid Communication - Fast, but with Restrictions

前回のCPUの一対一の通信は、柔軟なんだけれどもスピードが遅いのが問題とのこと。

もう一つの方法であるグリッドは制限はあるものの速いとのこと。

3.3.4 The Grid Communication Operators of *Lisp

ということで、グリッドの操作方法について。なんとなく、*Lispっぽくなってまいりました。

グリッドの操作には、*newsや、news!!が使えます。

newsという名前は、グリッドの上下左右を東西南北に見立てたもの。グリッドは、2次元以上も組めるのですが、開発当初は、2次元までだったそうで、それの名残りとのこと。

まず、*newsから。

(*news ソースPVAR デスティネイションPVAR 東西 南北)

という感じのマクロです。

試してみる

(defun zig-zag (pvar)
  (*news pvar pvar 3 0)  ;;; three steps "east"
  (*news pvar pvar 0 -1) ;;; one step "north"
  (*news pvar pvar 2 0))

(*let ((g (self-address!!)))
  (print "before:")
  (ppp g :mode :grid :format "~3D ")
  (*news g g 0 -1)
  (print "after")
  (ppp g :mode :grid :format "~3D ")
  (zig-zag g))

;>>>
before

     DIMENSION 0 (X)  ----->

  0  16  32  48  64  80  96 112 128 144 160 176 192 208 224 240 
  1  17  33  49  65  81  97 113 129 145 161 177 193 209 225 241 
  2  18  34  50  66  82  98 114 130 146 162 178 194 210 226 242 
  3  19  35  51  67  83  99 115 131 147 163 179 195 211 227 243 
  4  20  36  52  68  84 100 116 132 148 164 180 196 212 228 244 
  5  21  37  53  69  85 101 117 133 149 165 181 197 213 229 245 
  6  22  38  54  70  86 102 118 134 150 166 182 198 214 230 246 
  7  23  39  55  71  87 103 119 135 151 167 183 199 215 231 247 
  8  24  40  56  72  88 104 120 136 152 168 184 200 216 232 248 
  9  25  41  57  73  89 105 121 137 153 169 185 201 217 233 249 
 10  26  42  58  74  90 106 122 138 154 170 186 202 218 234 250 
 11  27  43  59  75  91 107 123 139 155 171 187 203 219 235 251 
 12  28  44  60  76  92 108 124 140 156 172 188 204 220 236 252 
 13  29  45  61  77  93 109 125 141 157 173 189 205 221 237 253 
 14  30  46  62  78  94 110 126 142 158 174 190 206 222 238 254 
 15  31  47  63  79  95 111 127 143 159 175 191 207 223 239 255 

after

     DIMENSION 0 (X)  ----->

  1  17  33  49  65  81  97 113 129 145 161 177 193 209 225 241 
  2  18  34  50  66  82  98 114 130 146 162 178 194 210 226 242 
  3  19  35  51  67  83  99 115 131 147 163 179 195 211 227 243 
  4  20  36  52  68  84 100 116 132 148 164 180 196 212 228 244 
  5  21  37  53  69  85 101 117 133 149 165 181 197 213 229 245 
  6  22  38  54  70  86 102 118 134 150 166 182 198 214 230 246 
  7  23  39  55  71  87 103 119 135 151 167 183 199 215 231 247 
  8  24  40  56  72  88 104 120 136 152 168 184 200 216 232 248 
  9  25  41  57  73  89 105 121 137 153 169 185 201 217 233 249 
 10  26  42  58  74  90 106 122 138 154 170 186 202 218 234 250 
 11  27  43  59  75  91 107 123 139 155 171 187 203 219 235 251 
 12  28  44  60  76  92 108 124 140 156 172 188 204 220 236 252 
 13  29  45  61  77  93 109 125 141 157 173 189 205 221 237 253 
 14  30  46  62  78  94 110 126 142 158 174 190 206 222 238 254 
 15  31  47  63  79  95 111 127 143 159 175 191 207 223 239 255 
  0  16  32  48  64  80  96 112 128 144 160 176 192 208 224 240 
NIL

若干見難い気がしますが、定義したzig-zagという関数がグリッド上の値をごっそり移動しているのが分かると思います。

ということで、次回、3.3.5から再開。

2008-08-26

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

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

来週もCL勉強会は開催させて頂きます!

今回は、cl-cookbookより関数篇です。恐らくこれだけだと尺が余ってしまうので、続けてIO篇に進みます。

場所:Lingr: Common Lisp部屋
日時8/30 (土) 20:00から適当(途中参加/離脱/ROM歓迎)
勉強会の進行テキストを最初から参加者が眺めてゆき、質問があったり、議論になりそうなことがあったら議論してゆきます。
勉強会の目標CLに関して一つ位賢くなった気になること
時刻お題対象者参考リンク
20:00-21:30位までThe Common Lisp Cookbook(関数〜IO篇)CLで色々書く(書きたい)方The Common Lisp Cookbook - Functions

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

2008-08-25

8/23第13回慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ

| 21:52 | 8/23第13回慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ - わだばLisperになる を含むブックマーク はてなブックマーク - 8/23第13回慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ - わだばLisperになる

昨日、8/23 20:00から13回目の勉強会を開催させて頂きました!

発言して頂いた方約9名、observer(ROM)の方約11名前後で、大体19名前後を推移しつつでした。

今回のお題は、cl-cookbookよりハッシュ篇でした。

反省と課題

割とバランス良く進めたかなと思いました。時間がちょっと余ったので、cookbookのパターンマッチ/正規表現篇を議論。

ログ:

http://www.lingr.com/room/common-lisp-jp/archives/2008/08/23#msg-45490708

謝辞

ページへの勉強会のロゴ設置ありがとうございます!

今回も勉強会の一員に加えて頂いてありがとうございます!

2008-08-20

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

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

来週もCL勉強会は開催させて頂きます!

今回は、cl-cookbookよりハッシュ篇です。時間内に終ってしまったら、次のパターンマッチングに進みます。

場所:Lingr: Common Lisp部屋
日時8/23 (土) 20:00から適当(途中参加/離脱/ROM歓迎)
勉強会の進行テキストを最初から参加者が眺めてゆき、質問があったり、議論になりそうなことがあったら議論してゆきます。
勉強会の目標CLに関して一つ位賢くなった気になること
時刻お題対象者参考リンク
20:00-21:30位までThe Common Lisp Cookbook(ハッシュ篇)CLで色々書く(書きたい)方The Common Lisp Cookbook - Hash Tables

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

2008-08-18

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

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

昨日、8/16 20:00から12回目の勉強会を開催させて頂きました!

発言して頂いた方約10名、observer(ROM)の方約8名前後で、大体18名前後を推移しつつでした。

お盆真最中にありがとうございました!

今回のお題は、CLの落し穴の続きでパッケージ篇〜CLOS篇でした。

反省と課題

序盤人が少ないながらも、なんとか回った。雑談タイムで、Lingrの調子が急激に悪くなり接続できなくなる。オンラインの場合、勉強会の最中にこのような事態になることも考えられるので、予備の勉強場所を考える必要があるかも。

ログ:
宿題的なもの

謝辞

ページへの勉強会のロゴ設置ありがとうございます!

今回も勉強会の一員に加えて頂いてありがとうございます!

2008-08-15

CLでマルチスレッド (2)

| 01:25 | CLでマルチスレッド (2) - わだばLisperになる を含むブックマーク はてなブックマーク - CLでマルチスレッド (2) - わだばLisperになる

今回のお題は、一つのデータを複数のスレッドで分割して処理して効率化を狙うというもの。

(defpackage :ppb-data-split
  (:use :cl :portable-threads))

(in-package :ppb-data-split)

(defparameter *data* #(0 1 2 3 4 5 6 7 8 9))

(defun thread-func (name data)
  (declare (array data))
  (map nil (lambda (x)
             (format t "~A:~A + 1 = ~A~%" name x (1+ x)))
       data))

;; 実行
(do ((ths (list (spawn-thread "thread0" (lambda () (thread-func "thread0" (subseq *data* 0 4))))
                (spawn-thread "thread1" (lambda () (thread-func "thread1" (subseq *data* 4)))))))
    ((notany #'thread-alive-p ths) 'done))

;thread0:0 + 1 = 1
;thread0:1 + 1 = 2
;thread0:2 + 1 = 3
;thread0:3 + 1 = 4
;thread1:4 + 1 = 5
;thread1:5 + 1 = 6
;thread1:6 + 1 = 7
;thread1:7 + 1 = 8
;thread1:8 + 1 = 9
;thread1:9 + 1 = 10
;=> DONE

ベクタを半分に分割してスレッドに与えてみています。

ちなみに、自分はLISP系以外の言語が、からきし読めないので元コードが一体どんな感じなのか分かっておらず、元のコードを翻訳したものでは全くありません…。

前回もスレッドの終了をループを回して待機しているわけなのですが、一体これで良いのだろうか?無駄にCPUを使ってるんじゃないか?という疑問がわいてきました。待機のための専用の関数とかありそうな気が…。

とりあえず、先にcl-cookbookのスレッドの項目を実習して方が良いのかもという気も。

2008-08-14

CLでマルチスレッド (1)

| 01:55 | CLでマルチスレッド (1) - わだばLisperになる を含むブックマーク はてなブックマーク - CLでマルチスレッド (1) - わだばLisperになる

図書館でなんとなく「マルチコアCPUのための並列プログラミング—並列処理&マルチスレッド入門」という本を借りてきたのでなんとなくCLで例題を試して行ってみることにしました。

ANSI CLでは、スレッドについて規格が定まってはいないので、処理系依存となりますが、Allegro等のMPパッケージ等なんとなくそれなりに有名なものがあるようです。

これといった決め手もあるようなないような感じですが、処理系の差異を吸収しようという、Bordeaux Threadsや、Portable Threads等のパッケージがあるので、自分は、こちらの方を使ってみることにしました。そのうちAllegro系も試してみたいと思っています。

最初のお題の内容は、とりあえずスレッドを2つ作成して走らせてみよう、というもの。

生成→子スレッドの終了まで待機 という流れです。

(defpackage :ppb-first-thread
  (:use :cl :portable-threads))

(in-package :ppb-first-thread)

(defun thread-func (num lim)
  (dotimes (i lim)
    (format t "thread~A: ~A + 1 = ~A~%" num i (1+ i))
    (sleep (random 2))))

(do ((ths (list (spawn-thread "thread0" (lambda () (thread-func 0 10)))
                (spawn-thread "thread1" (lambda () (thread-func 1 10))))))
    ((notany #'thread-alive-p ths) 'done))

; thread0: 0 + 1 = 1
; thread0: 1 + 1 = 2
; thread0: 2 + 1 = 3
; thread1: 0 + 1 = 1
; thread1: 1 + 1 = 2
; thread1: 2 + 1 = 3
; thread1: 3 + 1 = 4
; thread0: 3 + 1 = 4
; thread1: 4 + 1 = 5
; thread1: 5 + 1 = 6
; thread0: 4 + 1 = 5
; thread0: 5 + 1 = 6
; thread0: 6 + 1 = 7
; thread0: 7 + 1 = 8
; thread0: 8 + 1 = 9
; thread0: 9 + 1 = 10
; thread1: 6 + 1 = 7
; thread1: 7 + 1 = 8
; thread1: 8 + 1 = 9
; thread1: 9 + 1 = 10
;=> DONE

sleepは入れなくても良いのですが、結果がばらけないと見た目が面白くないのでなんとなく入れてみました(*'-')

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等に書き置きしてみて下さい。好きなテーマを持ち込んでみて頂くというのも大歓迎です!

2008-08-10

8/9 第11回 慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ

| 16:48 | 8/9 第11回 慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ - わだばLisperになる を含むブックマーク はてなブックマーク - 8/9 第11回 慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ - わだばLisperになる

昨日、8/9 20:00から11回目の勉強会を開催させて頂きました!

発言して頂いた方約12名、observer(ROM)の方約8名前後で、大体20名前後を推移しつつでした。

今回は、cl-cookbookより日時と時刻篇でした。

内容としては、特に難しい問題もなく、するっと流れる感じでした。後半、暦の問題について盛り上りました。暦は色々と複雑なところがあるので、挑戦しがいのあるテーマのようです。

反省と課題

ちょっとお題の量が少なめで、尺が余ってしまった。

ログ:

謝辞

ページへの勉強会のロゴ設置ありがとうございます!

今回も勉強会の一員に加えて頂いてありがとうございます!

2008-08-08

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

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

9.6 リストの変更と 一般化set!

Gaucheのように一般化されたset!は、CLにもclsetfという名前で存在しています。

読み出して来た場所に値を格納するというのは便利で、Schemeより代入を使う傾向のあるCLでは、仲間が沢山あり、また、このsetfをカスタマイズする構文が用意されています。(defsetf foo ...)や、(defun (setf foo) ..)等。

〜fという系統や、push、pop等の仲間が読み出して来た場所に代入する代表的なものかと思います。

(let ((foo (copy-tree '(1 2 3 (4 (5 6 7 8 9))))))
  ;; 値を代入
  (setf (first foo) 1000)

  ;; 2番目の数を1000増加させる
  (incf (second foo) 1000)

  ;; 4番目のリストをポップ
  (pop (fourth foo))

  ;; 4番目のリストにプッシュ
  (push 888 (fourth foo))

  ;; 4番目のリストにプッシュ
  (push 999 (fourth foo))
  foo)

;==>(1000 1002 3 (999 888 (5 6 7 8 9))))

2008-08-06

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

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

9.5 名前つきlet

Schemeには名前つきletがありますが、CLのletにはそういった拡張はありません。

近いところでは、局所関数のlabels位になるかと思います。

また、処理系によっては、named-let等の名前で隠し持っていることもあるようです。

調べた限りでは、SBCLだと、named-let、cmuclだとiterateというのを見付けられました。

どちらも、labelsに展開されるマクロですが…。

使用上の注意点としては、Schemeと違って末尾再帰の最適化をしてくれるとは限らないので、ループと全く同じ感覚で使うためには、それなりに処理系に応じて下調べが必要だと思われます。

(defun fact (n)
  (labels ((*fact (n acc)
             (if (zerop n)
                 acc
                 (*fact (1- n) (* acc n)))))
    (*fact n 1)))

;; SBCL
(import 'sb-impl::named-let)

(defun fact-2 (n)
  (named-let *fact ((n n) (acc 1))
    (if (zerop n)
        acc
        (*fact (1- n) (* acc n)))))

;cmuclだとiterateという名前で存在。

2008-08-03

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

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

来週もCL勉強会は開催させて頂きます!

今回は、cl-cookbookより日時と時刻篇です。時間内に終ってしまったら、CLの落し穴の続きで埋めます。

CLでの時間の扱いも割と癖があると思うので疑問に思ったことなどガンガン質問してみてください!

場所:Lingr: Common Lisp部屋
日時8/9 (土) 20:00から適当(途中参加/離脱/ROM歓迎)
勉強会の進行テキストを最初から参加者が眺めてゆき、質問があったり、議論になりそうなことがあったら議論してゆきます。
勉強会の目標CLに関して一つ位賢くなった気になること
時刻お題対象者参考リンク
20:00-21:30位までThe Common Lisp Cookbook(日時と時刻篇)CLで色々書く(書きたい)方The Common Lisp Cookbook - Dates and Times

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

8/2 第10回 慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ

| 17:59 | 8/2 第10回 慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ - わだばLisperになる を含むブックマーク はてなブックマーク - 8/2 第10回 慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ - わだばLisperになる

昨日、8/2 20:00から9回目の勉強会を開催させて頂きました!

発言して頂いた方約5名、observer(ROM)の方約15名前後で、大体20名前後を推移しつつでした。

今回は、CLの落し穴の続きでした。

反省と課題

今回、発言された方は5名ということで、少なくて寂しかったのですが、原因としては、お題の難易度がちょっと高めだったということが挙げられるかもしれません。

解釈自体困難なものもあったりで、発言するのも難しかったかもしれません。

また、今回で、CLの落し穴篇は完結にしたかったのですが、このペースだと、あと一回分位の分量があるかもしれません。残りも解釈が難しい微妙なものがあります…。

ログ:

宿題的なもの

謝辞

ページへの勉強会のロゴ設置ありがとうございます!

今回も勉強会の一員に加えて頂いてありがとうございます!

LingrのCommon Lisp部屋のURLを変更しました。

| 15:22 | LingrのCommon Lisp部屋のURLを変更しました。 - わだばLisperになる を含むブックマーク はてなブックマーク - LingrのCommon Lisp部屋のURLを変更しました。 - わだばLisperになる

LingrのCommon Lisp部屋を作ったのは私だったのですが、好きなURLを設定できることを知らず、知った時にはある程度リンクも貼られるようになっていたので、URL名の変更には躊躇していたのですが、前のURLでもアクセスできるようなので、思い切って変更してみました。

新しいURLは、

です。

ちょっと長いですが…。

ちなみに旧URLは

という謎のものでした…。

こちらでもアクセスはできるので、リンクの変更等は必要ないようです。

2008-08-01

Common Lispと改行コード (2)

| 12:11 | Common Lispと改行コード (2) - わだばLisperになる を含むブックマーク はてなブックマーク - Common Lispと改行コード (2) - わだばLisperになる

前回中途半端なエントリだったお蔭なのか所為なのか、Common Lispと改行コードのエントリについてLingrでも色々議論して頂き、コメントも頂きという感じでした。

それで、一通りの流れをまとめますと、

  1. 改行コードは処理系毎に external-formatに指定するのが一般的
  2. SBCLがその辺に対応できてない様子

という感じで、敢えて文字列を加工するとしたら、deleteや、string-trimで、ということみたいです。

ちなみに前回の自分のpositionを使ったものだと、#\Returnを探しているので、途中に#\Returnが出現した場合、それ以降を失なってしまいます…。

それと、zickさんの元エントリを良く読むと、「書き込むときは~%一発で済ませたいものです。」とのことで自分は問題を半分しか把握してませんでした(^^;

ですよね、書き込みも統一したいですよねと。

その辺も含めると、いまのところexternal-formatで指定するのが一番のようです。

処理系が対応してれば、のようで残念ながらSBCLでは対応してないんですよね。

ということでSBCL以外は、標準でなんとかできるようなので、SBCL+flexi-streamsで考えてみました。

;; CR+LF(DOS)で読んで、CR(Mac)で書き出す
(with-open-file (in "/tmp/crlf-in.txt" :element-type '(unsigned-byte 8))
  (with-open-file (out "/tmp/crlf-out.txt" :direction :output :if-exists :supersede :element-type '(unsigned-byte 8))
    (let ((in (flexi-streams:make-flexi-stream in :external-format :utf-8))
          (out (flexi-streams:make-flexi-stream out :external-format :utf-8)))
      (setf (flexi-streams:flexi-stream-external-format in) '(:utf-8 :eol-style :crlf)) ;crlf
      (setf (flexi-streams:flexi-stream-external-format out) '(:utf-8 :eol-style :crlf)) ;cr
      ;; 処理本体 -- この例では読んで書くだけ
      (loop :for line := (read-line in nil nil) :while line
            :do (format out "~A~%" line)))))

しかし、これだとflexi-streamが日本語のエンコードで身近なところだとUTF-8にしか対応してないので、EUC-JP、SJIS、JISでは駄目なんですねー。

SBCLもexternal-formatで改行指定できるようになるか、flexi-streamが色々対応してくれるかしてくれると良いんでしょうか。

また、前回の「たしか、#\Linefeedや、#\Returnという文字のCLでの扱い自体にも問題があったような…。」といううろ覚えは、#\Newlineの扱いの変化についてでした。

上の例でも、~%が#\Newlineを出力している訳なのですが、この場合は、CR+LFで出力しています。