2009-12-10 3 views
1

Dr.Scheme의 Pretty Big을 사용하는이 코드에 어떤 문제가 있습니까? 나는 문제없이 비슷한 일을하는 것을 기억하는 것 같습니다. 내가 내 목록이 실제로 변경되지 않습니다 물론 제외하고 잘 작동 (set! (Frame-variables res) ...) 부분을 생략하면"set !: 식별자가 아닙니다 : ..."plt 스키마 오류

set!: not an identifier in: (Frame-variables res)

: 다음과 같은 오류를 반환

(lambda (x y) (set! (Frame-variables res) (append (Frame-variables res) (list (cons x y))))) 

. 그래서 그것은 두 번째 (Frame-varialbes res)을 인식하지만 첫 번째 것은 인식하지 못합니까? 그 맥락에서 set!과 어떤 거래가 이루어 집니까?

잘하면 내가 Frame이라는 구조체가 있고 variables 필드가 목록임을 알고 있습니다.

답변

4

문제 : 설정 방법

! 공장. 실제로는 어딘가에서 메모리에 매달려있는 객체에 이름을 묶습니다. 설정을하면!, 그 이름이 무엇을 의미하는지 바뀝니다.

오류 : (Frame-variables res)은 식별자가 아니므로 다른 것으로 참조 할 수 없습니다.

수정 :

당신이 할하려는 것은 구조체의 멤버를 돌연변이입니다. 필요한 것은 구조체 멤버를 변경 가능하도록 변경 한 다음 변경자를 사용하는 것입니다.

(define-struct frame (a b ... c [variables #:mutable] e ...)) 

그런 다음 원하는대로 이것은 당신의 구조 변이 것

(set-frame-variables! res (list "new" "value")) 

를 사용할 수 있습니다.

강의 :

당신이 당신의 프로그램에 대한 좋은 디자인을 선택하는 경우 내가 궁금하네요. 목록을 돌연변이시키고 추가하는 것은 Scheme의 디자인에 질문하는 두 가지 작업입니다.

또한 사용자가 호출 한 내용을 기반으로 변수의 연관성 목록을 유지하려고하는 것처럼 보입니다. 이건 정말 효율적이지 않습니다, 아마도 당신은 Hash Table

관련 문서와 같은 다른 것을 고려해야한다 : 일반적으로

http://docs.plt-scheme.org/reference/define-struct.html#(form._((lib._scheme/base..ss)._define-struct))

+1

좋은 대답하지만, 모두 제공-srfi 17 사취 참조 그러한 "일반화 된"집합! 일반적으로 돌연변이를 피할 수 있으면 사용하지 말아야 할 때가 있지만, 그렇게하는 것이 도움이 될 수 있습니다. 일반화 된 setter의 한 가지 이점은 매우 유용한 'inc!'매크로를 작성할 수 있다는 것입니다. –