問題タブ [r5rs]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
import - r5rs で未定義の ADT
r5rs で ADT を作成しており、DrRacket を使用しています。#lang r5rs
ファイルの先頭に置き、DrRacket のソースから言語を決定を選択しましたが、ADT が定義されていないことがわかります。DrRacket バージョン 6.0 を使用しています。こんなことは初めてで、何が悪いのか理解できません。
私のADT
my-ADT のインスタンスを作成しようとすると、次の出力が得られます。my-ADT: undefined; cannot reference an identifier before its definition
DrRacket の言語を上から外してR5RS#lang r5rs
を選択すると動作するようです。しかし、その後、私のファイルはまだ上部にあり、Define Language from Sourceがあります。リモートでそのファイルの言語としてR5RSを選択すると、ファイルに次のように表示されます。queue.rkt
#lang r5rs
#lang r5rs
my-ADT
macros - SISC/Scheme で別のマクロを生成するマクロを作成するには?
Guile または SRFI-46 を使用すると、 Specifying a Custom Ellipsis Identifierに示すように可能です。しかし、SISCまたは「純粋なスキーム」R5RSで可能ですか?
省略記号を使用しなくても可能であることはわかっていますが、次の例のように内側の省略記号を使用する必要がある場合はどうすればよいでしょうか?
scheme - 関連同等の手順が正しく機能していません
私は、Scheme の assoc に似た手順を書こうとしています。2 つの唯一の違いは、プロシージャが指定されたキーに関連する値のみを返すようにすることです。 assoc はペア全体 (key . value) を返します。これが私の手順です:
私は正しい軌道に乗っているようです -- (search-list 'a alist) は 1 を返します。しかし、(search-list 'b alist) でテストすると、これが私の出力です: ((b . 2) (c . 3) )))
自分の手順が意図したとおりに機能しない理由がわかりません。私の手順の誤りを指摘していただけると大変嬉しく思います。前もって感謝します。
inheritance - 拡張可能なマクロ定義
マクロではなく関数に関する関連する質問のコメント スレッドに触発されました。
新しい定義で構文の以前の定義を使用できるように、Scheme 構文定義を拡張する方法はありますか? さらに、これは拡張可能である必要があります。つまり、技術を複数回連鎖させることが可能でなければなりません。
たとえば、でlambda
定義された関数が呼び出されるたびにlambda
、関数本体を実行する前に「foo」を出力するように拡張したいとします。これは次の方法で行うことができます。
次のようにして、これを別の方法で拡張することもできます (たとえば、「バー」を印刷することによって)。
最終的に、 new で定義された関数lambda
は、呼び出されるたびに「foo」、次に「bar」を出力します。
ただし、名前空間を大量の で汚染するだけでなく、これを行うたびにソース コード レベルでold-lambda-<x>
新しいものを作成する必要があります。たとえば、構文定義でもold-lambda-<x>
使用できないため、これを自動化することはできません。gensym
したがって、これを拡張可能にする良い方法はありません。唯一のもっともらしい解決策は、それぞれに名前を付けるold-lambda-print-foo
か、あいまいさを解消するのに似たものにすることですが、これは明らかに確実な解決策ではありません。(これがどのように失敗するかの例として、コードの2つの異なる部分がlambda
「foo」を出力するように拡張されたとします。当然、両方とも名前が付けられold-lambda-print-foo
、voila!lambda
は無限ループになります。)したがって、非常に理想的には次のような方法でこれを行うことができれば素晴らしいです。
- 多くの名前空間を汚染する必要はありません
old-lambda-<x>
- または、それが失敗すると、衝突が発生しないことが保証されます。
hash - SHA256 の「純粋な」スキーム実装 (R5RS)?
外部ライブラリ(Java、C、またはシステムに依存)を使用するか、特定のスキーム実装(チキンなど)を使用してSchemeでSHA256を使用できますが、「純粋な」スキーム実装があるかどうか疑問に思います。
functional-programming - スキーム自体を使用して組み込みのスキーム関数 begin() を実装すると、同じコードが MIT-SCHEME と Racket で異なる動作をしますか?
r5rs スキーム標準を読んでいると、begin() が実際にはライブラリ構文であることがわかりました。これは、スキーム自体で定義できることを意味し、標準は標準の最後に実装を提供します。
r5rs に従って、以下のように定義構文を使用して begin() を実装しました。
そして、関数を使用して実装しようとしましたが、これが私のコードです:
ここに私のテストケースがあります:
#lang スキームを使用して MIT-SCHEME と Racket でコードを実行しました。x は MIT-SCHEME と Racket の両方で 5 ですが、y は MIT-SCHEME では 4 ですが、Racket では 5 です。
だから、ここに私の質問があります:
- 純粋な機能スキームを使用して begin() を本当に実装できるというのは本当ですか?
- マクロを使用するコードと関数を使用するコードの両方で、私のコードに何か問題がありますか?
- MIT-SCHEME と Racket で同じコードの動作が異なるのはなぜですか?
documentation - スキームの公式ドキュメント標準はありますか?
Java には javadoc があります。Python には docstring があります。しかし、スキームはどうですか?
後でドキュメントを作成できるように、Scheme プログラムにコメントを付ける標準的な方法があるかどうか疑問に思っています。
「Scheme」には多くの意味があるため、Google で見つけるのは困難です。ありがとうございました!
私は、Scheme 文書化ツールの推奨を求めているわけではないことに注意してください。他の言語と同様に、Scheme を文書化するための標準フォーマットが存在するかどうかを知りたいだけです。