janet-lang / janet

A dynamic language and bytecode vm
https://janet-lang.org
MIT License
3.38k stars 217 forks source link

(default) not working #1327

Closed iacore closed 8 months ago

iacore commented 8 months ago

I don't know how to name the bug (issue title). It is very fundamental.

(def x "A")
#(default x "B")
(def x (if (= nil x) "B" x))
# this works
# (def x (if (pp (= nil x)) "B" x))
(pp x)

What I see as output: B What I should see: A

bakpakin commented 8 months ago

Git bisect found:

Author: primo-ppcg <mike.tryczak@gmail.com>
Date:   Wed Aug 23 16:01:16 2023 +0700

    Optimize nil conditions for while and if

 src/core/specials.c | 74 +++++++++++++++++++++++++++++++++++++----------------
 1 file changed, 52 insertions(+), 22 deletions(-)
bakpakin commented 8 months ago

I will look into this and give a proper fix later, I don't expect it should be too complicated

sogaiu commented 8 months ago

I don't understand (^^;

Some of the output for (doc default) here is:

    (default sym val)

    Define a default value for an optional argument. Expands to `(def 
    sym (if (= nil sym) val sym))`.

That suggests to me that default is supposed to make sense in the context of where "optional argument" makes sense, e.g.:

$ janet
Janet 1.32.1-1ccd544b linux/x64/gcc - '(doc)' for help
repl:1:> (defn test [&opt x] (default x "B") x)
<function test>
repl:2:> (test "A")
"A"
repl:3:> (test)
"B"

That looks like it's working to me, so may be I'm missing a case where it doesn't work.

Please help me understand what the issue is.

iacore commented 8 months ago

@sogaiu Run the first code snippet on this page.

sogaiu commented 8 months ago

The first code snippet in the page does not appear to be in the context of a function definition.

The documentation explicitly mentions optional argument:

Define a default value for an optional argument.

I take that to mean there must be a surrounding defintion of some callable (e.g. function or macro).

sogaiu commented 8 months ago

Ok, I think I get it now.

$ janet
Janet 1.32.1-1ccd544b linux/x64/gcc - '(doc)' for help
repl:1:> (def x "A")
"A"
repl:2:> (def x (if (= nil x) "B" x))
"B"

I confused myself by thinking that the problem was with default (^^;