From: Bruno H. <br...@cl...> - 2004-12-16 20:13:53
|
Sam wrote: > proposal: > user variable CUSTOM:*DEFINE-EXPORTING* > initial value: NIL > when non-nil, macroexpansion of > DEFUN, DEFMACRO, DEFVAR, DEFCONSTANT, DEFPARAMETER, DEF-CALL-OUT > (but not DEF-CALL-IN), DEFINE-MODIFY-MACRO, DEFINE-SYMBOL-MACRO, > DEFSETF, DEF-C-TYPE, DEF-C-ENUM, DEF-C-STRUCT, DEF-C-VAR, > DEFSTRUCT, DEFCLASS > will contain an EXPORT form for the symbol defined: > (EXPORT ',name ,(symbol-package name)) > the variable is checked only at macroexpansion time, > so when loading a compiled file its value has no effect. > > use case: > > (eval-when (compile eval) > (setq custom:*define-exporting* t)) > (defvar foo 10) > (defun bar (x) (+ x foo)) > > NOTE: slot accessors (but not slot names) for DEFCLASS, DEFSTRUCT, > DEF-C-STRUCT, are also exported. > NOTE: constants defined by DEF-C-ENUM are also exported. I'm more in favour of an extra package that exports the symbols EXPORTING:DEFUN, EXPORTING:DEFMACRO, etc. Why? - It allows leaving the ANSI CL macros unmodified. - It allows using some of the exporting macros but not all. - It allows using the non-exporting macro in selected places. Use case: (defpackage "MY-PACK" (:use "COMMON-LISP") (:shadowing-import-from "EXPORTING" #:defun #:defmacro #:defvar)) (defvar foo 10) (defun bar (x) (+ x foo)) ; This one I don't want to export. (cl:defun private-password () "as7djqkw") > (but not DEF-CALL-IN) Why not? When the called-in function is a generic function, it makes sense to let other packages attach methods to it; therefore its name should be exported. Bruno |
From: Sam S. <sd...@gn...> - 2004-12-16 20:41:48
|
> * Bruno Haible <oe...@py...t> [2004-12-16 21:12:11 +0100]: > > I'm more in favour of an extra package that exports the symbols > EXPORTING:DEFUN, EXPORTING:DEFMACRO, etc. as long as they look like (defmacro exporting:defun (name &rest body) `(progn (cl:defun ,name ,@body) (cl:export ',name ,(find-package name)))) i.e., do not re-implement the original functionality. note that DEFSTRUCT, DEFCLASS, DEF-C-STRUCT will need to use MOP to get the list of readers, writers and accessors to export. PS note that PARI uses modern package mode; I suggest that as you remove exporting.lisp, you convert all those modules to modern mode. PPS I suggest :MODERN argument for DEFPACKAGE/MAKE-PACKAGE. when set, it should forbid :CASE-SENSITIVE & :CASE-INVERTED arguments and convert CL in :USE to CS-CL. I.e., (make-package "FOO" :modern t :use '(#:cl #:ext)) is equivalent to (make-package "FOO" :case-inverted t :case-sensitive t :use '(#:cs-cl #'ext)) this might make it easier to write code portable between ACL and CLISP. -- Sam Steingold (http://www.podval.org/~sds) running w2k <http://www.camera.org> <http://www.iris.org.il> <http://www.memri.org/> <http://www.mideasttruth.com/> <http://www.honestreporting.com> main(a){printf(a,34,a="main(a){printf(a,34,a=%c%s%c,34);}",34);} |