2011-02-24 7 views
0

평가 될 때 obj의 복사본을 반환하는 Scheme 식을 반환하는 하나의 인수 - obj -의 함수를 구현해야합니다.개체 사본을 반환하려면 어떻게해야합니까?

문제 해결 방법에 대한 아이디어가 있으십니까?

+0

어떤 종류의 같은 물건을 수행 할 수 있습니다 COPY-OBJECT을 위해 인수의 람다 표현식 내에서의 호출을 캡슐화 너 무슨 뜻이야? –

+0

그냥 obj를 반환하지 않는 이유는 무엇입니까? 나는 당신이 파괴적인 수정을 계획하고 있다고 가정합니다. 왜 수정 된 사본을 반환하는 함수를 작성한 다음 계속 반복하여 원하는 동작을 제공합니까? – Marcin

답변

1

나는 당신이 쓰는 의미 같은데요 "함수 EXPR을 돌려 [받아들이] OBJ [과], 평가,하는 제도 식을 돌려 ..."

는 가정이 경우 : 여기서 정말로 필요한 것은 디자인 레시피입니다. 먼저 함수가 받아들이는 것의 예와 그 결과를 적는다. 이렇게하면 자신이하려는 일, 다른 사람과 자신에게하는 일 (아마도 더 중요한 일)을 분명히 할 수 있습니다.

희망이 있습니다. 당신이 당신의 절차는 모든 개체를 복제 할 수있게하려면

1

는 다음 개체가 다른 종류의 존재의 미덕에 의해 제도의 basic types. 중 하나가 될 수 ... 너무 불투명 죄송합니다, 그들은 각기 다른 "본성이 "또는 구조, 또는 무엇을 가지고, 그래서 한 종류의 객체의 사본을 만드는 것은 반드시 다른 유형의 다른 객체의 사본을 만드는 것과는 다른 전략을 수반하게 될 것입니다.

이렇게 접근하는 방법은 각 Scheme의 유형 (또는 처리하려는 Scheme 유형의 하위 집합)을 검사하고 해당 유형의 객체를 복제하는 것이 무엇을 의미하는지 알아내는 것입니다. 분명한 방법으로 이렇게하면 COPY-NUMBER, COPY-SYMBOL 등과 같은 일련의 특수화 된 절차로 끝나야합니다 (스포일러 : 이러한 많은 절차는별로 흥미롭지 않습니다.)

이러한 특수 절차를 하나의 객체로 통합하여 객체를 복제 할 수 있으므로 객체의 실제 유형을 결정하고 COPY-FOO 절차를 호출하여 작업을 수행 할 수 있습니다 (절차를 인라인으로 확장 할 수도 있음) . 당신은 COND와 형 결정 조건으로 정말 쉽게 구성 할 수 있습니다 ". 유형에 파견"

(define (copy-object obj) 
    (cond ((number? obj) (copy-number obj)) 
     ((boolean? obj) (copy-boolean obj)) 
     ... 
     )) 

이 상관없이이라고 불리는 유형의 자료에 대한 작업을 수행하기위한 일반적인 디자인 패턴입니다 그것은 실제로 이런 상황에서 너무 중요하지 않은 일반적인 프로그래밍을 수행하는 꽤 소름 - 가난한 방법입니다.

마지막으로 사본을 얻기 위해 평가할 수있는 것을 반환하는 주름이 추가되었습니다. 그뿐만 아니라 똑바로 무엇인지를 알 수 있습니다 :

(define (expr-returning obj) 
    (lambda() (copy-object obj))) 

는 그런 다음 개체의

 
guile> (define x (list 1 2 3 4)) 
guile> (define y (expr-returning x)) 
guile> (define cx (y)) 
guile> x 
(1 2 3 4) 
guile> cx 
(1 2 3 4) 
guile> (set-cdr! x 'foo) 
guile> x 
(1 . foo) 
guile> z 
(1 2 3 4) 
etc.