6.25. kink/VAL

値一般を扱う関数を提供する。

6.25.1. val型

valは普遍的な上位型、あるいはすべての型の上位型である。すべての値はval型のインスタンスである。

val型はただひとつのメソッド、reprを持つ。これは、Kinkのすべての値がreprメソッドを持つことを意味する。

6.25.1.1. Val.repr

reprはValを表すstr値を、デバッグ目的のために戻す。

結果の形式は型ごとに異なる:

:BIN.require_from('kink/')

stdout.print_line(new_val.repr)         # => (val id_hash=123)
stdout.print_line([1 2 3].repr)         # => [1 2 3]
stdout.print_line(BIN.of(1 2 3).repr)   # => (bin 0x01 0x02 0x03)
stdout.print_line("hello world\n".repr) # => "hello world\n"

例として、reprの結果はエラーメッセージを構築するのに使える。

:NUM.require_from('kink/')

:to_int <- {(:N)
  NUM.is?(N) || raise(
    'to_int(N): N must be a num, but was {}'.format(N.repr))
  N // 1
}

to_int('foo')
# Output:
#   -- main exception
#   ...
#   {(stdin) L4 C17 raise} NUM.is?(N) || -->raise(
#   to_int(N): N must be a num, but was "foo"

ランタイムも、reprの結果をエラーメッセージを構築するのに使う。

'foo'.bar
# Output:
#   -- main exception
#   ...
#   [(stdin) L1 C7] 'foo'.-->bar
#   no such var: bar not found in "foo"

エラーメッセージの他には、reprはログメッセージを構築するのにも使えるかも知れない。

reprの実装にはいくつかの要件がある。

reprはstr値を戻さなければならない。

上述したとおり、reprはエラーメッセージを構築するのに使われる。呼び出し元はreprがstr値を戻すことを期待している。もし仮にreprがstrでない値を戻したら、要件が満たされないので、結果ははちゃめちゃなものになる。

無限の長さ、深さを持つデータに対しても、reprは有限長のstr値を戻さなければならない

コンテナ型を実装する場合、おそらくコンテナのreprメソッドは要素のreprメソッドを呼ぶことになる。無限の長さ、深さを持つデータに対しても、reprメソッドが有限長のstr値を戻すように注意せよ。

:Y <- [4 5 6]
:X <- [1 2 3 Y]
Y.push_back(X)
stdout.print_line(X.repr) # => [1 2 3 [4 5 6 [,,,]]]

再帰データのチェックはdyn値を使って行える。kink/container/FLAT_SETの実装を参照せよ。

結果は長すぎず

reprの結果が長すぎると、デバッグ出力が使い物にならなくなるかも知れない。結果が長くなりすぎないように注意せよ。

6.25.2. VAL.id_hash(Val)

id_hashはValに割り当てられた整数のnum値を戻す。同じ値に対して、id_hashを複数回呼び出すと、毎回おなじ整数を戻す。

結果は値の同一性のハッシュコードとして使える。

6.25.3. VAL.same?(X Y)

same?はふたつの引数XとYが、同じ値であるかどうかを戻す。

:VAL.require_from('kink/')

:test_identity <- {(:X :Y)
  if(VAL.same?(X Y)
    { stdout.print_line('same') }
    { stdout.print_line('different') }
  )
}
:V <- new_val
test_identity(V V)        # => same
test_identity(V new_val)  # => different

6.25.4. VAL.var_syms(Val)

`var_syms` does variable-symbols operation, and returns the set of syms of the vars of `Val`.

結果はstr値のsetである。

:VAL.require_from('kink/')

:V <- new_val('Data' 42 'fun' {})
stdout.print_line(VAL.var_syms(V).repr) # => (flat_set "Data" "fun" "repr")

6.25.5. VAL.identity(Val)

identityはValを戻す。

:VAL.require_from('kink/')

stdout.print_line(VAL.identity('foo').repr) # => "foo"