이것은 코드에서 돌연변이를 사용하는 것에 대한 요점입니다. 매크로의 점프 필요가 없습니다. 이제 스택 연산을 가정 할 것입니다. 전달할 수있는 간단한 값을 얻기 위해 목록 주위에 래퍼가 필요하고 나머지 코드는 그대로 유지됩니다 (글쎄, 사소한 변화로 인해 그것은 스택 작업을 제대로 수행합니다).PLT 제도에서이 정확히 위해 무엇 상자 :
이
(define (pop a-list)
(begin0 (first (unbox a-list))
(set-box! a-list (rest (unbox a-list)))))
큐으로 선회에 관해서는, 당신이 중 하나를 사용할 수 있습니다 : 당신이 begin0
대신 let
의 사용할 수있는 또한
(define (push x a-list)
(set-box! a-list (cons x (unbox a-list))))
(define (pop a-list)
(let ((result (first (unbox a-list))))
(set-box! a-list (rest (unbox a-list)))
result))
주 위의 방법은 Jonas가 작성한 마지막 버전을 제외하고는 매우 비효율적입니다. 예를 들어, 당신이 할 경우 SEV는 제안 무엇 :
(set-box! queue (append (unbox queue) (list x)))
을 다음이 복사 전체 큐 - 당신의 큐에 항목을 추가하는 루프가 많이 생성, 각 추가에 모두 복사된다는 것을 의미합니다 GC를위한 쓰레기 (루프 안에있는 문자열 끝에 문자를 추가하는 것에 대해 생각해 보라). "unknown (google)"솔루션은 목록을 수정하고 끝에 포인터를 추가하므로 수집 할 가비지 생성을 피할 수 있지만 여전히 비효율적입니다.
Jonas가 작성한 해결책은 목록의 끝을 가리키는 포인터를 유지하는 일반적인 방법입니다. 그러나 PLT Scheme에서이 작업을 수행하려면 변경 가능한 쌍 (mcons
, mcar
, mcdr
, set-mcar!
, set-mcdr!
)을 사용해야합니다. 버전 4.0이 나왔기 때문에 PLT의 일반적인 쌍은 변경되지 않습니다.
는
죄송하지만 더 나은 코드를 기다리고 싶습니다. – unj2
나는 이것이 훌륭한 코드는 아니라는 데 동의하지만, 당신의 목적이 제대로 작동하지 않는 이유를 제공합니다. 즉, 대기열 구성표는 훨씬 복잡한 데이터 구조를 사용하여 처리해야합니다. 그 해답을 얻는 데 최선이되기를 바랍니다. – Sev
나는 Scheme 구조가 돌연변이가 될 수 있지만, 단지 낙심 한 것입니다 ... –