5020


普段、Lisp処理系としてRacketを利用することが多く、見よう見まねでスクリプトを書いています。その中で、Racketでは`[]`という括弧を利用することが多々あります。具体的には`let`と`cond`の中で使われますが、この括弧の挙動が漠然としていて、自分の中でモヤモヤしてしまいます。

具体的なコードを挙げると、下のようになります:

[code]

    #lang racket
    (define (plus-one x)
       (let ([plus-one-x (+ x 1)]) plus-one-x))
    
    (define (fizzbuzz x)
       (cond [(= (modulo x 15) 0) "FizzBuzz"]
             [(= (modulo x 3) 0) "Fizz"]
             [(= (modulo x 5) 0) "Buzz"]
             [else x]))
    
[/code]

具体的に[Document](http://docs.racket-lang.org/reference/eval-
model.html#%28part._.Tail_.Position%29)も読んでみたのですが、自分の読解力だと、どのような挙動をするものなのか、いまいちピンと来ません。

この`[]`の挙動について、具体的にどのような役割と、挙動をするものなのでしょうか?


CC BY-SA 3.0
2015-01-21T12:08:10.263
5004
2015-01-21T21:59:29.283
2015-01-21T12:27:27.033
939
939
question
lisp
`[]`という括弧の役割とその挙動がよくわからない


<http://docs.racket-lang.org/reference/reader.html?q=%5B#%28part._parse-
pair%29>

> When the reader encounters a `(`, `[`, or `{`, it starts parsing a pair or
> list; see Pairs and Lists for information on pairs and lists.
>
> To parse the pair or list, the reader recursively reads data until a
> matching `)`, `]`, or `}` (respectively) is found, and it specially handles
> a delimited `.`. Pairs `()`, `[]`, and `{}` are treated the same way, so the
> remainder of this section simply uses “parentheses” to mean any of these
> pair.

マニュアルによれば`()`, `[]`, `{}`の意味上の違いはないとしています。括弧を書き分ける事で、対応関係を読み取りやすくなります。

括弧`[]`, `{}`については、パラメータ変更でその解釈を切り替えられます。（括弧`()`と同等として扱うか否か）

> If the `read-square-bracket-as-paren` parameter is set to `#f`, then when
> the reader encounters `[` and `]`, the `"exn:fail:read"` exception is
> raised. Similarly, if the `read-curly-brace-as-paren` parameter is set to
> `#f`, then when the reader encounters `{` and `}`, the `"exn:fail:read"`
> exception is raised.


CC BY-SA 3.0
2015-01-21T14:39:30.133
5012
2015-01-21T14:47:44.903
2015-01-21T14:47:44.903
49
49
5004
answer


SchemeのR6RSでは、()と[]は同様に利用できるため、まとまりを強調したりするのに使えます。

使い分けについて:  
* Use of square brackets: <http://www.r6rs.org/final/html/r6rs-app/r6rs-app-Z-H-5.html#node_chap_C>  
* Gauche ユーザーリファレンス: <http://practical-scheme.net/gauche/man/gauche-refj_22.html>

Racketは、R6RSをベースにしたScheme方言という形で枝分かれしましたが、独自拡張で、{}も使えるのだと思います。


CC BY-SA 3.0
2015-01-21T21:59:29.283
5020
2015-01-21T21:59:29.283
3510
5004
answer