2012-02-26 8 views
1

ちょうどSchemeの学習を始めました。 私はコンパイラ/インタプリタとしてDr. Racketを使用しています。スキームR5RS define-syntaxは無視されますか?

私はSRFI 13からコピーしたので、いくつかの文字列関数(文字列置換)が必要です。

私はそれをテストするとき、それは示してい..

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

それは無視されていているようです

define-syntax let-string-start+end 

で定義されただと?実際に何が起こっていますか?

答えて

8

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

あなたはラケットでR5RS言語を使用している場合は、次の行にSRFI 13で引くことができます。

(#%require srfi/13) 

奇妙に見える#%requireは、Racket固有のhookで、r5rsプログラムがラケットからライブラリモジュールをロードできるようにします。

だから、ラケットでR5RSプログラムはこのようなものになるだろう。代わりに、基本的なr5rs言語を使用しての、あなたの代わりに本格的な#lang racketを使用し、SRFI 13をインポートすることになり、場合

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

類似。ここでは、前のプログラムと同じ処理を行い#lang racketの小さなプログラムがあります:

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

残念ながら、あなたが報告しているエラーは、問題を正確に診断するための十分な情報を持っていません。私はあなたがSRFI 13からコピーされたことを言及するので、私はあなたがコードを誤ってコピーされているかもしれないと思う理由の一つは、あなたがそれを定義挙げることで、どこか不完全なコピー&ペーストを疑う:

define-syntax let-string-start+end 

とその行は実際にいくつかの重要な括弧を欠いています。元のソースには、その行頭に先頭の括弧があります。

しかし、あなたがSchemeをよく知っていない限り、少なくともSRFI実装からビットとピースを手で取り除こうとするべきではありません。ライブラリ全体をロードすることで簡素化できます。

+0

"require"を認識していないようです。おそらくR5RSを使用しているからでしょうか?わからない:/ – ercliou

+2

RacketのR5RSモードを使用している場合、 '(#%require srfi/13)'を使用する必要があります。 –

+0

おかげさまで、両方の方法がうまくいった。そしてChris、それはR5RSの標準構文ですか? "#%"とは何ですか? – ercliou

関連する問題