PreRebol30ManualGuideWritingCodeCodeHowCodeIsEvaluated/ja

From DocBase

Jump to: navigation, search

Contents

REBOL 3 Guide: Code: How code is evaluated

左から右へ、そして右から左へ。

Contents

  • Evaluation sequence
  • Multiple expressions
  • Multiple results
  • Operator precedence
  • Parentheses

Evaluation sequence (評価の順序)

code: evaluating code blocksにおいて、あなたはコードがデータブロックが、直接評価されるデータブロックに保持されることを学んだ。

一般的に、式は左から右に向けて評価される; ただし、個々の式の中では右から左に評価される

次の例を見てみよう:

print length? join "exam" "ple"

print関数とlength?関数は1つの引数を要求する。 join関数には2つの引数が必要だ。 あなたはこの行を個々に評価される別々のセクションに分割することか可能だ。

私達はここから始めよう:

print length? join "exam" "ple

これは次の行を評価することになる:

print length? "example"

最終的にはこうなる:

print 7

これは評価を理解するための置換法と呼ばれる。覚えておきやすい。

式の区切り文字がないだって?

他の言語を知っているプログラマーにとって、REBOLがこれらを一つの式に結合することは奇妙に思えるかもしれない。私達には余計な括弧やカンマや他の区切り文字は必要ない。

私達にいえるのは、心配ないということだけだ! 私達は、これが実際にうまく機能することを知っている。 あなたが慣れれば、あなたの頭が文のパージングできるようになり、REBOLの式のパーズも出来るようになる。


Multiple expressions (複数の式)

複数の式も同様に書ける。 セパレータは不要だが、私達は読み易くするために新しい式を改行して書くこともある。

次の例は、3つの別々の式だ:

print "reading web page..."
data: read http://www.rebol.com
print length? data

あなたはこれを1行で書いてしまうことも出来るが、結果は同じだ。

個々の式の始まりと終わりを知るにはどうすればいいだろうか? それは、それぞれの関数が必要とする引数の数であるarity〔訳注:辞書に無い〕で決まる。 例えば、printは引数を1つだけ取る。 その引数が与えられてしまえば、評価は次の式に進む。

ある関数がいくつの引数を要求するのかが不明な場合には、helpを使おう。 しかし、多くの一般的な関数については、あなたがそれを覚えるのに大した時間はかからないだろう。

Multiple results (複数の返り値)

code: evaluating code blocksにおいて説明したように、ブロックは結果を返す。 だが、ブロックから複数の結果を返してもらいたい時もある。

あなたが次のように書いた時になにが怒るかを考えてみよう:

print ["results:" 1 + 2 3 * 4]
results: 3 12

ここでは、ブロックはprintに1つ以上の値を渡している。

また、次の例では、ブロックの結果は上とは異なっている:

do ["results:" 1 + 2 3 * 4]
12

複数の返り値が必要な時には、doではなく、reduceを使わなければいけない:

reduce ["results:" 1 + 2 3 * 4]
["results:" 3 12]

あなたの結果に対する評価における置換法の働きに違いは無いが、ブロック内の結果の全てを保持することが出来ることに注意しよう。

これはREBOLにおいて非常に重要な概念だ。これによって、単一の値を扱うのと似たやり方で、あなたは複数の値を渡したり、保存したり、返したり出来る

Operator precedence (演算子の優先)

数式を読み易くするために、この言語では加算、減算、乗算、除算、その他のいくつかの演算子については中置法をサポートしている。

これらの演算子は、上のルールについての例外だ。 次の式を見てみよう:

print 1 + 2

この式は次のように評価される:

print (1 + 2)

次のようにではない:

(print 1) + 2

演算子は通常の関数に優先する。 しかし、全ての演算子が同じ優先度を持つということに注意しよう。 演算子は左から右へと適用される。

次の例を見てみよう:

print 1 + 2 * 3 + 4 * 5
65

これは左から右へと評価されている。置換法を使えばこうなる:

print 3 * 3 + 4 * 5

print 9 + 4 * 5

print 13 * 5

print 65

値の順番を入れ替えれば、結果も異なる:

print 2 * 3 + 1 + 4 * 5
55

つまり、単に左から右に評価されているのだ。そして演算子は関数より優先される。

次の例を見よう:

print 10 * sine 30 + 60

これの評価は次のようになる:

print 10 * sine 90
print 10 * 1.0
print 10.0

Linear precedence

あなたが他の言語でプログラムを作る場合、あなたはこの違いを思い出す必要があるだろう。

私達は、大抵の式において、linear precedenceがうまく、あるいはmultilevel precedenceよりもよく機能することに気づいた。それに、あなたは全ての優先順位を覚えるような必要も無い (比較と論理を付け加えたりすれば、複雑になりすぎて、一握りの人しかそれを理解できなくなってしまう)。 〔訳注:"linear precedence"は「書かれた順番どおりに優先する方法」、"multilevel precedence"は「複数のレベルの優先順位を持つ方法」というような意味だと思うが、適当な訳語を思いつかないし、知りません。〕

Parentheses (括弧)

括弧を使うことで、評価の順番を制御することが可能だ:

(2 + 3) * (10 - 5)
25

これは、次の式と同じだ:

2 + 3 * (10 - 5)

length?を使う場合には、これは一般的なやり方だ:

if (length? "a string of chars") > 10 [print "ok"]
ok

もちろん、上の行を次のように並べ直すことも出来る:

if 10 <= length? "a string of chars" [print "ok"]

だが、これは同程度に読みやすいとはいえないだろう。 だから、greater?関数を演算子の代わりに使った、次のような書き方も使える:

if greater? length? "a string of chars" 10 [print "ok"]

Translated 21-July-2009

Personal tools