1

我正在完成第 3 章,七周内七种语言的一天(“香肠王”)。我已经直接从书中复制了代码,但它不起作用。

Io 20110905

将新运算符添加到 OperatorTable。

Io> OperatorTable addOperator("xor", 11)
==> OperatorTable_0x336040:
Operators
  0   ? @ @@
  1   **
  2   % * /
  3   + -
  4   << >>
  5   < <= > >=
  6   != ==
  7   &
  8   ^
  9   |
  10  && and
  11  or xor ||
  12  ..
  13  %= &= *= += -= /= <<= >>= ^= |=
  14  return

Assign Operators
  ::= newSlot
  :=  setSlot
  =   updateSlot

To add a new operator: OperatorTable addOperator("+", 4) and implement the + message.
To add a new assign operator: OperatorTable addAssignOperator("=", "updateSlot") and implement the updateSlot message.

输出确认它已添加到插槽 11。现在让我们确保 true 尚未定义 xor 方法。

Io> true slotNames
==> list(not, asString, asSimpleString, type, else, ifFalse, ifTrue, then, or, elseif, clone, justSerialized)

它不是。所以让我们创建它。

Io> true xor := method(bool if(bool, false, true))
==> method(
    bool if(bool, false, true)
)

还有一个是假的。

Io> false xor := method(bool if(bool, true, false))
==> method(
    bool if(bool, true, false)
)

现在检查是否添加了 xor 运算符。

Io> true slotNames
==> list(not, asString, asSimpleString, type, else, xor, ifFalse, ifTrue, then, or, elseif, clone, justSerialized)

伟大的。我们可以使用它吗?(同样,这段代码直接来自书中。)

Io> true xor true

  Exception: true does not respond to 'bool'
  ---------
  true bool                            Command Line 1
  true xor                             Command Line 1

不,我不确定“不响应'bool'”是什么意思。

4

1 回答 1

6

您忘记了逗号并定义了一个无参数方法,其第一条消息是bool- true(在其上调用它)不知道有什么关系。你想做的是

true xor := method(bool, if(bool, false, true))
//                     ^
// or much simpler:
false xor := true xor := method(bool, self != bool)
// or maybe even
false xor := true xor := getSlot("!=")
// or, so that it works on all values:
Object xor := getSlot("!=")
于 2014-12-12T16:16:10.820 回答