Deutsch   English   Français   Italiano  
<vgl7q8$37p49$1@dont-email.me>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!eternal-september.org!feeder2.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: Ruvim <ruvim.pinka@gmail.com>
Newsgroups: comp.lang.forth
Subject: Re: bye with exit status
Date: Fri, 8 Nov 2024 18:39:04 +0400
Organization: A noiseless patient Spider
Lines: 128
Message-ID: <vgl7q8$37p49$1@dont-email.me>
References: <vgfmfe$22uop$1@dont-email.me> <vgg6q4$26lgs$1@dont-email.me>
 <4d5b92710816ddfe2dbbb04a2177b40b@www.novabbs.com>
 <c52c3b51c000c9139d938079e3cfe988@www.novabbs.com>
 <2024Nov8.092913@mips.complang.tuwien.ac.at> <vgl1al$369hb$2@dont-email.me>
 <2024Nov8.142144@mips.complang.tuwien.ac.at>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Injection-Date: Fri, 08 Nov 2024 15:39:05 +0100 (CET)
Injection-Info: dont-email.me; posting-host="e737efc88dec1dd6103f16e7236b5230";
	logging-data="3400841"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX18xEDCwux/fqtpieGC5Qsm4"
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:IVUajU5pNArR67OINjcJR7m3pAo=
Content-Language: en-US
In-Reply-To: <2024Nov8.142144@mips.complang.tuwien.ac.at>
Bytes: 5187

On 2024-11-08 17:21, Anton Ertl wrote:
> Ruvim <ruvim.pinka@gmail.com> writes:
>> On 2024-11-08 12:29, Anton Ertl wrote:
>>> mhx@iae.nl (mhx) writes:
>>>> Same as remarked by minforth: there is a exit-handler chain in
>>>> which the user can plug arbitrary routines.
>>>
>>> In Gforth BYE is a deferred word, with the intention that it can be
>>> extended with cleanup actions.
>>>
>>> The disadvantage of this approach in connection with the non-0 exit is
>>> that we probably also want to do the same cleanup in those cases.  The
>>> best way to deal with that is probably the "EXIT-CODE !" approach.
>>
>> I think, this variable, if it is required, should be internal.
>>
>> For example:
>>
>>    variable _system-exit-status  0 _system-exit-status !
>>
>>    : kernel-bye ( -- never )
>>      ... \ other actions
>>      _system-exit-status @ (bye)
>>    ;
>>
>>    defer bye  ' kernel-bye is bye
>>
>>    : bye-with-status ( n -- never )
>>      _system-exit-status ! bye
>>    ;
> 
> Yes.
> 
>> Thus, the old interface is not changed. And `bye-with-status` also does
>> the same cleanup sequence (if any).
> 
> Which old interface?

I mean, the Gforth's defer-based interface to "BYE" that allows to 
extend it with cleanup actions, like this:

   :noname
     ." (cleanup actions on BYE)" cr
     [ action-of bye compile, ]
   ; is bye


   1 bye-with-status
   \ the cleanup actions will be executed



> 
>>> Concerning the usual discussion about the name: I find that the system
>>> is left in the error case with an uncaught THROW in script-execution
>>> mode; in that case an exit code of 1 is returned by Gforth, so it's
>>> not sufficient for communicating more than a binary result to the
>>> calling script.  But I have not used non-binary exit codes for
>>> non-Forth programs, either, and I do quite a bit of shell scripting.
>>
>> Does it mean that "bye" and "bye-failure" is enough?
> 
> It means that BYE and THROW (ABORT etc.) is enough.  E.g., if I want
> to implement something like the program false:
> 
> [/tmp:153395] cat >myfalse <<EOF
> #! /home/anton/gforth/gforth
> abort
> EOF
> [/tmp:153396] cat myfalse
> #! /home/anton/gforth/gforth
> abort
> [/tmp:153402] chmod +x myfalse
> [/tmp:153397] ./myfalse
> 
> [/tmp:153398] echo $?
> 255
> [/tmp:153399] false
> [/tmp:153400]
> 
> One difference from the behaviour of false is, as you can see, that
> myfalse still produces a newline (probably coming from ABORT, because
> it works if I replace the ABORT with "255 (bye)".  Maybe still
> something to work on.


I see. But it depends on application, see below.


> 
>>> In any case, while we have (BYE), I don't use it in application
>>> programs.
>>
>>
>> As an example, when a script is used in Make, it is important to return
>> nonzero exit status on error.
> 
> Errors tend to result in uncaught THROWs, not in calls to (BYE).  And
> these uncaught THROWs actually produce a nonzero exit status.  They
> tend to also produce a useful error message without too much work:
> 
> [/tmp:153406] gforth -e 's" /etc/passwd" slurp-file type bye'
> root:x:0:0:root:/root:/bin/bash
> ...
> [/tmp:153407] gforth -e 's" /typo/etc/passwd" slurp-file type bye'
> 
> *OS command line*:-1: No such file or directory
> s" /typo/etc/passwd" >>>slurp-file<<< type bye
> Backtrace:
> $7FA065165980 throw
> [/tmp:153408] echo $?
> 1


Yes, it is a quick result, without too much work.


But in some applications you cannot output error messages from the Forth 
system to the user. You should use the exit status and output 
user-friendly application-specific messages (if any). An exception that 
cannot be handled (like division by zero, stack overflow, invalid memory 
address) means an error in the program, it should be logged into a 
special file and perhaps automatically send to the author.


--
Ruvim