Skip to content

Hash of keyword is different between runtimes #232

@skydread1

Description

@skydread1

Problem

The Clojure function related to the error is the following:

(defn valid-cards-ids
  "Returns a list of all the valid cards ids."
  [deck-id & [uuid]] 
  (->> (full-deck deck-id true uuid)
       (map :id)
       set))

The error is actually due to the :id as a function in (map :id)

Calling the function from Unity:

Clojure.GetVar("clojure.core", "map")
    .invoke(RT.keyword(null, "id"), fullDeck)
// => {ChunkedCons}[nil nil nil nil nil nil ...]

In fact, looking at the valAt C# code:

public object valAt(object _param1, object _param2)
{
  object o = _param1;
  switch (Util.hash(o) & 3)
  {
    case 0:
      if (o == (object) Keyword.intern((string) null, "id"))
        return this.id;
      break;
    case 1:
      if (o == (object) Keyword.intern((string) null, "num"))
        return this.num;
      break;
    case 2:
      if (o == (object) Keyword.intern((string) null, "suit"))
        return this.suit;
      break;
    case 3:
      if (o == (object) Keyword.intern((string) null, "deck-id"))
        return this.deck\u002Did;
      break;
  }
  return RT.get(this.__extmap, _param1, _param2);
}

When :id is called, the hash is 1 not 0 as shown above.

So the hash of the keyword :id is different between compiling the valAt of PokerCard and the rumtime calculation.

I directly copied Clojure.dll and Magic.Runtime from my Nostrand to unity assets and got the same results.

So the difference is caused by the different dotnet runtimes.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions