試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

Boo言語の簡単なプログラム例(端末への固定文字列出力とGtk#のウィンドウ表示)

ここではBoo言語を用いた簡単なプログラム例として、端末への固定文字列の表示と空のGtk#のウィンドウ表示の例を扱う。

端末に固定文字列を表示する

メモ

端末に文字列を表示するには組み込みのprint文かprint()関数(ともに末尾に改行が付く),もしくは基本クラスライブラリのSystem.Console.Write()(改行なし),System.Console.WriteLine()(改行あり)を用いる。
基本クラスライブラリを含むライブラリ内の機能はその名前空間からたどって呼び出す(例:「System.Console.WriteLine()」)こともできるが、import文で指定した名前空間はコード内で省略できる(例:「import System」を記述した場合はSystem.Console.WriteLine()は「Console.WriteLine()」と書ける)。これはC#のusing文に近く、Pythonのimport文とは挙動が大きく異なる。

コード例

[任意]ファイル名: hello.boo

#! /usr/bin/booi
# -*- coding: utf-8 -*-

# import文の挙動はPythonとは異なる(C#のusing文に近い)
import System

# 端末に文字列を表示する文
print 'Hello, Work !!'

# 端末に文字列を表示する関数
print ('Hello, Boo language !!')

# 基本クラスライブラリの使用
System.Console.Write ('Hello, ')

# System名前空間をimportしているので
# System.Console.WriteLine -> Console.WriteLine として使える
Console.WriteLine ('System.Console.WriteLine !!')

下は実行結果。

Hello, Work !!
Hello, Boo language !!
Hello, System.Console.WriteLine !!

Gtk#のウィンドウ表示

メモ

Mono/.NET向けの一部の言語バインディングを用いる際には

import [名前空間] from [パッケージ名]

としてパッケージ名(例:gtk-sharp)を指定する必要がある。
クラスのコンストラクタは「constructor」の名前となる。Pythonとは異なり、クラスのメンバ関数の最初の引数「self」は記述する必要はない。
各種イベントをハンドラに関連付ける処理はC#と同様にしてイベントごとに「+=」でハンドラに対応付け、「def():」で匿名の関数も記述することもできる。
Gtk#では、GTK+のGObjectシグナル「delete_event」が発生したときの処理はDeleteEventというイベントに対するハンドラで記述する(C#でも同じ)。
ウィンドウのタイトルはプロパティTitleへの代入で変更するが、これはC#でのGtk#と同様。

コード例

下のプログラムを実行すると空のGTK+のウィンドウが生成され、ウィンドウマネージャの「閉じる」ボタンを押すと終了する。
[任意]ファイル名: gtksharptest.boo エンコーディング: UTF-8

#! /usr/bin/booi
# -*- coding: utf-8 -*-

# Gtk#で空のウィンドウを生成し表示する

import Gtk from 'gtk-sharp'      # Gtk#を使用するための記述

class MainWindow (Gtk.Window):   # 継承するクラスの指定はPythonと同様
  # メンバ関数やコンストラクタには引数「self」の記述は不要(Pythonとは異なる)
  def constructor ():            # オブジェクト生成時の処理(Pythonでは__init__())
    # 親クラスのコンストラクタ引数にGtk.WindowType.Toplevelを指定
    super (Gtk.WindowType.Toplevel)
    # self.[メンバ]で同オブジェクト(インスタンス)内のメンバにアクセスする(Pythonと同様)
    # プロパティTitleへの代入でウィンドウタイトル変更
    # 関連:PyGObject/PyGTKでのGObjectプロパティは「[オブジェクト].props.[GObjectプロパティ名]」
    self.Title = 'Boo Gtk# test'
    # イベントとハンドラの関連付けはC#に近い
    # 「def ():」以下は匿名関数(Pythonとは異なる文法)
    self.DeleteEvent += def ():  # 「閉じる」ボタンが押されたときの処理
      # 「閉じる」ボタンでメインループを抜ける
      Application.Quit ()

Application.Init ()  # Gtk#の初期化
win = MainWindow ()  # メインウィンドウのオブジェクト(インスタンス)を生成
win.ShowAll ()       # ウィンドウ以下を全て表示
Application.Run ()   # メインループ開始

関連記事:

使用したバージョン:

  • Boo 0.9.4.9
  • Gtk# 2.12.10