2010-07-21 7 views
1

다음 코드가 "Hello, world!"로 표시되도록 rnrs-modified 라이브러리를 어떻게 만들 수 있습니까? (실제로는 틀림없이 더 나은)도r6rs에서 구문 키워드 다시 정의

#!r6rs 
(import (rnrs-modified)) 
(display set!) 

또는이 좋은 것 :

#!r6rs 
(import (rnrs) (modified)) ;or (import (modified) (rnrs)) 
(display set!) 

는 기본적으로 나는 도서관에서 (하자 람다 설정! 등) 구문 키워드를 재정의 할 수있게하려면 그런 다음 해당 라이브러리를 다른 라이브러리 또는 최상위 프로그램으로 가져 와서 다시 정의 된 키워드를 사용하십시오.

그러나 나는이가 계속 :

module: identifier already imported from a different source in: 
    set! 
    (lib "rnrs/main.ss") 
    (lib "rnrs-modified/main.ss") 

수정 rnrs I가 사용하고있는 코드는 다음과 같습니다

#!r6rs 
(library (rnrs-modified) 
     (export (rename (f set!))) 
     (import (rnrs)) 
     (define f "Hello, world!")) 

어떤 아이디어?


업데이트 : 'mzscheme modules'에 대해 this이 발견되었습니다. r6rs 체계를 위해 아닙니다, 그러나 그것이 제안하는 기능은 기본적으로 정확하게 내가 찾고있는 것입니다. 어떻게 r32rs 구성표에서 provide all-from-except 할 수 있습니까?

답변

2

R6RS는 사용자 정의하려는 라이브러리를 식별하고 사용자 정의하려는 부분을 제외 한 다음 자신의 라이브러리에서 해당 부분을 정의함으로써 목표 달성에 더욱 기여합니다. 다음은 예입니다

myrnrs.sls 같은 제외한 모든 -에서 -

(import 
(except (rnrs) set!) 
(myrnrs)) 
(display set!)(newline)  

불행하게도 우리가 라켓에 어디에도 없다됩니다

(library 
(myrnrs) 

(export set!) 

(import 
    (except (rnrs) set!) 
    (rename (rnrs) (set! rnrs-set!))) 

(define set! "Hello, world.")) 

test.scm; 그래서 당신은 set!을 재 정의하는 라이브러리를 만들 수 있습니다. 그러나 rnrs를 임포트 한 다음, set!을 다시 정의하는 것 외에도 모든 바인딩을위한 export를 타이프해야합니다. 너는 here에 관하여 더 많은 것을 읽는다; 아이러니하게도 나는 세트가없는 라이브러리를 만들고 싶었다.

+0

+1 감사합니다. 나는 이것이 두려웠다. (이런 종류의 끔찍한 일. 다른 모든 바인딩에 대한 내보내기를 추가하는 것이 올바른 옵션이라고 생각하십니까? 문서 나 구문을 파싱 할 수 있으므로 가능합니다.하지만 제 경험상 하드 코딩 된 솔루션은 일반적으로 좋지 않으며 쉽게 깨집니다. 어떻게 생각하십니까? 또한 제한적인 라이브러리 시스템이 r6rs에 선택된 이유는 무엇입니까? 작은 세계 : P – Cam

+0

1. R6RS 표준은 변경되지 않으므로 일단 수출이 정확 해지면 평생 동안 유지 될 것입니다. 2. 왜 그런지는 모르겠다. 한 가지 관점에서 볼 때, R6RS는 오늘날 서로 다른 체계 시스템에서 발견되는 공통 기능에 대한 표준을 정의하는 목표를 가졌습니다. 일반적인 모듈 기능 중 무엇입니까? 마지막 R6RS 코드에서 필자는로드 및로드 기능을 수동으로 내 보냈습니다. all-from- * 생각할 필요가없는 것처럼 보입니다. – grettke