質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Scheme

Schemeは、Lispから派生したプログラミング言語の一つであり、仕様または実装を指す場合もあります。言語自体の仕様はシンプルで、関数型言語として理解しやすいことから記号処理などで主に用いられている言語です。

Q&A

解決済

1回答

1113閲覧

Gauche: レストパラメータが働かない?

kasanegi

総合スコア20

Scheme

Schemeは、Lispから派生したプログラミング言語の一つであり、仕様または実装を指す場合もあります。言語自体の仕様はシンプルで、関数型言語として理解しやすいことから記号処理などで主に用いられている言語です。

0グッド

1クリップ

投稿2018/10/27 03:22

レストパラメータなしのコード

Gauche

1(define avg 2 (lambda (ls) 3 (let loop ((sum 0) (ls1 ls)) 4 (if (null? ls1) 5 (/ sum (length ls)) 6 (loop (+ sum (car ls1)) (cdr ls1)))))) 7(avg (list 1 2 3 4 5))

---> 3

レストパラメータありのコード

Gauche

1(define avg 2 (lambda ( . ls) 3 (let loop ((sum 0) (ls1 ls)) 4 (if (null? ls1) 5 (/ sum (length ls)) 6 (loop (+ sum (car ls1)) (cdr ls1)))))) 7(avg 1 2 3 4 5)

--->
*** READ-ERROR: Read error at "(standard input)":line 114: bad dot syntax
以下 ls が定義されていない等のエラー

質問

こちらのチュートリアル(http://www.shido.info/lisp/scheme4.html)に従って勉強しているのですが、掲載の方法ではレストパラメータが使えないように思えます。
お手数をおかけしますが、Gaucheでレストパラメータを使用する方法をお教えいただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Scheme(Lisp)のデータ構造から説明すると、(a b c)(a b c . ())と同じです。ざっくりいうと.の右は、リストの末尾を表し、これが()(Common Lisp等ではnil)である場合は.ごと省略できます。これは説明すると長くなるので、「ドット対」または「点対」の用語で調べてください。

結論としては、( . ls)というのは無効な表記です。質問のコードのうち、lambdaの行を次のように変えると正しい文法になるはずです。

Scheme

1 (lambda ls

投稿2018/10/27 05:44

emasaka

総合スコア524

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kasanegi

2018/10/27 06:04

回答ありがとうございます! 確かにご教授いただいた方法でうまくいきました。 実装を見ていないので自分なりの解釈ですが、 ① 呼び出し時に与えられた引数たちはいったん一つのリストに、まとめられる。 ② 関数定義の引数の記法に従って、リストから各変数にアンパックしていく。 ③ その時「1個以上前の値がアンパックされた時の残りの値のリスト」を格納する変数の記法が「(~ . ls)」などのドットで区切る記法である。 ④ よって、今回のような場合には、アンパックのためにカッコでくくったりせずにそのまま代入すればよい。 というようなことでしょうか? 重ね重ねすみません。
emasaka

2018/10/27 06:10

はい。各処理系が効率的に処理するための内部実装がどうなっているかはまた別ですが、言語のモデルとしてはそれで合っていると思います。
kasanegi

2018/10/27 07:47

なるほど。 いずれは自分で実装もしてみたいと思います。 回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問