문제

여전히 매크로와 관련하여 모범 사례가 무엇인지 이해하기 위해 고군분투하고 있습니다. 나는 패키지를 즉시 정의하는 매크로를 작성하려고합니다.

(defmacro def-dynamic-package (name)
  `(defpackage ,(intern (string-upcase name) "KEYWORD")
     (:use :common-lisp)))

이것은 다음과 같은 표현에 대해서만 잘 작동합니다.

(def-dynamic-package "helloworld")

그러나 다음과 같이 비참하게 실패합니다.

(defun make-package-from-path (path)
  (def-dynamic-package (pathname-name path)))

또는

(defun make-package-from-path (path)
  (let ((filename (pathname-path)))
     (def-dynamic-package filename)))

나는 대부분의 기본 매크로가 어떻게 작동하는지 이해하지만 이것을 구현하는 방법은 저를 탈출합니다.

도움이 되었습니까?

해결책

방어구 매크로입니다. 따라서 런타임이 아닌 컴파일 타임에 확장됩니다. 당신이 원하는 것은 새 패키지를 만들기 위해 런타임에 호출되는 것입니다. 그러므로, 방어구 당신을 위해 아무것도 할 수 없습니다.

다행히도, 또한 있습니다 패키지를 만듭니다, 제공하는 방어구함수로서의 기능. 대신 사용하십시오 방어구.

다른 팁

매크로가 인수를 평가해서는 안되는 매크로가 사용되기 때문에 여기에서 실패가 예상됩니다.

첫 번째 Make-Package-From-Path에서 Def-Dynamic-Package는 다음 표현식의 값과 동일한 목록을 인수로 받게됩니다.

(list 'pathname-name 'path)

귀하의 경우에는 기능 만 원합니다.

(defun def-dynamic-package (name)
  (defpackage (string-upcase name)
    (:use :common-lisp)))

BTW, 확인하면 CLHS, 당신은 그것이 첫 번째 논쟁을 볼 수 있습니다 방어구 상징 일 필요는 없지만 문자열 지정자.

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