2017-05-15 1 views
2

My Lisp 파일에는 약 50 개의 함수 및 매크로 정의가 들어 있습니다. 파일의 머리 부분은 다음과 같습니다.Common Lisp에서 파일의 모든 정의 기호를 내보내는 방법은 무엇입니까?

(defpackage :utils 
    (:use :common-lisp)) 

(in-package :utils) 

; ... ~50 defuns/defmacros follow along with some other code 

이 50 개의 정의를 모두 내보내려고합니다. 그러나 다른 상징은 없습니다. defpackage 안에있는 export 절은 매우 지루한 것처럼 보입니다.

패키지의 기호를 나열하기 위해 루프 기능을 사용하여 필요한 기호를 얻으려고했습니다. 그러나 "symbol"과 "present-symbol"은 필요한 정의 기호를 출력하지 않습니다. 나는 어떻게 든 "외부 기호"와 상속 된 기호를 뺄 수있었습니다. 그러나 이것은 모든 사람이 필요로하는 종류의 것 같고 확고한 쉬운 해결책이 있어야합니다. 나는 주변을 둘러 보았고 직접적인 대답을 찾지 못했다.

개별적으로 또는 수동으로 작성하지 않고 모든 정의 기호를 내보내려면 어떻게합니까?

답변

3

스캔 상징

이 당신은 모든 기호 및 수출 함수 바인딩이 모든를 스캔 할 수 있습니다

(이 매크로 이름 포함) :

(defun export-fbound-symbols (package) 
    "export symbols with function bindings" 
    (do-symbols (s package) 
    (when (fboundp s) 
     (export s package)))) 

이것은 일반적으로 아주 좋은 생각이 아니다 : 좋은 소프트웨어 공학 실습은 한계 인 공개 인터페이스 집합입니다.

당신은 그들이 자동으로 definienda를 내보낼 수 있도록 defundefmacro을 다시 정의 할 수 있습니다보다 선택합니다. exporting.lispCLISP입니다. 예 :

(defmacro define-function (name lambda-list &body body) 
    `(progn 
    (export ',name) 
    (defun ,name ,lambda-list ,@body))) 

(defun (setf foo) (...) ...)의 가능성을 무시하십시오.

+1

내 보낸 DEFUN 변형에 대해서는 DEFINE을, 내 보낸 DEFMACRO 변형에 대해서는 DEFINE-MACRO를 보았습니다. –

1

아니요, 이것은 모두에게 필요한 것이 아닙니다. 보통, 당신이 쓸 때 (그리고 실제로 필요하다면) 그들을 내보낼 것입니다.

아마 이것을 위해 임시 키보드 매크로를 사용할 것입니다. 양식에 따라 파일 형식을 읽고 복사 - 붙여 넣기에 대한 관련 기호를 출력하는 작은 Lisp 함수를 작성할 수도 있습니다.

관련 문제