Many thanks for the quick fix.

As to the *⍎* issue, I'm using libapl in a limited context as an embedded expression evaluator and not as a full-fledged APL environment, so maybe the issue won't bite me.  I expect I'll find out later today.

Thanks again,
Chris

On 1/1/21 7:24 AM, Dr. Jürgen Sauermann wrote:
Hi Chris,

fixed in *SVN 1400*.

However, please note the following:

In GNU APL, you may, in principle, execute commands with ⍎ which is a non-standard APL extension. I have tested your case with both *⍎')LOAD wsname'*and with *⍎')COPY wsname'
*instead of libapl. The first test failed while the second case succeeded.

The reason why the first case failed was because ⍎ of commands is only
allowed for commands that do not modify the *)SI *stack (otherwise
hell would brake loose). Now, *)LOAD* modifies the *)SI* stack while*)COPY*
does not. Since not allowing *)LOAD* would be somewhat weird, it
is not entirely rejected, but does an automatic *)SIC* before it is being executed. This )SIC is necessary (since after it a )LOAD does no longer modify the )SI stack) but invisible to the user. As a consequence, the result of an assignment like *Q←**⍎')LOAD wsname'*gets lost because an error occurs before the assignment takes place and right after the error the *)SI* stack is cleared (which hides the error from the user).

I suppose that *libapl* behaves somewhat differently because it performs the command directly instead of using ⍎, but the problem remains the same. The assignment of the
)LOAD command output is done in the old workspace which is )CLEARed before
the *)LOAD* proceeds and may therefore be lost. The commands which do an automatic
*)SIC* are:*)LOAD*, *)QLOAD*, *)CLEAR* (aka. *)RESET*) and *)SIC*.

Best Regards,
Jürgen


On 12/31/20 8:59 PM, Chris Moller wrote:
Being some combination of sadistic and masochistic, I'm trying to use the libapl library using the libapl.h API

libapl.h says

    /// Pass `command` to the command processor and return its output.
    extern const char * apl_command(const char * command_utf8);

but when I do

    const char *rc = apl_command (")load workspace");

it dumps

    SAVED 2020-12-30 17:18:13 (GMT-4)

to stdout and rc is empty.

Am I doing something wrong, or am I trying to do something APL was never intended to do?  I'd like to be able to capture everything libapl says and not have it go to stdout/stderr.

--cm


Reply via email to