2012-02-26 5 views
1

막 학습을 시작했습니다. Dr. Racket을 제 컴파일러/인터프리터로 사용하고 있습니다.스키마 R5RS define-syntax가 무시 되었습니까?

SRFI 13에서 복사 한 일부 문자열 함수가 필요합니다 (정확한 문자열 교체). 나는 그것을 테스트 할 때

, 그것은 ...이다

define-syntax let-string-start+end 

정의이 무시되고 있다는 것 것

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

? 실제로 무슨 일이 일어나고있는거야?

답변

8

SRFI 13의 항목을 수동으로 복사하여 붙여 넣을 필요가 없습니다.이 것은 라켓에 내장되어 있습니다. http://docs.racket-lang.org/srfi/index.html

당신이 r5rs에게 라켓에 언어를 사용하는 경우에는 다음 줄에 SRFI 13 뽑을 수 :

(#%require srfi/13) 

을 사실, 주요 SRFI 라이브러리의 대부분은 라켓과 함께 번들로 제공됩니다 이상한 모양의 #%require은 r5rs 프로그램이 라켓에서 라이브러리 모듈을로드 할 수있게 해주는 라켓 관련 hook입니다. 대신 기본 r5rs 언어를 사용하여, 당신은이 #lang racket 대신, SRFI (13)를 가져 오는 본격적인 보일 것 사용

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

경우 :

그래서 라켓의 r5rs 프로그램은 다음과 같이 될 것이다 비슷한. 여기에 이전 프로그램과 동일한 않습니다 #lang racket에있는 작은 프로그램입니다 :

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

불행하게도, 당신이보고있는 오류가 정확하게 문제를 진단 할 수있는 충분한 정보를 가지고 있지 않습니다.

define-syntax let-string-start+end 

과 : 당신은 당신이 잘못을-복사 할 수 있습니다 코드 생각하는 이유는 SRFI 13 가지 이유에서 복사 언급 이후는, 어딘가 불완전한 복사 및 붙여 넣기를 당신이 그것을 정의 언급 의심 그 줄은 실제로 중요한 괄호를 놓치고 있습니다. 원래의 출처에는 선의 앞 부분에 선행 팸런이 있습니다.

그러나 Scheme에 익숙하지 않으면 SRFI 구현에서 비트와 조각을 직접 손으로 뽑아서는 안됩니다. 전체 라이브러리를로드하여 단순화하십시오.

+0

"필요"를 인식하지 못하는 것 같습니다. 아마도 R5RS를 사용하고 있기 때문일 수 있습니까? 모르겠다 :/ – ercliou

+2

라켓의 R5RS 모드를 사용하고 있다면'(# % require srfi/13)'를 사용해야 할 것이다. –

+0

많은 분들께 감사드립니다. 두 가지 방법 모두 .. 그리고 Chris는 R5RS의 표준 구문입니까? "# %"는 무엇입니까? – ercliou