2011-07-03
CLでSRFI-71
SRFI, Common Lisp |
昨日のSmiley Hackathon #10でちょっと手をつけて挫折していたSRFI-71ですがパターンマッチが上手く行かない理由が分かって動くようになりました。
その原因ですが、Schemeの場合は変数としてtが使われていることは普通なのですが、あまり注意していなかったのでCL:Tが紛れ込んでいて、パターンマッチが意図しない方向にマッチしていたというオチでした (CL:Tは定数なので変数とは違ったマッチになる) 。
さてそのSRFI-71ですが、多値を受けるLET構文の拡張です。
自分が移植したSRFIでも多値があつかえる束縛構文はこれで4つ目な気がするんですが、SRFIでは思いの外同じ分野の提案が繰り返し提案される傾向があるように思います。
■
また、SRFI-71では、unconsや、unlistも一緒に定義されていたりするのですが、ネーミングがなかなか良いなと思いました。
SRFI-11のlet-valuesと違うところといえば、値を受けるところにも (values v ...)という表記を使うことと、values省略して値を並べて書くこともできる、というところでしょうか。
(in-package :srfi-71-internal) (let (((values x1 x2 . x2+) (values 1 2 3))) (cons x1 (cons x2 x2+))) ;=> (1 2 3) (let ((car cdr (uncons '(1 2)))) (cons car cdr)) ;=> (1 2) (let (((values car cdr) (uncons '(1 2)))) (cons car cdr)) ;=> (1 2) (let (((values . args) (unlist '(1 2 3 4 5)))) args) ;=> (1 2 3 4 5)
ちなみに我等がSRFI-86でも同じような構文がサポートされています
(alet (((values . args) (values-list '(1 2 3 4 5)))) args) ;=> (1 2 3 4 5) (alet (((values x1 x2 . x2+) (values 1 2 3))) (cons x1 (cons x2 x2+))) ;=> (1 2 3)
■
Smiley Hackathon #10に参加してきました!
7/2(土)にSmiley Hackathon #10またまた参加させて頂きました!
今回も主催の d:id:acotie さん #10会場提供のGaiaXさんありがとうございました。
自分は、#4、#5、#6、#7、#9と参加しているので、今回で6回目。
やってたこと
SRFIの文字列ライブラリ srfi-13をこのハッカソンで仕上げようと思っていましたが、思いの外手強いのと実装にあたりchar-setというものが定義されているのが前提なところがあり中途半端な感じに。
時間があまったので、別のSRFIで手頃なものはないかと探してみたところ、SRFI 71: Extended LET-syntax for multiple valuesがあったので、これをCLに移植することに挑戦。
こっちは比較的楽勝なものを選んだ筈でしたが、マクロの展開が上手くいかず展開のデバッグにも行き詰まり頓挫。define-syntaxのデバッグの勘が全然浅いためなかなか展開の遷移が追い掛けられません。何か簡単に追い掛けられる方法を模索したいところ。
交流
前回に引き続きArcの@mgikenさんと@inuzini_jiroさんを交えつつArcネタで盛り上がりました。
Arc素晴らしいですね!!
是非また参加したいです!
■