On 5/28/2020 11:24 PM, cont...@vivaldi.net wrote:
Hello,

one more question - why macros \Undefined and \DoNothing show "defined" although I (tried to) undefine them?

----
\starttext
   \def\MyMacro{Ahoj}
   \def\MyMac#1#2{Something}

   \def\Undefined{}
   \let\Undefined\undefined

   \def\DoNothing{}
   \let\DoNothing\donothing

   \startluacode
     local str = { [true] = "defined", [false] = "undefined" }

     local function whatever(s)
       context.type("\\" .. s)
      context(" is " .. (tokens.defined(s) and "defined" or "undefined")) --% Hans' way       context(" and is " .. str[token.is_defined(s)] .. ".") --% Henri's way
       context.par()
     end

     whatever("MyMacro")
     whatever("MyMacroD")
     whatever(" ")
     whatever("-")
     whatever("Undefined")
     whatever("DoNothing")
   \stopluacode

   %\Undefined % Causes "! Undefined control sequence"
\stoptext
----

Gives:

"
\MyMacro is defined and is defined.
\MyMacroD is undefined and is undefined.
\ is defined and is defined.
\- is defined and is defined.
\Undefined is defined and is defined.
\DoNothing is defined and is defined.
"
Because the macro actually *is* defined: as soon as tex sees

\foo

it reserves the name and gives it the meaning undefined, so even \undefined is defined.

Anyway, that is why we have \ifdefined that does a different kind of checking. In retrospect, that is a better one, so I'll adapt that in lmtx.

\starttext
  \let\MyMacroA\undefined

  \startluacode
    local function whatever(s)
        context.type("\\" .. s)
context(" is " .. (tokens.defined(s,true) and "defined" or "undefined")) --% Hans' way context(" and has meaning " .. (tokens.defined(s) and "defined" or "undefined")) --% Hans' way
        context.par()
    end

    whatever("MyMacroA")
    whatever("MyMacroB")
  \stopluacode

\stoptext

\MyMacroA is defined and has meaning undefined
\MyMacroB is undefined and has meaning undefined


You can do this in current luatex/mkiv:

    if CONTEXTLMTXMODE == 0 then

        local d = tokens.defined
        local c = tokens.create

        function tokens.defined(s,b)
            if b then
                return d(s)
            else
                return c(s).cmd_name == "undefined_cmd"
            end
        end

    end

Hans


-----------------------------------------------------------------
                                          Hans Hagen | PRAGMA ADE
              Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
       tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl
-----------------------------------------------------------------
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the 
Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://context.aanhet.net
archive  : https://bitbucket.org/phg/context-mirror/commits/
wiki     : http://contextgarden.net
___________________________________________________________________________________

Reply via email to