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 |

2011-06-01

CLでSRFI-11

| 19:43 | CLでSRFI-11 - わだばLisperになる を含むブックマーク はてなブックマーク - CLでSRFI-11 - わだばLisperになる

一日1SRFIな感じで進めていますが、今回は、SRFI-11 です。

SRFI-8と同じくSRFI-11も多値の束縛のための構文ですが、こんなに近い番号で似たようなものがあるというのも不思議な気もします。ざっとSRFIを眺めると当然かもしれませんが後に出て来た方が大抵は機能が豊富なようです。

それで、その機能が豊富なところですが、receiveは一つのフォームを束縛するのみでしたが、let-valuesは多段をサポートします。

(use-package :srfi-11)

(let-values (((x y z) 
              (values 1 2 3))
             ((a b c) 
              (values 1 2 3))
             ((d e f) 
              (values 1 2 3)))
  (list x y z a b c d e f))
;=> (1 2 3 1 2 3 1 2 3)

(let*-values (((x y z) 
               (values 1 2 3))
              ((x y z) 
               (values x y z))
              ((x y z) 
               (values x y z)))
  (list x y z))
;=> (1 2 3)

という風にletとlet*のお約束もそのままというところ。

多段にしたため、括弧の入れ子が1段増えてしまいますが、括弧好きな自分でも、3階層位で構造を見失いかけるのでこの辺りが限界かなと感じます。

上のように改行すれば、まだなんとか大丈夫ではありますが。

ちなみにGoogle コード検索で調べてみたところではCLでlet-valuesを自作している人はちらほらいるようです。

多段のMULTIPLE-VALUE-BINDが欲しい場合はたまにあるかもしれないですね。