Re: script for generating tags for picolisp

2010-08-18 Thread Alexander Burger
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

2010-08-18 Thread Edwin Eyan Moragas
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

2010-08-18 Thread Edwin Eyan Moragas
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)

2010-08-18 Thread Edwin Eyan Moragas
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)

2010-08-18 Thread Alexander Burger
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