Getting started with Io-2

博客分类: 技术 阅读次数: comments

Getting started with Io-2

如何用Io的槽和消息构造核心行为。

控制流

循环

多余参数问题

可以自由输入无用的多余参数:如果输入参数超过最多需要的参数,多余的参数只会被忽略;但如果前面有可选参数(比如for中的步长)没有输入,就会使语句脱离本意,而Io编译器不会检查出这种错误。

条件控制

运算符

Io> OperatorTable
==> OperatorTable_0x562d908bef60:
Operators
  0   ? @ @@
  1   **
  2   % * /
  3   + -
  4   << >>
  5   < <= > >=
  6   != ==
  7   &
  8   ^
  9   |
  10  && and
  11  or ||
  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.

添加自定义运算符

通过addOperator可以往指定优先级添加自定义的运算符,然后要对二元运算符左侧的可能出现的各个对象类型分别定义以该运算符为名的方法。优先级在省略括号时起作用。

赋值运算符自成一表。它们会像消息那样运行。

消息

通过消息,可以实现自己的控制结构。

除了注释符和参数之间的逗号外的一切都是消息。

发送者,目标,参数

消息由发送者发送至目标,然后由目标执行该消息。

call方法访问元信息,例如:

postOffice = Object clone
postOffice packageSender := method(call sender)
postOffice messageTarget := method(call target)
postOffice getMessage := method(call message)
postOffice messageArgs := method(call message arguments)
postOffice messageName := method(call message name)

直接调用postOffice packageSender,返回postOffice对象本身。

在其它对象中调用postOffice packageSender,返回直接在其方法中包含这条调用语句的对象。

调用postOffice messageTarget,总是返回postOffice对象本身。

参数:在消息中用括号包含参数列表,call message arguments返回一个包含参数列表的List对象。

定义控制结构

Io的对象不会先把收到消息中的参数求值后再放到栈上,而是直接把收到的整句消息发送给它的方法中调用的那个最终接受消息的对象,在后者的内部的语境中求值。

利用这种特性可以定义控制语句

unless.io

对象反射(Object reflection)

animals.io

Reflection is the ability of a program to manipulate variables, properties, and methods of objects at runtime. Reflection refers to the ability for code to examine attributes about objects that might be passed as parameters to a function.

Extra

fib.io

fake_div.io

sum2d.io

my_average.io

matrix.io

rand_guess.io