読者です 読者をやめる 読者になる 読者になる

倭算数理研究所

科学・数学・学習関連の記事を、「倭マン日記」とは別に書いていくのだ!

2.4 True BASIC のプログラム tasks

今回はプログラムのモジュール化です。 『計算物理学入門』で扱われている True BASIC のモジュール化機能はサブルーチンと関数ですが、Groovy で対応するのは Java と同じくメソッドです。

True BASIC

まずは True BASIC のコード。

PROGRAM tasks                                ! サブルーチンの使用例
                                                       ! 変数がどのように受け渡されるかに注目
CALL initial(x, y)                                ! 変数の初期化
CALL add(x, y, sum)                          ! 2つの変数の和
CALL multiply(x, y, product)
PRINT "sum ="; sum, "product ="; product
END                                                 ! 主プログラムの終了

SUB initial(x, y)
    INPUT x
    INPUT y
END SUB

SUB add(x, y, sum)
    LET sum = x + y
END SUB

SUB multiply(x, y, product)
    LET product = x * y
END SUB

True BASIC でサブルーチンに変数を渡すと、その変数の参照(Java でいうところの)が渡されます。 したがって、サブルーチン内で変数の値を変更すると、それはサブルーチンの呼び出しもとにも影響を及ぼします。

Groovy

では Groovy でのコード。 Groovy では基本的にはプリミティブ型がなくすべてがオブジェクトなので、数値の受け渡しも True BASIC 同様(Java のプリミティブ型とは違って)すべて参照で行われます。 ただし、True BASIC と異なるのは、Groovy では(というか、Java では)数値が immutable (不変)オブジェクトであることです。 immutable オブジェクトとは、一度インスタンスを生成するとその内容が変更できないオブジェクトのことで、和や積の演算をすると結果の数値は全て別のオブジェクトとして生成されます*1

したがって、上記の True BASIC のようなコードは Groovy では実現できなくて、代わりに、演算結果をメソッドの返り値にして、それを呼び出し側で変数に代入する必要があります。

def (x, y) = initial()
def sum = add(x, y)
def product = multiply(x, y)
println "sum = $sum, product = $product"

def initial(){
    def scan = new Scanner(System.in)
    double x = scan.nextDouble()
    double y = scan.nextDouble()
    return [x, y]
}

def add(x, y){
    return x + y
}

def multiply(x, y){
    return x * y
}
  • Groovy では、メソッドは「def」キーワードによって定義できます。 また返り値の型は「double add(x, y){ ... }」のように宣言することもできます。 この場合、def キーワードはあってもなくても構いません。
  • 1行目は変数 x, y を宣言し、initial() メソッドの返り値の List に入っている要素を順番に x, y に代入しています。

プログラミングGROOVY

プログラミングGROOVY

計算物理学入門

計算物理学入門

  • 作者: ハーベイゴールド,ジャントボチニク,Harvey Gould,Jan Tobochnik,鈴木増雄,石川正勝,溜渕継博,宮島佐介
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2000/12
  • メディア: 単行本
  • 購入: 1人 クリック: 28回
  • この商品を含むブログ (45件) を見る

*1:immutable であり、かつ equals() メソッドインスタンスの表す値の等価性で評価される(異なるオブジェクト同士でも同じ値を表すなら true を返す)オブジェクトを特に Value (値)オブジェクトって言うんだったと思います。