2016-10-21 9 views
1

예를 들어 main.scm 파일에는 (load "util.scm")이 있습니다. util.scmmain.scm과 같은 폴더에있는 파일입니다. 두 파일은 ~/documents/myproject/에 있습니다.현재 디렉토리 대신 파일을 기준으로 파일을 가져 오는 방법은 무엇입니까? ((Chez) Scheme)

이제이 디렉토리에 있고 $ chez-scheme main.scm을 실행하면 모든 것이 잘 동작합니다. 그러나, 내가 홈 디렉토리에 있고 $chez-scheme documents/myproject/main.scm을 실행하면 파일 util.scm을 찾을 수 없다는 불평을합니다. 현재 디렉토리가 관련 홈 디렉토리 였기 때문에이 경우라고 생각합니다. 따라서 util.scm이 실제로 존재하지 않기 때문에 실제로는 documents/myproject/에 있습니다. 즉, 필자는 (다른 언어로) 가져 오기 명령이 포함 된 파일과 관련하여 이러한 경로를 찾는 기능에 익숙해졌으며 여기서도이 파일을 갖고 싶습니다. 나는 접두사를 ./으로 시도했거나 파일을 libary로 정의하고 (import (util))을 수행했지만 어떤 것도 documents/myproject/ 외부에서 작동하지 않았습니다. 내가 의도 한대로 작동하도록 할 수있는 방법이 있습니까?

나는 이것이 체즈 구성표라고 가정합니다. 그렇지 않다면 구현에 중립적 인 대답을 선호합니다.

답변

1

load은 시스템 인터페이스가 보고서에서 주제와 관련이 없으므로 R5RS에서 다소 어색하지만 반쪽의 해결책은 load입니다. 이 보고서는 load이 현재 디렉토리 또는 파일 형식 인 load과 관련이 있는지 여부를 알려주지 않습니다. 따라서 현재 디렉토리에서 스크립트를 실행하고로드 된 파일을 둘 다 필요로합니다.

Chez Scheme이 (가) R6RS load을 구현 한 이후 실제로 사용하기에 적합하지 않습니다. R6RS는 라이브러리를 선호하여 load을 삭제했습니다. 파일을 라이브러리로 만들고 설치 방법을 참고해야합니다. 일부 시스템에서는 파일을 올바른 경로에 배치하고 라이브러리 위치를 구성에 추가하거나 설치 스크립트를 실행합니다. 라이브러리를 사용하는 방법은 import을 사용하여 모든 구현에서 동일합니다.

Chez documentation에 따르면 --libdirs을 전달하여 라이브러리를로드하는 데 고려해야 할 하나 이상의 경로를 제공 할 수 있습니다. (library-directories)

0

시도하고있는 것을 달성하는 데는 여러 가지 방법이 있지만 궁극적으로 Chez로 하여금 사물을 찾을 위치를 알려주도록합니다. 상대 경로가 주어지면 includeloadsource-directories 매개 변수를 사용하여 요청한 파일을 검색합니다. 라이브러리는로드되거나 컴파일되는 동안 source-directories에 자동으로 경로가 추가되기 때문에 main.scm이 라이브러리 정의 인 경우 예상대로 util.scm을 찾습니다.

그러나 main.scm은 라이브러리가 아니며 최상위 프로그램입니다. 안타깝게도 Chez에는 라이브러리 디렉토리처럼 source-directories을 설정하는 명령 행 옵션이 없습니다. 따라서 유연성이 조금 떨어집니다. 다음의 모든 작동합니다 :

  • util.scm 라이브러리를 확인하고 어디에서 라이브러리를 찾아야하는지 알 수 있도록 --libdirs 옵션 체즈를 호출합니다.
  • source-directories을 설정하고 main.scm을 명령 줄이 아닌 REPL 내부에서로드하십시오.
  • 직접 입력 할 필요가 없도록 위의 명령을 scheme에 에코하여 래퍼 셸 스크립트를 작성하십시오. (당신이 또한 계획 세션에 입력 할 필요가없는 경우에만 적합합니다).
  • scheme을 실행하기 전에 프로젝트 디렉토리에 cd이 들어있는 래퍼 셸 스크립트를 작성하십시오 (완료되면 원래의 디렉토리로 다시 돌아가는 것 같습니다. 아마도 cd).