Common LISP의 초보자 : 즉시 패키지 정의를위한 매크로 질문
-
07-07-2019 - |
문제
여전히 매크로와 관련하여 모범 사례가 무엇인지 이해하기 위해 고군분투하고 있습니다. 나는 패키지를 즉시 정의하는 매크로를 작성하려고합니다.
(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, 당신은 그것이 첫 번째 논쟁을 볼 수 있습니다 방어구 상징 일 필요는 없지만 문자열 지정자.
제휴하지 않습니다 StackOverflow