2011-08-02 5 views
0

을 '나쁜 배치가 정의하는'내 코드가 얻을. 전역 컨텍스트에서 table(find-max-chain) 외부에 정의하면이를 실행할 때 성공합니다. 내가 실행할 때 내가 필요 (find-max-chain), 내부 (get-chain)을 정의 할 때 (find-max-chain) 나는 SCM에서이 오류가 왜이, 나는 여기에 오류

;ERROR: "problem14-new.scm": bad placement define 
; in expression: (define (get-chain! number) (let ((chain (hash-table-ge ... 
; in scope: 
; (update-max! table max-chain max-entry . #@define) 
; () procedure find-max-chain 
; defined by load: "problem14-new.scm" 

;STACK TRACE 
1; (#@define ((update-max! (#@lambda (entry chain) (cond ((> chai ... 
2; (#@find-max-chain) 
3; (#@define ((hss (#@has-suffix? #@file (#@scheme-file-suffix))) ... 

입니까?

답변

4

함수 내에서 define은 함수 (또는 함수와 같은 본문)의 시작 부분에서만 허용됩니다. 어떤 경우에는 letrec과 같습니다. R5RS의 this section을 참조하십시오.

+0

저는 이것이 대답이라고 생각합니다. 사실, 나는 실험을 계속했고, 처음에는 letrec 문을 가진 코드가 결국 모든 것을 정의하는 것을 발견했다. 감사! – djhaskin987

2

저는 SCM 및 오류 메시지에 익숙하지 않지만, 내 생각에 처음으로 letrecletrec* 호와 충돌합니다. R5RS는 letrec 바운드 변수를 건드리지 않고 letrec 형식의 모든 오른쪽면을 평가할 수 있어야한다고 (대략) 말합니다. 내부 정의에 대해서도 동일한 제한이 적용됩니다. (. IIRC, R6RS 같은 참조를 허용하는 letrec* 형태 첨가)

예를 들어, 다음의 불법 :

(let() 
    (define x 1) 
    (define y (+ 1 x)) 
    y) 

y 우축을 평가하는 x의 값을 필요로하기 때문이다. 반면,이 괜찮 :

입니다
(let() 
    (define x 1) 
    (define f (lambda() (+ 1 x))) 
    (f)) 

, 그것은 범위 지정의 문제가 아니라,이 변수가 될 때의 문제이다 "사용할 준비가."

관련 문제