Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HOWTO definition and usage of Common Lisp packages (libraries)?

I have developed some Common Lisp functions in a couple of Lisp source files that I'd like easily available to other functions I write, or make available on github if I think they'd be useful for someone else. For now, I've just been putting them in some pre-defined folder and using (require "/path/to/my/modules/module.lisp").

I'm wanting to understand what is the correct (canonical Lisp) way of defining Lisp library of modules. And the second part of the question is how to use them (whether I've defined them, or whether I've obtained one from someone else).

I've been reading a lot about defpackage and defsystem and asdf. But everything I've read seems to focus on some specific corner of the universe of this task. I'm having a lot of trouble seeing the big picture of custom module creation, deployment, and use. So assuming I have the Lisp environment in front of me (CLISP or SBCL) and one or more .lisp files I'd like to make a package or library out of, is there a document somewhere that explains what steps are required to do that? It's probably something I've already read, but didn't track due to not understanding the context. What I've read about ASDF seems functionally to be what I'm after, but I'm left not understanding whether ASDF is my only option, or whether it just happens to be a de facto standard and what most other people use, or whatever. I played with it a bit in SBCL and wasn't sure I was using it right, and didn't see info on how to set it up in CLISP. So I'm wanting to understand what is the up-the-middle, vanilla approach to this task.

I know this is a big, sloppy set of sub-questions. Again, if there are some good references to look at, I can read. I'm just having some trouble getting a big picture view of how this is supposed to work, and whether there is any "best" approach, or whether, in Lisp, it's a bit of a "Wild West" choose-the-library-manager-you like approach. I did the Google thing and read anything that looked relevant, but my brain is spinning from all of it.

Thanks.

like image 656
lurker Avatar asked Jan 06 '14 15:01

lurker


2 Answers

A system is a collection of files and sub-systems. One can compile or load such a system. There are also other operations possible. It keeps track of dependencies and tries to do a minimal amount of work.

If you are using SBCL and CLISP, then ASDF is the tool to choose. See http://www.cliki.net/asdf

ASDF provides, amongst other things, a DEFSYSTEM macro to describe such systems.

Don't use PROVIDE/ REQUIRE- unless you know what you are doing. ASDF is the way to go.

To publish your code and make it easily loadable by others then use QUICKLISP. See: http://www.quicklisp.org/beta/

like image 151
Rainer Joswig Avatar answered Oct 18 '22 07:10

Rainer Joswig


A package in Common Lisp is not like a package in most other senses. It's not an archive of list files, but more like what most other languages would call a module or namespace that lets you select which symbols (names) from your code you want to show to the outside world of code.

If you just have one file for your little library, you can just distribute that. If you have multiple files, that where a tool like ASDF comes in to make sure, for example, that files defining macros are loaded before the files that use those macros.

Here are some good resources for you to look at, both chapters from Practical Common Lisp:

  • 21. Programming in the Large: Packages and Symbols: This will give you a much better sense of what packages are and how and why to use them.
  • 32. Conclusion: What's Next?: The "Delivering Applications" section has some good resources on this stuff in general, and has some mention of ASDF.
like image 4
Linuxios Avatar answered Oct 18 '22 07:10

Linuxios