1

スキームの学習を開始しました。私はコンパイラー/インタープリターとしてDr.Racketを使用しています。

いくつかの文字列関数(正確には文字列置換)が必要なので、SRFI13からコピーしました。

テストすると表示されます。

reference to undefined identifier: let-string-start+end

それはで定義されています

define-syntax let-string-start+end

無視されているようですね。実際に何が起こっているのですか?

4

1 に答える 1

8

SRFI13からアイテムを手動でコピーして貼り付ける必要はありません。Racketに組み込まれています。実際、主要なSRFIライブラリのほとんどはRacketにバンドルされています:http://docs.racket-lang.org/srfi/index.html

Racketでr5rs言語を使用している場合は、次の行でSRFI13を取り込むことができます。

(#%require srfi/13)

奇妙な外観は、r5rsプログラムがRacketからライブラリモジュールをロードできるようにする#%requireRacket固有のフックです。

したがって、Racketのr5rsプログラムは次のようになります。

(#%require srfi/13)
(display (string-replace "foo world" "hello" 0 3))
(newline)

基本r5rs言語を使用する代わりに、本格的な言語を使用する場合、 #lang racketSRFI13のインポートは同様になります。#lang racketこれは、前のプログラムと同じことを行う小さなプログラムです。

#lang racket
(require srfi/13)
(string-replace "foo world" "hello" 0 3)

残念ながら、報告しているエラーには、問題を正確に診断するための十分な情報がありません。SRFI 13からコピーしたとおっしゃっていたので、どこかに不完全なコピーアンドペーストがあったのではないかと思います。コードを誤ってコピーしたと思う理由の1つは、次のようにコードを定義していることです。

define-syntax let-string-start+end

その行には、実際にはいくつかの重要な括弧がありません。元のソースでは、その行の先頭に主要なパレンがあります。

ただし、少なくともSchemeに精通するまでは、SRFI実装から断片を手作業で選別しようとしないでください。ライブラリ全体をロードして簡素化します。

于 2012-02-26T04:09:53.870 に答える