3 ms·
Right, these are two limitations in CL at read time (when symbols are read by Lisp): the package needs to exist and for an exported symbol notation, the symbol
by lispm 7y ago
Right, these are two limitations in CL at read time (when symbols are read by Lisp):
the package needs to exist and for an exported symbol notation, the symbol actually needs to be exported. The latter makes sense in some way, because the mechanism should warn, when a symbol is used, which is not exported.
One way one might be able to deal with that would be to catch the reader error and create a package on the fly, which then would have these symbols and/or exports some of these. Later, when a DEFPACKAGE is seen, the package could be adjusted to the new package definition. Note that modifying an existing package via DEFPACKAGE has undefined consequences in the standard. Implementations may deal with that, though.
But there are problems with the approach: imagine someone uses FOO:BAR in his source code. But that was a symbol from an old version of that software and now FOO:BAR is no longer exported or even doesn't exist. What now? Should this modify the package? Should it warn? Be an error?
Currently when using Common Lisp and reading a symbol with a non-existing package, the Lisp system shows an error. I can't remember what the Lisp Machine did, but it easily could have presented a restart option to create the package and go on.
LispWorks does that: it shows an error and provides a restart.
CL-USER 89 > (read-from-string "LOL::ROTFL")
Error: Reader cannot find package LOL.
1 (continue) Create the LOL package.
2 Use another package instead of LOL.
3 Try finding package LOL again.
4 (abort) Return to top loop level 0.
Type :b for backtrace or :c <option number> to proceed.
Type :bug-form "<subject>" for a bug report template or :? for other options.
CL-USER 90 : 1 > :C 1
LOL::ROTFL
10
In SBCL one can create the package via DEFPACKAGE and use the RETRY restart:
* (read-from-string "LOL::ROTFL")
debugger invoked on a SB-INT:SIMPLE-READER-PACKAGE-ERROR in thread
#<THREAD "main thread" RUNNING {10005184C3}>:
Package LOL does not exist.
Line: 1, Column: 9, File-Position: 9
Stream: #<SB-IMPL::STRING-INPUT-STREAM {1002F8ADF3}>
Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
0: [CONTINUE ] Use the current package, COMMON-LISP-USER.
1: [RETRY ] Retry finding the package.
2: [USE-VALUE] Specify a different package
3: [UNINTERN ] Read the symbol as uninterned.
4: [SYMBOL ] Specify a symbol to return
5: [ABORT ] Exit debugger, returning to top level.
(SB-IMPL::READER-FIND-PACKAGE "LOL" #<SB-IMPL::STRING-INPUT-STREAM {1002F8ADF3}> T)
0] (defpackage "LOL")
#<PACKAGE "LOL">
0] 1
LOL::ROTFL
10