From: Sam S. <sd...@gn...> - 2007-08-21 14:05:10
|
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hi, Vagmi Mudumbai wrote: > As I understand, there are many ways to do the the python equivalent I don't know what python import does. I hope a python expert will chime in. > of an import in Lisp. You can either to a (load :filename) or (require > :filename). There is also the (import ...) thingy for which I appear > to need a (defpackage ... ) and (in-package ...). Given my Python these are 3 separate functions: 1. LOAD: loads a specific file, i.e., evaluates forms contained in the file one by one. file name argument should be a string or a pathname, although CLISP also accepts symbols. http://clisp.cons.org/impnotes/system-dict.html#loadfile http://www.lisp.org/HyperSpec/Body/fun_load.html 2. REQUIRE: ensures that a module is present by loading a file, if it has not yet been loaded. the module name argument should be a symbol or a string. if you intend to use REQUIRE, you should have a PROVIDE form in the module. http://clisp.cons.org/impnotes/system-dict.html#require http://www.lisp.org/HyperSpec/Body/fun_providecm_require.html 3. IMPORT: adds symbols ("names") to the internals of a package ("namespace"). I don't think you want to do this. http://www.lisp.org/HyperSpec/Body/fun_import.html > Say, I have a module called lib.lisp which has the single line. > > (setf *var* 20) you probably want DEFVAR or DEFPARAMETER here. > I then have lib1.lisp, which has the following. > > (require :lib) if you do this, you should do (PROVIDE :LIB) in lib. > (setf *var* 40) > > I then have lib2.lisp which requires both lib and lib1. > > (require :lib1) > (require :lib) > > Then the value of *var* when finally executing lib2 is 20 and not 40. > I suspect that I am not following the lisp style of programming. If > so, can you please point me in the right direction? namespaces are orthogonal to filenames. if you do (DESCRIBE '*VAR*), you will be told that *VAR* is a symbol in package CL-USER - the default package. if you want to create other packages, you need to do that explicitly using DEFPACKAGE: - ---- lib.lisp --- (defpackage #:my-pack (:export #:*foo* #:bar)) (in-package #:my-pack) (defvar *foo* 42) (defun bar (x) (+ x *foo*)) (defun baz (x) (* x *foo*)) (provide "lib") - ---- lib.lisp --- - ---- bil.lisp --- ;; current package = CL-USER; "lib" stuff is not available (print *package*) ; prints #<package common-lisp-user> (require "lib") ; "lib" stuff is now available (print my-pack:*foo*) ; prints 42 (print (my-pack:bar 7)) ; prints 49 (print (my-pack::baz 2)) ; print 84, ; need two columns "::" because baz is not exported from my-pack (in-package #:my-pack) (print (baz 3)) ; prints 126, now all my-pack internals are available directly - ---- bil.lisp --- your best friend is the function FIND-ALL-SYMBOLS: if you are getting the wrong behavior, you might be using the wrong symbol. http://www.lisp.org/HyperSpec/Body/fun_find-all-symbols.html in general, you might find it more profitable to ask general CL question on the comp.lang.lisp newsgroup, see http://clisp.cons.org/impnotes/faq.html#faq-help -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFGyvEKPp1Qsf2qnMcRAh3PAJ98R1aRo5OQK/iZ3J5/jqRdnx7xYACgresP N0t1q6X2mwA9Xkm/uo2svWE= =AbDw -----END PGP SIGNATURE----- |