Hatena::Groupcadr

'T このページをアンテナに追加 RSSフィード

2011-07-03

CLでSRFI-71

| 23:09

昨日の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)