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

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

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

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

Q&A

解決済

2回答

417閲覧

Schemeのコードに出てくるdefined?の実装箇所が見たい

ruei

総合スコア284

Scheme

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

0グッド

0クリップ

投稿2018/10/07 16:12

編集2018/10/07 16:15

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

Scheme

1(defmacro-public define-param (name value) 2 `(define ,name (if (defined? (quote ,name)) ,name ,value)))

の中にdefined?という単語があります。

このdefined?の実装箇所やドキュメントを、ご存じでしたらご教示ください。

Googleで"Scheme defined?"で検索しても関係しそうなものは出てこないです。

また、libctlのフォルダ内を

bash

1grep defined? -rl .

にて検索して出てきた
./base/interaction.scm
./base/io-vars.scm
./base/math-utils.scm
./utils/geom.scm
の中を見てみましたが、定義箇所を見付けられませんでした。

この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

回答2

0

defined? は Scheme 処理系 Guile に固有の機能です。

https://www.gnu.org/software/guile/manual/html_node/Binding-Reflection.html

libctl は README の冒頭に Guile-based と明記されていますし、ざっと見た感じではその他にも Guile に依存しているようです。 他の処理系でも defined? (またはそれに相当する機能) を持っていることもありますが、言語仕様に含まれるものではありません。


もし処理系が defined? を提供していない場合に、ある変数が定義済みかどうかを検出できるかというのはやってみたことがあります。 R6RS を前提とするのであれば可能です。

https://saito.hatenablog.jp/entry/2012/09/14/010849

ただ、これはややアクロバティックで、読み解くのは難しいかもしれません。

投稿2018/10/07 17:33

SaitoAtsushi

総合スコア5444

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

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

ruei

2018/10/07 17:54

Guile固有の機能だったのですね。ありがとうございます。
ruei

2018/10/07 18:04

(if (defined? 'a) (write 1) (write -1)) を、gaucheで動かすと *** ERROR: unbound variable: defined? と言われて困っていたのですが、guileだと無事に動きました。 gaucheをインストールするときにguileがインストールされていたので、同じ物かと思っていたのですが違うのですね。 ありがとうございます。
guest

0

ベストアンサー

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

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

ruei

2018/10/07 17:30

ありがとうございます! 差し支えなければ、どう検索したか教えていただけないでしょうか。
emasaka

2018/10/07 17:36

libctlはライブラリでその中でSchemeを呼んでいるらしい → Schme処理系はGuileかな → libctlのconfigure.acやドキュメントによるとやはりGuileらしい → Guileのドキュメントとソースを検索、という感じでしょうか。
ruei

2018/10/07 17:41

ありがとうございます。 Googleで"site:https://www.gnu.org/software/guile/manual/html_node/ defined?"とすると、確かに19番目に出てくるのですが、「Guileのドキュメントとソースを検索」とはこのような方法でしょうか。
emasaka

2018/10/07 18:15

Guileのドキュメントで「defined?」を検索する、Guileのソースで「defined?」を検索する、といった意味です。
ruei

2018/10/07 18:33

すみません。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問