I did some tests and I am feeling confused atm. ``` (de pg-trans X (run X 1) )
(de execute-eval @ (mapcar eval (rest)) ) (de execute-run X (run X 1) ) (de assert-throws (Type . Prg) (prinl (catch Type (eval Prg))) ) (de assert-throws-q (Type Prg) (prinl (catch Type (eval Prg))) ) (de assert-throws-t Prg (prinl (catch T (eval Prg))) ) (de assert-throws-myerr Prg (prinl (catch 'myerr (eval Prg))) ) (de myerr-fun () (throw 'myerr "EXIT") ) (prinl "EXECUTE EVAL") [execute-eval '(assert-throws 'myerr (pg-trans (myerr-fun)) ) '(assert-throws-q 'myerr '(pg-trans (myerr-fun)) ) '(assert-throws-t (pg-trans (myerr-fun)) ) '(assert-throws-myerr (pg-trans (myerr-fun)) )] (prinl "EXECUTE RUN") [execute-run (assert-throws 'myerr (pg-trans (myerr-fun)) ) (assert-throws-q 'myerr '(pg-trans (myerr-fun)) ) (assert-throws-t (pg-trans (myerr-fun)) ) (assert-throws-myerr (pg-trans (myerr-fun)) )] (bye) ``` ``` -> [abel@abel-pc picolisp-playbook]$ pil uneval-fargs.l + EXECUTE EVAL EXIT EXIT EXIT EXIT EXECUTE RUN EXIT EXIT EXIT EXIT ``` So its seems like unevaluated fargs always keep track of their environment and work as intended. Then I do not understand my issue in tests of pgint.l in one specific case when I have to test exception thrown inside of (pg-trans). When I write code that *will* throw and exception and I run it outside of aw/picolisp-unit (execute) function it is catched and treated as intended. But when I run corrupted (pg-trans ...) *inside* of (execute) function it stops with "pg-db-err -- Tag not found". At first I thought that the cause of this error in quoting requirement for test-cases. So in order to run test cases you have to run: ``` [execute '(assert-t ...) ] ``` Execute function looks like this: ``` [de execute @ (mapcar eval (randomize (rest) ] ``` But when yesterday I tried to rewrite (execute) to use (run) for evaluating fargs I met the same error, surprisingly. Then I thought that the case probably with (assert-throws) function where testbody executed with (eval): ``` [de assert-throws (Type Error Result Message) (let Result (catch Type (eval Result) NIL) (if (= Error Result) (passed Message) (failed Error Result Message) ] ``` But I tested similar behaviour in my test above and it seems correct. After that I played a little with test case itself: ``` '(assert-throws 'pg-db-err NIL '(pg-trans (catch 'pg-data-err (pg-execute "SELECT 1/0;")) '(pg-execute "SELECT 1;") ) ) ``` quoted second farg works well ``` '(assert-throws 'pg-db-err NIL '(pg-trans (catch 'pg-data-err (pg-execute "SELECT 1/0;")) (pg-execute "SELECT 1;") ) ) ``` unquoted fails with "pg-db-err -- Tag not found" ``` '(assert-throws 'pg-db-err NIL '(pg-trans (catch 'pg-data-err (pg-execute "SELECT 1/0;")) (catch 'pg-db-err (pg-execute "SELECT 1;")) ) ) ``` unquoted second farg with (catch) on this specific fun works well ``` '(assert-t (catch 'pg-db-err # or T (pg-trans (catch 'pg-data-err (pg-execute "SELECT 1/0;")) (pg-execute "SELECT 1;") ) ) ) ``` explicit (catch) fails as well. Probably Im missing something? Thanks. Best regards, Nail. сб, 19 янв. 2019 г. в 16:57, Alexander Burger <a...@software-lab.de>: > On Sat, Jan 19, 2019 at 04:27:53PM +0300, Abel Normand wrote: > > So I have a question, is there a reason to quote functions used as args > for > > functions with manually evaluated arguments? I thought that there is no > > such reason to quote this sub S-expressions because they are not > evaluated > > anyway (due to function declaration like for pg-trans or assert-throws) > > You mean FEXPRs, like > > (de pg-trans X > ... ) > > where 'X' is bound to the unevaluated argument list, right? As this > function > later *does* evaluate the args with (mapc eval X), it is indeed not good to > quote these args, as you *want* them to be evaluated. > > If they are quoted, they evaluate to the expression itself, instead of > being > executed, and this makes no sense here. > > BTW, instead of (mapc eval X) it is better to call (run X) or even > better (run X 1). > > ☺/ A!ex > > -- > UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe > -- С уважением, Наиль.