2016-06-30 3 views
1

잠시 동안 치킨 계획에서 놀고 있었지만 이상한 것을 발견했습니다. 다음과 같은 간단한 소스 파일이 있다고 가정 해 보겠습니다.치킨 계획 : 로딩 또는 컴파일시 누락 된 경고/오류 메시지

(define (f x) 
    (g x)) 

이것이 작동하지 않는다는 것은 명백합니다. 알고 좋은

Note: the following toplevel variables are referenced but unbound: 

    g (in f) 

: 나는 csi을 시작하면 수동으로 나는 다음과 같은 메시지를 얻을이 함수의 정의를 입력! 큰 프로그램에서 오타를 찾는 것은 실행하기 전에 좋습니다.

(load "test.scm") 

출력 : : 또한 좋은

; loading test.scm ... 

Note: the following toplevel variables are referenced but unbound: 

    g (in f) 

자, 다시 csi를 시작하고 load에 파일을 해보자. 이제 해당 파일과 함께 csi을 시작해 봅시다!

$ csi test.scm 

CHICKEN 
(c) 2008-2015, The CHICKEN Team 
(c) 2000-2007, Felix L. Winkelmann 
Version 4.10.0 (rev b259631) 
linux-unix-gnu-x86-64 [ 64bit manyargs dload ptables ] 
compiled 2015-08-04 on yves.more-magic.net (Linux) 

; loading test.scm ... 
#;1> 

어 ... 오류 메시지는 어디로 갔습니까? 왜 거기 있지 않니? 좋아, 아마도 실제로 컴파일하려고하면 불평 할 것이다. ...

$ csc test.scm 
$ 

아니요. 심지어 파일의 끝에 (f 2) 줄을 추가하더라도 (f - 함수가 멀리 떨어져있는 것을 피하기 위해) 나는 여전히 얻지 못합니다. 일종의 오류 메시지 또는 경고입니다.

왜? 어떻게 통역사 (또는 적어도 수동 load 부분)는이 문제를 즉시 알 수 있지만 컴파일러는이를 알 수 없습니까? 재미있게도 컴파일러에 대한 인수는 -no-warnings입니다. 예상대로 아무런 경고도 없으므로 아무것도하지 않습니다.

무엇이 누락 되었습니까? 어떻게 해결할 수 있습니까? 고정 할 수 있습니까? 아니면 실제로 자신의 프로그램을 컴파일하기 전에 수동으로 load 모든 관련 파일을 수동으로 csi에 만들어야합니까?

답변

2

이 오류 메시지가 나타나지 않는 이유는 CHICKEN이 별도 컴파일을 지원한다는 것입니다. 예를 들어 C와 같이 작동합니다. 파일을 개별적으로 컴파일 한 다음 나중에 링크하여 실행 파일을 만들 수 있습니다. 또한 코드의 변수를 (다시) eval을 통해 정의 할 수도 있습니다. 즉 컴파일러가이 문제에 대해 너무 많은 가정을 할 수는 없습니다 (기본적으로).

오류가 발생하면 모듈을 제안 해주세요. 를 들어,

$ cat foo.scm 

(module foo (f) 
    (import chicken scheme) 
    (define (f x) 
    (g x)) 
) 

$ csc foo.scm 
Warning: reference to possibly unbound identifier `g' in: 
Warning: main#f 

Error: module unresolved: main 

Error: shell command terminated with non-zero exit status 256: csc foo.scm 

또한 암시 적 (무명) 모듈의 전체 코드를 래핑하는 csc -M를 사용할 수 있습니다 이러한 식별자가 참조되지 않은 경우,이 오류가 발생 있도록 완전히 "세계를 폐쇄"로되어있다 편의.

+0

감사합니다. – cronotk

관련 문제