문제

나는 SICP (컴퓨터 프로그램의 구조 및 해석)를 읽고 있었고이 훌륭한 특별한 형태 인 "Make-Environment"를 발견하게되어 정말 기뻤습니다. "패키지"의 4.3 절에서) :

(define scientific-library
  (make-environment
   ...
   (define (square-root x)
    ...)))

그런 다음 어떻게 작동하는지 보여줍니다

((eval 'square-root scientific-library) 4)

그들의 예에서, 그들은 계속해서 바로 그거죠 내가 원하는 사용 - 계획에서 "oo"스타일을 수행하는 우아하고 미니멀리스트 방식 ... 그들은 "유형"을 함께 "유형"으로, 실제로 "Make -Environment"특수 양식에 의해 반환 된 것입니다. 즉, vtable) 및 arg ( "상태") ...

나는 이것이 너무 흥분했다 바로 그거죠 내가 많은 명시 적 코드 나 매크로를 쓰지 않고도 "symple에서"polymorphic dispatch "symply"를 수행하는 방법으로 내가 찾고있는 것.

즉, 나는 "객체"를 만들고 싶습니다. 기능, 다른 맥락에서 부르는 기능 ...하지만 "CAR"과 "CDR"으로 언급하고 싶지는 않습니다. 선언하다 그리고 평가하다 그들의 상징적 이름으로.

어쨌든, 내가 이것을 읽을 때 나는 집에 돌아와서 시도하기를 기다릴 수 없었습니다.

PLT 체계와 Chez 체계에서 다음을 경험했을 때 실망을 상상해보십시오.

> (make-environment (define x 3))
Error: invalid context for definition (define x 3).
> (make-environment)
Error: variable make-environment is not bound.

SICP에서 언급 된대로 "만들기 환경"은 어떻게 되었습니까? 그것은 모두 너무 우아 해 보였고 정확히 내가 원하는 것을 보였지만 현대 계획 통역사에서는 지원되지 않는 것 같습니다.

이론적 근거는 무엇입니까? 단순히 "Make-Environment"가 다른 이름을 가지고 있습니까?

자세한 내용은 나중에 찾을 수 있습니다

온라인 버전을 살펴 보았습니다.

http://mitpress.mit.edu/sicp/full-text/book/book-zh-28.html#%_SEC_4.3

나는 SICP의 첫 번째 판이 읽고 있었다. 두 번째 판은 패키지에 대한 토론을 비 결정적 프로그래밍 섹션 및 "AMP"연산자로 대체 한 것으로 보입니다.

도움이 되었습니까?

해결책

더 많이 파고 난 후에 나는 이것을 발견했다 유익한 스레드 Newsnet에서 :

"R5RS 평가 및 환경 지정자는 일류 환경을 심오하게 싫어하고 제한된 평가를 원하는 사람들과 환경 인 두 번째 논쟁없이 평가를 받아 들일 수없는 사람들 사이의 타협입니다."

또한이 "작업 원칙"을 발견했습니다.

(define-syntax make-environment 
  (syntax-rules () 
    ((_ definition ...) 
     (let ((environment (scheme-report-environment 5))) 
       (eval '(begin definition 
                     ...) 
             environment) 
       environment)))) 


(define arctic 
  (make-environment 
    (define animal 'polarbaer))) 

(가져온 이것)

그러나 나는 첫 번째 사람이 제안한 것처럼 "메시지 전달"스타일을 채택하게되었습니다. 나는 Alist of Functions를 반환하고 특정 함수를 이름으로 호출하기위한 일반적인 "보내기"방법을 가지고 있습니다.

(define multiply
  (list
    (cons 'differentiate (...))
    (cons 'evaluate (lambda (args) (apply * args)))))

(define lookup
  (lambda (name dict)
    (cdr (assoc name dict))))

; Lookup the method on the object and invoke it
(define send
  (lambda (method arg args)
    ((lookup method arg) args))

((send 'evaluate multiply) args)

나는 더 많이 읽고 있었고 완전히 OO 스타일을 채택하고 싶다면 모두 Clos가 있다는 것을 알고 있습니다. 그러나 위의 심지어는 다소 과잉이라고 생각합니다.

다른 팁

제도에는 성능 이유 때문에 일류 환경이 없습니다. 체계가 만들어 졌을 때, 일류 기능, 연속 등과 같은 멋진 물건으로 인해 가장 빠른 언어가 아니 었습니다. 일류 환경을 추가하면 성능이 더욱 무너 졌을 것입니다. 그래서 그것은 초기 계획 일에 이루어진 트레이드 오프였습니다.

그들은 MIT 계획이 실제로 일류 환경을 가지고 있기 때문에 그렇게 썼으며, 아마도 작가들이 자신의 수업을 가르치려고 계획 한 것일 것입니다 (책이 MIT에 쓰여졌 기 때문에).

체크 아웃 http://groups.csail.mit.edu/mac/projects/scheme/

그러나 MIT 체계는 여전히 다소 적극적으로 개발되었지만 외국 기능 인터페이스 또는 GUI 지원과 같이 현대적인 체계가 가지고있는 많은 기능이 부족하다는 것을 알았습니다. 당신은 아마도 적어도 그 자체로는 심각한 소프트웨어 개발 프로젝트에 사용하고 싶지 않을 것입니다.

고전적인 디스패처 기능이 작동합니까? 나는 이것이 당신이 찾고있는 것과 비슷하다고 생각합니다.

(define (scientific-library f)
  (define (scientific-square-root x) (some-scientific-square-root x))
  (cond ((eq? f 'square-root) scientific-square-root)
        (else (error "no such function" f))))
(define (fast-library f)
  (define (fast-square-root x) (some-fast-square-root x))
  (cond ((eq? f 'square-root) fast-square-root)
        (else (error "no such function" f))))

((scientific-library 'square-root) 23)
((fast-library 'square-root) 23)

과학 및 빠른 라이브러리를 하나의 큰 파견 방법으로 결합 할 수도 있습니다.

(define (library l f)
  (define (scientific-library f)
    ...)
  (define (fast-library f)
    ...)
  (cond ((eq? l 'scientific) (scientific-library f))
        ((eq? l 'fast) (fast-library f))
        (else (error "no such library" l))))
(library 'fast 'square-root)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top