문제

나는 Ray Tracing Code Form Paul Graham 's를 실행하려고합니다. ANSI Common LISP OS X에서 OpenMCl (이제 CCL이라고 함)과 함께 Slime을 사용합니다. 이 코드에는 값이 구조 인 상수 정의 된 것이 있으며, 내가 호출 할 때 점액 컴파일 및로드 파일 또는 슬라임 컴파일-디 펀 상수를 사용하는 모든 함수에서 오류 메시지가 나타납니다.

#s에 대해 make-load-form 메소드가 정의되지 않음 (point : x 0 : y 0 : z 200) [유형 단순 오류 조건

나는 찾았다 게시물 합병증을 설명하고 다른 것 그것을 애도하지만, OpenMCl의 이러한 측면을 협상하기 위해 코드에 추가해야 할 것은 무엇입니까?

도움이 되었습니까?

해결책

Compile-File에 의해 처리되는 코드의 구조-개체 (및 기타 유형의 객체)가 문자 그대로, 코드의 상수 객체로 표시되면, Compile-File은 결과 바이너리 파일이로드 될 때 "동등한"을 배열하는 방법을 알아야합니다. 객체가 생성됩니다. "동등한"에 대한 가능한 많은 정의가 있습니다. 때로는로드 된 객체의 구성 요소가 다른 객체와 구조를 공유하는 것이 중요합니다. 때로는 초기화가 특정 방식으로 발생하는 것이 중요하며 때로는 이러한 것들 중 어느 것도 중요하지 않습니다. 상수 객체를 재현하는 방법을 결정하려면 Compile-File은 일반 기능 Make-Load 형식을 호출합니다. 이 동작은 CL 참조 또는 튜토리얼에 설명되어야합니다. (참조 또는 튜토리얼은 구현이 모든 구조 클래스 또는 표준 클래스 인스턴스에 적용 할 수있는 기본 메이크로드 형식 메소드를 정의 할 수 없으며 메이크로드 형식 절약에 주목해야합니다. -Slots는 초기화가 복잡 할 필요가없는 객체에 대한 Make-Load 형식 메소드에서 사용하기에 편리한 기능입니다.

(defmethod make-load-form ((p point) &optional env)
  (declare (ignore env))
  (make-load-form-saving-slots p))

이 메소드는 컴파일 타임에 정의되어야하므로 Compile-File이 호출하여 상수 포인트 객체를 저장하는 방법을 결정할 수 있습니다.

이 중 어느 것도 CCL- 특이 적이 지 않습니다. 무엇이 될 수 있는지, 어떤 것들이 일정하고 문자 그대로의 대상이며 어떤 것들이 아닌지에 대한 질문입니다.

코드에서 :

(defconstant a-point (make-point :x 0 :y 0 :z 200))

(defun return-a-point () a-point)

컴파일러는 함수 return-a-point에서 a-point의 값을 대체 할 수 있도록 허용 (필요하지 않음). (컴파일러가 그렇게하는 경우, 이는 코드에 컴파일되는 코드에 문자 그대로/상수 포인트 객체가 있음을 의미하며, Compile-File은 객체를 저장하고로드하는 방법을 결정하기 위해 Make-Load 형식을 호출해야합니다. 컴파일러는이 대체를 수행하지 않으며이 예에서는 Make Load 형식을 호출 할 필요가 없습니다.)

구현이 이러한 종류의 대체 여부는 구현에 달려 있습니다. 또한 사양은 또한 수비 형식의 값 형태가 컴파일 타임,로드 타임 또는 둘 다에서 평가되는지 여부에 대해 지정되지 않고 표현이 항상 평가되도록 간호 (사용자가) 운동을해야한다는 메모를 남겨 둡니다. 같은 값.

CCL은 일반적으로 컴파일 타임에서 Defconstant 값 형태를 평가하려고 시도하며, 이에 대한 참조에 대한 이름의 상수의 값을 대체하는 것에 대해 상당히 공격적입니다. 경우에 따라 상수 값의 클래스에서로드 형식 메소드가 정의되어야 함을 의미합니다. 다른 구현은 일부 유형의 객체에 대해이 대체를 기꺼이 수행 할 수 없습니다. 두 전략 모두 정확하고 휴대용 코드는 어떤 전략을 따르고 있는지 가정 할 수 없습니다 (많은 휴대용 코드는 확실히 그러한 가정을 만듭니다.)

defconstant에 의해 정의 된 것들에 대한 다른 처리는 대부분 이런 종류의 원인처럼 보입니다 (아무도 정의하지 않는 사람을 만들지 않는 예기치 않은 부하 형식에 대한 예상치 못한 호출). 다음과 같이 휴대 할 수있는 방식으로 이러한 문제 중 일부를 피할 수 있습니다.

(defconstant a-point (make-point :x 0 :y 0 :z 200))

(defun return-a-point () (load-time-value (symbol-value 'a-point)))

이는 CCL과 마찬가지로 구현이 일정한 대체를 수행 할 수있는 구현과 비슷한 영향을 미치지 만로드 타임 값을 사용하면 일정한 값이로드 시간에만 평가 될 수 있습니다 (및 그 메이크로드 형식은 관련되지 않습니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top