2014-02-24 4 views
3

DrRacket/plt-r5rs와 Gambit/gsi에서 모두 작동하는 것을 작성하려고합니다.R5RS Scheme에서 정의 구문의 포리 스트로드/포함?

내가 겪고있는 문제는 Gambit의 (load "foo.scm")define-syntax -blocks가로드되지 않는다는 것입니다. Gambit에서 (include "foo.scm")을 사용하면 DrRacket에서 구문 오류가 발생합니다.

휴대용 R5RS 코드를 작성할 수 있도록이 문제를 해결할 방법이 있습니까?

상황은 나는 시도했다 :

  • (include "foo.scm")(load "foo.scm")에 그 반대를 재정의. 문제 : Gambit에서 매크로를 재정의하는 것은 잘못되었습니다.
  • (if gambit ...)에서 상기 재정의를 래핑하는 단계. 문제 : 내부 정의를 잘못하면 if (다른 정의 안에없는 경우).
  • filename을 사용하여 문자열을 라이브러리 파일의 포함으로 전달합니다. 문제점 : Gambit에 포함 된 것은 해석이 시작되기 전에 일어나는 것처럼 보입니다.

답변

2

Gambit 및 Racket과 호환되는 모듈을 작성하는 것은 매우 어렵습니다.

실제로 특정 구현을 테스트하고 조건 적으로 조건을 정의하는 방법이 있습니다. 실제로이 작업을 수행하는 시스템은 SRFI 0SRFI 7입니다. 라켓에 당신이 r5rs 파일에 포함 사용할 수 있습니다 :

#lang r5rs 
(#%require (only racket include)) 
(include "foo.scm") 

당신이 책략에서 아무것도 할 #%require를 정의하면 Most implementations support one or the other. Not very many support both.

책략은 SRFI 0 라켓이 도움이 경우 SRFI 7

+0

Erik에게 : 당신은 이것을 최고의 대답으로 골랐습니다 ... 당신은 무엇을 했습니까? – Quasaur

+0

저는 Gambit과 Racket 사이의 포팅 작업을 거의 포기했습니다. 특정 프로젝트에 대한 요구 사항이 아니기 때문에 좋았을 것입니다. 특히 Racket의 Gambit에서 원하는 것을 얻는 방법을 찾았을 때 ("현재 터미널에서 실행 중인가?"라는 질문에 대한 대답). –

2

을 지원 지원 두 구현에서 동일한 소스 파일을 사용할 수 있습니다.

+0

내가 겪고있는 문제의 일부는 내가 그 중 하나만을 위해 뭔가를 재정의 할 수 없다는 것을 어떻게 사용할 수 있는지를 알 수 없다는 것입니다. 내가 놓친 게 있니? –

+0

gsi를 호출 할 때 파일 목록을 제공 할 수 있습니다. 첫 번째는 Gambit 특정 정의를 포함 할 수 있습니다. – soegaard

+0

라켓은 동일한 기능을 가지고 있으므로 그 파일에서'(include load를 정의하십시오)'를 할 수 있다는 것을 기억하십시오. 코드가 실행되는 방식에 대한 가정을 싫어하지만, 내가 얻을 수있는 가장 가까운 것이라 생각합니다. –