Re: script for generating tags for picolisp
Hi Doug, On Tue, Aug 17, 2010 at 09:19:23PM -0700, Doug Snead wrote: > ... > # make a tags file for pico lisp source files. > ... As I understand it, this is not exactly what Edwin intended. I think he wanted a tags file for the main interpreter functions written in C. Also, the tags for Lisp functions can be obtained easily, as the file and line number are stored in each symbol under the '*Dbg' property, and can be used like: : (vi 'vi) Generating the tags for C level functions is a lot trickier, as the symbols have to be parsed from "src/tab.c" to get their name in C (e.g. '+' -> 'doAdd'), and then the actual source located (e.g. in "big.c"). For the 64-bit versions, the file and line info in '*Dbg' is also available for the built-in functions (asm instead of C), but unfortunately not for the 32-bit version. Cheers, - Alex -- UNSUBSCRIBE: mailto:picol...@software-lab.de?subject=unsubscribe
Re: script for generating tags for picolisp
Hi Alex, On Wed, Aug 18, 2010 at 3:41 PM, Alexander Burger wro= te: > Hi Doug, > > On Tue, Aug 17, 2010 at 09:19:23PM -0700, Doug Snead wrote: >> ... >> # make a tags file for pico lisp source files. >> ... > > As I understand it, this is not exactly what Edwin intended. I think he > wanted a tags file for the main interpreter functions written in C Doug sent something that i actually intended. there's ctags for C functions=
Re: script for generating tags for picolisp
Hi Doug, thanks for this. this would come in handy. On Wed, Aug 18, 2010 at 12:19 PM, Doug Snead wro= te: > Here's one shell script I used to use for that (I called it lisptags) ...= hopefully it still works :-) > > #!/bin/sh > # make a tags file for pico lisp source files. > # use: > # =A0 =A0 =A0 lisptags foo.l bar.l baz.l ... bof.l > # generate the file 'tags' > # [based on lisptags csh script by John Foderaro, c.1982] > awk ' > /^[ \t]*\([bd][em][ \t]/ { > n=3D$2; > gsub(/^\(/,"",n); > gsub(/\)$/,"",n); > print n "\t" FILENAME "\t?^" $0 "$?"; > } > /^[ \t]*\(class[ \t]/ { > n=3D$2; > gsub(/^\(/,"",n); > gsub(/\)$/,"",n); > print n "\t" FILENAME "\t?^" $0 "$?"; > if (n ~ /^\+/) { > =A0gsub(/^\+/,"",n); > =A0print n "\t" FILENAME "\t?^" $0 "$?"; > } > } > ' $* | sort > tags > > =3D =3D =3D > > > > --- On Tue, 8/17/10, Edwin Eyan Moragas wrote: > >> From: Edwin Eyan Moragas >> Subject: script for generating tags for picolisp >> To: picolisp@software-lab.de >> Date: Tuesday, August 17, 2010, 12:05 AM >> Hi all, >> >> anybody who made an attempt to create such kind of script? >> or maybe a >> resource somewhere in the interwebs for this? >> >> cheers, >> >> /e >> -- >> UNSUBSCRIBE: mailto:picol...@software-lab.de?subject=3dunsubscribe >> > > > > -- > UNSUBSCRIBE: mailto:picol...@software-lab.de?subject=3dunsubscribe > -- UNSUBSCRIBE: mailto:picol...@software-lab.de?subject=unsubscribe
(extend cls)
Hi all, i'm going thru the wiki code. encountered `(extend)` in it but couldn't find an example in the tutorial but found the definition in the docs. after reading thru, seems to me that *Class is used to change class definitions (from wiki/er.l and doc/family.l). examining wiki/gui.l, seems to me that class definitions (say +Doc) are kept in top-level. execution flow now would look like: a) define classes using `(extend)` or `(class)` b) open the db c) accept requests d) do whatever e) render the page f) goto #c questions: 1) am i on the right track so far? 2) as far as i can tell, only 1 db can be opened at any time. how does one deal with multiple databases? thanks for your patience. :) /e -- UNSUBSCRIBE: mailto:picol...@software-lab.de?subject=unsubscribe
Re: (extend cls)
Hi Edwin, > after reading thru, seems to me that *Class is used to change class > definitions (from wiki/er.l and doc/family.l). examining wiki/gui.l, > seems to me that class definitions (say +Doc) are kept in top-level. Exactly. '*Class' is simply a global variable holding the "current class". Functions like 'dm' (define method), 'var' (define class variable) and the database relation functions like 'rel' use it to know where to put the definition. So if you define a method (dm action> (Arg1 Arg2) (body) ) then it is meant that this is the method 'action>' for the class that is currently in '*Class'. If you want just to define a single method for a class '+MyClass', the global variable '*Class' is not needed at all. You could also write instead (dm (action> . +MyClass) (Arg1 Arg2) (body) ) which is equivalent to (extend +MyClass) (dm action> (Arg1 Arg2) (body) ) or even (setq *Class '+MyClass) (dm action> (Arg1 Arg2) (body) ) The difference is just the side-effect of modifying '*Class'. In fact, 'extend' is just syntactic sugar instead of 'setq' : (pp 'extend) (de extend X (setq *Class (car X)) ) -> extend > execution flow now would look like: > > a) define classes using `(extend)` or `(class)` > b) open the db > c) accept requests > d) do whatever > e) render the page > f) goto #c Yes > questions: > > 1) am i on the right track so far? Yes > 2) as far as i can tell, only 1 db can be opened at any time. how does > one deal with multiple databases? Correct. The currently open database is a global resource. To operate on multiple databases, you could use 'pool' to switch between them. 'pool' is used in the beginning (point 'b)' above), but can also be used at later times, as it closes a possibly open database first before opening the next one. I have never really tested this (I think Henrik did that once), and I expect it to be somewhat inefficient as there is quite some overhead due to lost caches. I would rather start separate applications, one for each database, and define a communication protocol between them using sockets and the 'pr' and 'rd' functions. This is well tested, and has the additional advantage that the databases my reside on separate machines for better scalability. Moreover, I would say the typical case is not to have multiple databases, but a single database distributed across multiple machines. Cheers, - Alex -- UNSUBSCRIBE: mailto:picol...@software-lab.de?subject=unsubscribe