<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p>Sean, <br>
    </p>
    <p>your preferred style of input looks json-like. In this case, as
      there is no language-internal construct to directly parse this,
      you should perhaps take a look at Julien's json library
      (<a class="moz-txt-link-freetext" href="https://github.com/juliensf/mercury-json">https://github.com/juliensf/mercury-json</a>). This means that your
      data should be imported from file and not hard-coded. Beyond a
      certain load, this is good practice anyhow in almost all languages
      I know of, with standard Prolog a possible and controversial
      exception.</p>
    <p>Fabrice<br>
    </p>
    <div class="moz-cite-prefix">Le 25/01/2022 Ã  09:18, Sean Charles
      (emacstheviking) a Ã©crit :<br>
    </div>
    <blockquote type="cite"
      cite="mid:9FFCE782-7A8D-4A57-B4E0-2C88570E244F@gmail.com">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      I actually did try that way but I didn’t like it, I wanted
      something that more accurately â€”read— as it was to be if that
      makes sense… also I guess it was influnced by the fact it’s being
      ported from SWI| Prolog code I wrote before I realised Mercury was
      The Way.
      <div class=""> </div>
      <div class="">The actual SWI code is this, and I wanted it to be
        as visually close as possible henc eusing pair() worked for me
        but I wondered if there was an alternative.</div>
      <div class=""><br class="">
      </div>
      <div class="">Thanks Fabrice.</div>
      <div class="">Sean</div>
      <div class=""><br class="">
      </div>
      <div class=""><br class="">
      </div>
      <div class=""><br class="">
      </div>
      <div class="">type_dict(<br class="">
        Â  Â  _{ names:<br class="">
        Â  Â  Â  Â _{<br class="">
        Â  Â  Â  Â  Â  Â main: "i", % TODO: invert: i: [main, argc] ?!?!?<br
          class="">
        Â  Â  Â  Â  Â  Â argc: "i",<br class="">
        Â  Â  Â  Â  Â  Â argv: "ppc"<br class="">
        Â  Â  Â  Â  Â  Â %i: [i,j,k,n,x,y,z],<br class="">
        Â  Â  Â  Â  Â  Â % c: [c, chr] %TODO: SHOULD I DO THIS???<br class="">
        Â  Â  Â  Â  Â  Â % TODO: Provide a means to UNDO some defaults eg
        specify<br class="">
        Â  Â  Â  Â  Â  Â % an empty replacement as a signal to remove key<br
          class="">
        Â  Â  Â  Â },<br class="">
        Â  Â  Â  Â types:<br class="">
        Â  Â  Â  Â _{<br class="">
        Â  Â  Â  Â  Â  Â v: Â  Â "void",<br class="">
        Â  Â  Â  Â  Â  Â pv: Â  "void*",<br class="">
        <br class="">
        Â  Â  Â  Â  Â  Â c: Â  Â "char",<br class="">
        Â  Â  Â  Â  Â  Â sc: Â  "signed char",<br class="">
        Â  Â  Â  Â  Â  Â uc: Â  "unsigned char",<br class="">
        Â  Â  Â  Â  Â  Â pc: Â  "char*",<br class="">
        Â  Â  Â  Â  Â  Â ppc: Â "char**",<br class="">
        Â  Â  Â  Â  Â  Â cpc: Â "const char*",<br class="">
        Â  Â  Â  Â  Â  Â cppc: Â "const char**",<br class="">
        <br class="">
        Â  Â  Â  Â  Â  Â sh: Â  "short",<br class="">
        Â  Â  Â  Â  Â  Â shi: Â "short int",<br class="">
        Â  Â  Â  Â  Â  Â ssh: Â "signed short",<br class="">
        Â  Â  Â  Â  Â  Â sshi: "signed short int",<br class="">
        <br class="">
        Â  Â  Â  Â  Â  Â us: Â  "unsigned short",<br class="">
        Â  Â  Â  Â  Â  Â ushi: "unsigned short int",<br class="">
        <br class="">
        Â  Â  Â  Â  Â  Â i: Â  Â "int",<br class="">
        Â  Â  Â  Â  Â  Â s: Â  Â "signed",<br class="">
        Â  Â  Â  Â  Â  Â si: Â  "signed int",<br class="">
        <br class="">
        Â  Â  Â  Â  Â  Â u: Â  Â "unsigned",<br class="">
        Â  Â  Â  Â  Â  Â ui: Â  "unsigned int",<br class="">
        <br class="">
        Â  Â  Â  Â  Â  Â l: Â  Â "long",<br class="">
        Â  Â  Â  Â  Â  Â li: Â  "long int",<br class="">
        Â  Â  Â  Â  Â  Â sl: Â  "signed long",<br class="">
        Â  Â  Â  Â  Â  Â sli: Â "signed long int",<br class="">
        <br class="">
        Â  Â  Â  Â  Â  Â ul: Â  "unsigned long",<br class="">
        Â  Â  Â  Â  Â  Â uli: Â "unsigned long int",<br class="">
        <br class="">
        Â  Â  Â  Â  Â  Â ll: Â  "long long",<br class="">
        Â  Â  Â  Â  Â  Â lli: Â "long long int",<br class="">
        Â  Â  Â  Â  Â  Â sll: Â "signed long long",<br class="">
        Â  Â  Â  Â  Â  Â slli: "signed long long int",<br class="">
        <br class="">
        Â  Â  Â  Â  Â  Â ull: Â "unsigned long long",<br class="">
        Â  Â  Â  Â  Â  Â ulli: "unsigned longlong int",<br class="">
        <br class="">
        Â  Â  Â  Â  Â  Â f: Â  Â "float",<br class="">
        Â  Â  Â  Â  Â  Â d: Â  Â "double",<br class="">
        Â  Â  Â  Â  Â  Â ld: Â  "long double",<br class="">
        <br class="">
        Â  Â  Â  Â  Â  Â b: Â  Â "_Bool", % TODO: "auto-include" stdbool.h ?!?!?<br
          class="">
        Â  Â  Â  Â  Â  Â '?': Â "_Bool",<br class="">
        <br class="">
        Â  Â  Â  Â  Â  Â % some extra ones that I find I use all the time<br
          class="">
        <br class="">
        Â  Â  Â  Â  Â  Â fi: Â "FILE",<br class="">
        Â  Â  Â  Â  Â  Â pfi: "FILE*"<br class="">
        Â  Â  Â  Â },<br class="">
        Â  Â  Â  Â defaults:<br class="">
        Â  Â  Â  Â _{<br class="">
        Â  Â  Â  Â  Â  Â variable: "i",<br class="">
        Â  Â  Â  Â  Â  Â function: "v"<br class="">
        Â  Â  Â  Â },<br class="">
        Â  Â  Â  Â %% maps supported types to printf() format specifier for
        EMIT<br class="">
        Â  Â  Â  Â printf:<br class="">
        Â  Â  Â  Â _{<br class="">
        Â  Â  Â  Â  Â  Â 'void*': "%p",<br class="">
        Â  Â  Â  Â  Â  Â 'char': "%c",<br class="">
        Â  Â  Â  Â  Â  Â 'signed char': "%c",<br class="">
        Â  Â  Â  Â  Â  Â 'unsigned char': "%uc",<br class="">
        Â  Â  Â  Â  Â  Â 'char*': "%s",<br class="">
        Â  Â  Â  Â  Â  Â 'char**': "%p",<br class="">
        Â  Â  Â  Â  Â  Â 'const char*': "%s",<br class="">
        Â  Â  Â  Â  Â  Â 'const char**': "%p",<br class="">
        Â  Â  Â  Â  Â  Â 'short': "%i",<br class="">
        Â  Â  Â  Â  Â  Â 'short int': "%i",<br class="">
        Â  Â  Â  Â  Â  Â 'signed short': "%i",<br class="">
        Â  Â  Â  Â  Â  Â 'signed short int': "%ui",<br class="">
        Â  Â  Â  Â  Â  Â 'unsigned short': "%ui",<br class="">
        Â  Â  Â  Â  Â  Â 'unsigned short int': "%ui",<br class="">
        Â  Â  Â  Â  Â  Â 'int': "%i",<br class="">
        Â  Â  Â  Â  Â  Â 'signed': "%i",<br class="">
        Â  Â  Â  Â  Â  Â 'signed int': "%i",<br class="">
        Â  Â  Â  Â  Â  Â 'unsigned': "%ui",<br class="">
        Â  Â  Â  Â  Â  Â 'unsigned int': "%ui",<br class="">
        Â  Â  Â  Â  Â  Â 'long': "%li",<br class="">
        Â  Â  Â  Â  Â  Â 'long int': "%li",<br class="">
        Â  Â  Â  Â  Â  Â 'signed long': "%li",<br class="">
        Â  Â  Â  Â  Â  Â 'signed long int': "%li",<br class="">
        Â  Â  Â  Â  Â  Â 'unsigned long': "%ul",<br class="">
        Â  Â  Â  Â  Â  Â 'unsigned long int': "%ul",<br class="">
        Â  Â  Â  Â  Â  Â 'long long': "%lli",<br class="">
        Â  Â  Â  Â  Â  Â 'long long int': "%lli",<br class="">
        Â  Â  Â  Â  Â  Â 'signed long long': "%lli",<br class="">
        Â  Â  Â  Â  Â  Â 'signed long long int': "%lli",<br class="">
        Â  Â  Â  Â  Â  Â 'unsigned long long': "%llu",<br class="">
        Â  Â  Â  Â  Â  Â 'unsigned long long int': "%llu",<br class="">
        Â  Â  Â  Â  Â  Â 'float': "%g",<br class="">
        Â  Â  Â  Â  Â  Â 'double': "%g",<br class="">
        Â  Â  Â  Â  Â  Â 'long double': "%Lg",<br class="">
        Â  Â  Â  Â  Â  Â '_Bool': "%i",<br class="">
        Â  Â  Â  Â  Â  Â 'FILE*': "%p"<br class="">
        Â  Â  Â  Â  Â  Â }<br class="">
        Â  Â  Â }<br class="">
        ).<br class="">
        <br class="">
        <br class="">
        <br class="">
        <br class="">
        <br class="">
      </div>
      <div class="">
        <div><br class="">
          <blockquote type="cite" class="">
            <div class="">On 25 Jan 2022, at 00:27, Fabrice Nicol <<a
                href="mailto:fabrnicol@gmail.com"
                class="moz-txt-link-freetext" moz-do-not-send="true">fabrnicol@gmail.com</a>>
              wrote:</div>
            <br class="Apple-interchange-newline">
            <div class="">
              <meta http-equiv="Content-Type" content="text/html;
                charset=UTF-8" class="">
              <div class="">
                <p class="">Below is an alternative, which has pros and
                  cons. <br class="">
                </p>
                <p class="">A bit more concise, but you have to align
                  the data carefully to avoid input errors.</p>
                <p class="">Or, if you have lots of data, you can write
                  a database in a file, and parse (use the GH csv
                  library for example).<br class="">
                </p>
                <p class="">%%<br class="">
                </p>
                <p class="">:-module map_test.<br class="">
                  :-interface.<br class="">
                  :-import_module io.<br class="">
                  :-import_module map.<br class="">
                  :-import_module string.<br class="">
                  :-pred create_maps(map(string, string), map(string,
                  string)).<br class="">
                  :-mode create_maps(out, out) is det.<br class="">
                  <br class="">
                  :-pred main(io::di, io::uo) is det.<br class="">
                  <br class="">
                  :-implementation.<br class="">
                </p>
                <p class="">:-import_module list.<br class="">
                  <br class="">
                  %% create<br class="">
                  <br class="">
                  create_maps(Types, Vars) :-<br class="">
                  Â Â Â  K1 = ["i",       "psz",         "   
                  v",            "pv",<br class="">
                  Â Â Â Â Â Â Â Â Â Â Â Â  "c",       "sc",              
                  "uc",           "pc",<br class="">
                  Â Â Â Â Â Â Â Â Â Â Â Â  "ppc", Â Â  "cpc",             "cppc"],<br
                    class="">
                  Â Â Â  V1 = ["int",  Â Â  "char*",   Â Â Â Â Â Â Â  "void",      
                  "void*",<br class="">
                  Â Â  Â Â Â Â Â Â Â Â  "char",   "signed char", "unsigned char",
                  "char*",<br class="">
                  Â  Â Â  Â Â Â Â Â Â  "char**", "const char*", "const char**"],<br
                    class="">
                  Â Â Â  K2 = ["argc",   "argv"],<br class="">
                  Â Â Â  V2 = ["int",    "ppc"],<br class="">
                  Â Â Â  det_insert_from_corresponding_lists(K1, V1,
                  map.init, Types),<br class="">
                  Â Â Â  det_insert_from_corresponding_lists(K2, V2,
                  map.init, Vars).<br class="">
                  <br class="">
                  %% test<br class="">
                  <br class="">
                  main(!IO) :- create_maps(Types, Vars),<br class="">
                  Â Â Â  write_string(Types^det_elem("cpc"), !IO),<br
                    class="">
                  Â Â Â  nl(!IO),<br class="">
                  Â Â Â  write_string(Vars^det_elem("argc"), !IO),<br
                    class="">
                  Â Â Â  nl(!IO).</p>
                <p class="">:-end_module<br class="">
                </p>
                <p class="">%%</p>
                <p class="">$ ./map_test</p>
                <p class="">const char*<br class="">
                  int</p>
                <p class="">%%<br class="">
                </p>
                <p class="">Fabrice</p>
                <p class=""><br class="">
                </p>
                <blockquote type="cite"
                  cite="mid:0A280606-7937-41AA-B4BB-9B2540322678@gmail.com"
                  class="">
                  <meta http-equiv="Content-Type" content="text/html;
                    charset=UTF-8" class="">
                  Is there a more concise way of creating a map full of
                  static data? The best I have obtained is this:
                  <div class=""><br class="">
                  </div>
                  <div class=""><font class="" face="Courier New">default_typemap
                      = Out :-<br class="">
                      Â  Â  map.from_assoc_list([<br class="">
                      Â  Â  Â  Â  ("i" Â  Â - "int"),<br class="">
                      Â  Â  Â  Â  ("psz" Â - "char*"),<br class="">
                      Â  Â  Â  Â  ("v" Â  Â - "void"),<br class="">
                      Â  Â  Â  Â  ("pv" Â  - "void*"),<br class="">
                      Â  Â  Â  Â  ("c" Â  Â - "char"),<br class="">
                      Â  Â  Â  Â  ("sc" Â  - "signed char"),<br class="">
                      Â  Â  Â  Â  ("uc" Â  - "unsigned char"),<br class="">
                      Â  Â  Â  Â  ("pc" Â  - "char*"),<br class="">
                      Â  Â  Â  Â  ("ppc" Â - "char**"),<br class="">
                      Â  Â  Â  Â  ("cpc" Â - "const char*"),<br class="">
                      Â  Â  Â  Â  ("cppc" - "const char**")<br class="">
                      Â  Â  ],<br class="">
                      Â  Â  Types),<br class="">
                      Â  Â  map.from_assoc_list([<br class="">
                      Â  Â  Â  Â  ("argc" - "int"),<br class="">
                      Â  Â  Â  Â  ("argv" - "ppc")<br class="">
                      Â  Â  ],<br class="">
                      Â  Â  Vars),</font></div>
                  <div class=""><font class="" face="Courier New">:</font></div>
                  <div class=""><font class="" face="Courier New">: ..
                      more code..</font></div>
                  <div class=""><font class="" face="Courier New">:</font></div>
                  <div class=""><br class="">
                  </div>
                  <div class="">Each backend coder that is a for typed
                    language will be providing an initial lookup of both
                    variables and types so it can infer necessary typing
                    at code render time.</div>
                  <div class=""><br class="">
                  </div>
                  <div class="">Thanks,</div>
                  <div class="">Sean</div>
                  <div class=""><br class="">
                  </div>
                  <br class="">
                  <fieldset class="moz-mime-attachment-header"></fieldset>
                  <pre class="moz-quote-pre" wrap="">_______________________________________________
users mailing list
<a class="moz-txt-link-abbreviated moz-txt-link-freetext" href="mailto:users@lists.mercurylang.org" moz-do-not-send="true">users@lists.mercurylang.org</a>
<a class="moz-txt-link-freetext" href="https://lists.mercurylang.org/listinfo/users" moz-do-not-send="true">https://lists.mercurylang.org/listinfo/users</a>
</pre>
                </blockquote>
              </div>
            </div>
          </blockquote>
        </div>
        <br class="">
      </div>
    </blockquote>
  </body>
</html>