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

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

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

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

Q&A

解決済

1回答

325閲覧

Schemeのコード中に現れる「'」「`」「,」とは

ruei

総合スコア284

Scheme

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

0グッド

0クリップ

投稿2018/10/07 13:58

Schemeのコードを解読しています。
libctl/io-vars.scm
の25-27行目を見ると、

Scheme

1(define params-set-list '()) 2(defmacro-public define-param (name value) 3 `(define ,name (if (defined? (quote ,name)) ,name ,value)))

の中に「'」「`」「,」という他の言語では見慣れない記号が使われています。

この「'」「`」「,」という記号は何を表しているのか、ご存じでしたらご教示ください。

このdefine-paramというマクロは

Scheme

1(define-param var-name var-value)

とすると、変数var-nameが宣言され、値var-valueが代入されます。
プログラムを呼び出すときに

gosh sample.scm var-name=321

とするとvar-nameに321という値をコマンドラインから代入することができるようになる点が(define var-name var-value)と異なっており、便利なマクロです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

'は直後のS式1つをクォートします。たとえば(+ 1 1)を評価すると2になりますが、'(+ 1 1)を評価すると(+ 1 1)になります。

`は準クォートと呼ばれ、'と似たものです。ただし途中で,が出てくると、その直後のS式1つだけ評価されます。たとえば `(+ ,(+ 1 1) 1)を評価すると(+ 2 1)になります。

投稿2018/10/07 14:35

emasaka

総合スコア524

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

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

ruei

2018/10/07 14:54

回答ありがとうございます。 変数名nameやvalueを評価するorしないという意味をもうすこし教えてもらえないでしょうか (なぜここにクオートが必要なんでしょうか)
emasaka

2018/10/07 15:15 編集

マクロを呼び出すと、定義されている式を評価して式を作り(マクロ展開)、それを更に評価します。たとえばdefine-paramを呼び出すと、`(define 〜)という式を評価するので、(define 〜)という式にマクロ展開され、それが評価されます。このマクロ展開で、たとえば,nameとある部分ではマクロの変数nameが評価されるので、上の例ではvar-nameという変数名が(define 〜)の式に入った形に展開されます。同様に、(defined? (quote ,name))は(defined? (quote var-name))、つまり(defined? 'var-name)に展開されます。
ruei

2018/10/07 15:24 編集

何回もすみません。 (define name (if (defined? name) name value))) だと何が不味いのでしょうか。
emasaka

2018/10/07 16:21

(define name 〜)だと、文字どおりnameという変数が定義されます。でも(define-param var-name var-value)と書いたときには、nameではなくvar-nameという変数が定義されてほしいはず。
ruei

2018/10/07 16:34

あー、なるほど・・・。defineの評価を、nameにvar-nameを代入するより遅らせたいってことですね。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問