From: Yaroslav K. <kav...@je...> - 2005-07-08 10:00:35
|
clisp from CVS head, mingw CL-USER> (defun CL-USER:: () "OOPS!") || CL-USER> (CL-USER::) "OOPS!" Symbol maybe empty? :) -- WBR, Yaroslav Kavenchuk. |
From: Hoehle, Joerg-C. <Joe...@t-...> - 2005-07-08 15:02:56
|
Hi, incidentally, somebody in comp.lang.lisp reported having written a library using the symbol referred to via :: as a means to add type declarations to Lisp code. I can't remember the exact syntax, but maybe it's: (my-let (x :: integer) &body) or some such >Yaroslav Kavenchuk writes: >> Pascal Bourguignon wrote: >> > [41]> (::) >> > "Re oops!" >> How mach in (c)Lisp the same "doings"? >Not very much. >So it works like this in the current version of clisp, but it might >not work later, and it won't work in some other implementations. I take the opposite view. :: is within the scope of the standard. You can file a bug report to your Lisp supplier if it does not. ANSI-CL/CLHS acknowledges symbols with an empty print name explicitly IIRC. >it happens that clisp nicknames >the package named "KEYWORD" with "", to enable this trick). The CLISP implementation does this to have its reader handle keywords in correctly. That means no more than that. It does not mean that :: is a CLISP specific trick. >(defun || () "Oops!") >(defun :|| () "Oops!") These are not the same symbols. :: is in the keyword package. >(defun :- (&optional arg) (declare (ignore arg)) "Nice!") >(values (:-) (:-( ))) ;-) Actually, it's funny that I've only seen few packages take advantage of these, while it's very common in Haskell. Lispers seem to prefer verbose names, like PLUS, DIFFERENCE and DIRAC. Perhaps because of Lisp-1 vs -2, and the derived need for ':- and #':- which don't look that nice anymore? Regards, Jorg Hohle |
From: Devon S. M. <Lisp-Hacker@Jovi.Net> - 2005-07-09 20:47:02
|
Tokens : and :: cannot be used in portable programs because they are explicitly undefined in Common Lisp http://www.lisp.org/HyperSpec/Body/sec_2-3-5.html 2.3.5 Valid Patterns for Tokens ... ::aaaaa undefined aaaaa: undefined ... Figure 2-17. Valid patterns for tokens ... aaaaa has any syntax ... |
From: Pascal B. <pj...@in...> - 2005-07-08 10:04:21
|
Yaroslav Kavenchuk writes: > clisp from CVS head, mingw > > CL-USER> (defun CL-USER:: () "OOPS!") > || > CL-USER> (CL-USER::) > "OOPS!" > > Symbol maybe empty? :) Yes. Isn't it nice? -- __Pascal Bourguignon__ http://www.informatimago.com/ Until real software engineering is developed, the next best practice is to develop with a dynamic system that has extreme late binding in all aspects. The first system to really do this in an important way is Lisp. -- Alan Kay |
From: Pascal B. <pj...@in...> - 2005-07-08 10:06:22
|
Yaroslav Kavenchuk writes: > clisp from CVS head, mingw > > CL-USER> (defun CL-USER:: () "OOPS!") > || > CL-USER> (CL-USER::) > "OOPS!" > > Symbol maybe empty? :) Yes. Isn't it nice? The package name can be empty too (it's taken to be KEYWORD): [40]> (defun :: () "Re oops!") :|| [41]> (::) "Re oops!" -- __Pascal Bourguignon__ http://www.informatimago.com/ Until real software engineering is developed, the next best practice is to develop with a dynamic system that has extreme late binding in all aspects. The first system to really do this in an important way is Lisp. -- Alan Kay |
From: Yaroslav K. <kav...@je...> - 2005-07-08 10:41:35
|
Pascal Bourguignon wrote: >>CL-USER> (defun CL-USER:: () "OOPS!") >>|| >>CL-USER> (CL-USER::) >>"OOPS!" >> >>Symbol maybe empty? :) > > > Yes. Isn't it nice? Very nice :) > > The package name can be empty too (it's taken to be KEYWORD): > > [40]> (defun :: () "Re oops!") > :|| > [41]> (::) > "Re oops!" > How mach in (c)Lisp the same "doings"? -- WBR, Yaroslav Kavenchuk. |
From: Pascal B. <pj...@in...> - 2005-07-08 12:00:55
|
Yaroslav Kavenchuk writes: > Pascal Bourguignon wrote: > > >>CL-USER> (defun CL-USER:: () "OOPS!") > >>|| > >>CL-USER> (CL-USER::) > >>"OOPS!" > >> > >>Symbol maybe empty? :) > > > > > > Yes. Isn't it nice? > > Very nice :) > > > > > The package name can be empty too (it's taken to be KEYWORD): > > > > [40]> (defun :: () "Re oops!") > > :|| > > [41]> (::) > > "Re oops!" > > > > How mach in (c)Lisp the same "doings"? You mean Common Lisp. Not very much. The mapping of an empty package name to KEYWORD is implementation dependant. It's not forbiden by the standard, but it's not specified either. (Eg. the standard allows implementation specific nicknames to standard packages, and it happens that clisp nicknames the package named "KEYWORD" with "", to enable this trick). So it works like this in the current version of clisp, but it might not work later, and it won't work in some other implementations. Now, about reading cl-user:: and :: the readers of other implementations may raise an error such as: (COMMON-LISP::%READER-ERROR #<Two-Way Stream, Input = #<Synonym Stream to SYSTEM:*STDIN*>, Output = #<Synonym Stream to SYSTEM:*STDOUT*>> "Illegal terminating character after a colon, ~S" #\Space) because the specifications for the reader are not really very precise (in general the specifications of Common Lisp are not really very precise). But the creation of an empty-named symbol can be done portably, using these escape: || So both these definitions are correct and portable: (defun || () "Oops!") (defun :|| () "Oops!") (values (||) (:||)) You can also name a function :- (defun :- (&optional arg) (declare (ignore arg)) "Nice!") (values (:-) (:-( ))) ;-) -- __Pascal Bourguignon__ http://www.informatimago.com/ Nobody can fix the economy. Nobody can be trusted with their finger on the button. Nobody's perfect. VOTE FOR NOBODY. |