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

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

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

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

Q&A

解決済

1回答

1519閲覧

【scheme】letの使い方がわかりません。。

tetsutail_study

総合スコア25

Scheme

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

0グッド

0クリップ

投稿2020/08/19 18:14

前提・実現したいこと

下のソースコードのような関数を作りyに関数を与えて、そのうちの**という表記をexptに、xを引数で与えたtに置き換えて評価してyの値を計算させたいのですが、下のようなエラーが出てしまいます。どうしたら良いでしょうか?
以下のように引数を与え、このようなエラーが出ています。
初心者のため、何か大きく勘違いしてそうなのですが、よろしくお願いします。

(myeval '(+ (** x 4) (** x 3) 1) 3) **: undefined;

該当のソースコード

scheme

1(define myeval 2 (lambda (y t) 3 (let ((** expt) (x t)) 4 (eval y (interaction-environment)) 5 ) 6 ) 7) 8

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

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

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

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

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

guest

回答1

0

ベストアンサー

let というより eval の使い方がおかしいですね。 通常は interaction-environment が返す環境というのはトップレベルでの束縛です。 つまり、質問の事例では **x は含まれないことになります。

eval の (または eval に関連する) 仕様については仕様の改定ごとにも若干の変更がありますが、ローカル変数を捕捉する方法はありません。

どうしても eval でそのようなことをしたいということであれば以下のようにすればたぶん動くでしょう。

(define ** expt) (define x #f) (define (myeval y t) (set! x t) (eval y (interaction-environment))) (myeval '(+ (** x 4) (** x 3) 1) 3)

新しい仕様ではもう少しまっとうな方法があるのですがそれを説明するのは煩雑なのでここでは述べません。


質問の趣旨としては leteval を理解したいということなのだと思いますが、リストの操作を自分でやって式の解を出すならこのような要領で書くこともできます。 (質問中の例を処理できるだけのとても簡単なものですが。)

(define (myeval y t) (if (list? y) (case (car y) ((**) (apply expt (map (lambda(x)(myeval x t)) (cdr y)))) ((+) (apply + (map (lambda(x)(myeval x t)) (cdr y))))) (case y ((x) t) (else y))))

投稿2020/08/19 20:01

SaitoAtsushi

総合スコア5437

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

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

tetsutail_study

2020/08/20 03:06

ありがとうございます!とても参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問