From: Andrew P. <and...@gm...> - 2012-11-20 14:39:13
|
Many CL's offer a way to retrieve the Lisp script name, but CLISP appears to silently drop this information. I've managed a hack around this, but not without caveats. https://github.com/mcandre/scriptname/blob/master/scriptname.lisp A shebang line forces the script name onto the shell arguments twice, forcing it into ext:*args*. However, this method only works when the Lisp script is run with Unix ./ notation (chmod a+x && ./scriptname.lisp), and the script must be run with CLISP; Thus the script immediately loses portability to other CL's which require their own shebangs. Could CLISP please provide an accessor similar to ext:*args* that exposes argv[0], as a C program would see it? Thank you. -- Cheers, Andrew Pennebaker www.yellosoft.us |
From: Sam S. <sd...@gn...> - 2012-11-20 16:03:58
|
> * Andrew Pennebaker <naqerj.craaronxre@tznvy.pbz> [2012-11-20 09:39:02 -0500]: > > Many CL's offer a way to retrieve the Lisp script name, but CLISP > appears to silently drop this information. http://clisp.org/impnotes/quickstart.html#script-exec The file is loaded normally, through the function LOAD (in particular, the name of the script file, which is $0 in /bin/sh, can be found in *LOAD-TRUENAME* and *LOAD-PATHNAME*). http://clisp.org/impnotes/faq.html#faq-fine -- Sam Steingold (http://sds.podval.org/) on Ubuntu 12.04 (precise) X 11.0.11103000 http://www.childpsy.net/ http://www.PetitionOnline.com/tap12009/ http://truepeace.org http://camera.org http://www.memritv.org He who laughs last did not get the joke. |
From: Andrew P. <and...@gm...> - 2012-11-20 16:43:41
|
This isn't completely accurate. *LOAD-TRUENAME* is overwritten when you (load) other code files, so it doesn't let you reliably get the original script name. This difference is detectable in general scripting languages such as Ruby: if __FILE__==$0 main end How can this be done in CLISP? So far, I can manage with a shebang hack<https://github.com/mcandre/scriptname/blob/master/scriptname.lisp>, but it prevents the code from dot slashing properly with other CLs. On Tue, Nov 20, 2012 at 11:03 AM, Sam Steingold <sd...@gn...> wrote: > > * Andrew Pennebaker <naqerj.craaronxre@tznvy.pbz> [2012-11-20 09:39:02 > -0500]: > > > > Many CL's offer a way to retrieve the Lisp script name, but CLISP > > appears to silently drop this information. > > http://clisp.org/impnotes/quickstart.html#script-exec > The file is loaded normally, through the function LOAD (in > particular, the name of the script file, which is $0 in /bin/sh, can > be found in *LOAD-TRUENAME* and *LOAD-PATHNAME*). > > http://clisp.org/impnotes/faq.html#faq-fine > > > -- > Sam Steingold (http://sds.podval.org/) on Ubuntu 12.04 (precise) X > 11.0.11103000 > http://www.childpsy.net/ http://www.PetitionOnline.com/tap12009/ > http://truepeace.org http://camera.org http://www.memritv.org > He who laughs last did not get the joke. > -- Cheers, Andrew Pennebaker www.yellosoft.us |
From: Sam S. <sd...@gn...> - 2012-11-20 17:53:09
|
> * Andrew Pennebaker <naqerj.craaronxre@tznvy.pbz> [2012-11-20 11:43:30 -0500]: > > This isn't completely accurate. what isn't? > *LOAD-TRUENAME* is overwritten when you (load) other code files, bound, not overwritten. > so it doesn't let you reliably get the original script name. I don't think I quite understand your use case. Are you trying to figure out whether a particular file is the "main script" as opposed to being loaded from some other script? One way to do this is to check your own variable *main* and bind it if it is not bound already. This is portable. Another way is to use SYS::*LOAD-LEVEL*, which is bound to incremented values by LOAD. Yet another way is EXT:ARGV http://clisp.org/impnotes/environment-enq.html#argv 2 years ago you asked about this here: http://sourceforge.net/tracker/?func=detail&aid=3124233&group_id=1355&atid=351355 can you offer a better rationale than then? Maybe you want to continue this discussion there? -- Sam Steingold (http://sds.podval.org/) on Ubuntu 12.04 (precise) X 11.0.11103000 http://www.childpsy.net/ http://www.PetitionOnline.com/tap12009/ http://americancensorship.org http://honestreporting.com http://pmw.org.il If I had known that it was harmless, I would have killed it myself. |
From: Andrew P. <and...@gm...> - 2012-11-20 19:01:48
|
> Are you trying to figure out whether a particular file is the "main > script" as opposed to being loaded from some other script? > Yes. There's no standard name for the behavior of bundling a package API with a usable CLI in a single code file, so I've taken to calling it "scripted main" and begun documenting on Rosetta Code<http://rosettacode.org/wiki/Scripted_main> how to achieve this in a variety of programming languages. Another word for programs this is "modulino". > One way to do this is to check your own variable *main* and bind it if > it is not bound already. This is portable. > Another way is to use SYS::*LOAD-LEVEL*, which is bound to incremented > values by LOAD. > Yeah, so I'm looking for a simpler way to do this. Some languages expose this via a variable, like $0, or a single function call. Yet another way is EXT:ARGV > http://clisp.org/impnotes/environment-enq.html#argv This isn't portable. It involves CLISP-specific parsing to reliably extract the script name, so the same code can't be used in ECL, CCL, ABCL, ... I like my code to be very portable. > 2 years ago you asked about this here: > > http://sourceforge.net/tracker/?func=detail&aid=3124233&group_id=1355&atid=351355 > can you offer a better rationale than then? > I agree that modifying the output of ext:*args* would break reverse compatibility. I agree that we don't want to break reverse compatibility. So I'll tweak my suggestion and request that CLISP provides another function much like ext:*args*, except that it exposes an equivalent to C's argv[0]. An easy way to satisfy this is to make a function ext:*argv0*. -- Cheers, Andrew Pennebaker www.yellosoft.us |