Mystic#なブログ

MysticSLの後継言語、Mystic#について話します

Mystic# 紹介 その4

2010-06-23 13:23:46 | Mystic#
引き続き、Mystic#の新しい構文および拡張された構文の一部を紹介します。


・CreateObject キーワード update!
従来 CreateObject キーワードはGUI部品の生成のために使用していましたが、
Mystic#ではクラスおよび構造体のインスタンス生成に使用します。
それに伴い、型の指定およびコンストラクタ引数の指定が可能となりました。

#program [Sample]

#method [Main, String, *~Main, Integer] As Global

*~Main
Var Random [rnd]

  rnd = CreateObject[Random]
  Console.WriteLine [rnd.Next]
  
  rnd = CreateObject[Random, 123]
  Console.WriteLine [rnd.Next]
  
  Console.ReadKey [True]
MethodReturn


・ReleaseObject キーワード new!!
ReleaseObject キーワードは、インスタンスの破棄を行うために使用します。

#program [Sample]

#method [Main, String, *~Main, Integer] As Global

#import [System.IO, System.Text]

*~Main
Var StreamReader [file]

  file = CreateObject[StreamReader, "test.txt", Encoding.UTF8]
  
  //何かしらのファイル操作処理
  
  ReleaseObject [file]
  
  Console.ReadKey [True]
MethodReturn


通常、オブジェクトが Null でないかどうか、Dispose を実装しているかどうかを
チェックする必要がありますが、ReleaseObject はそれらのチェック処理を隠蔽します。

ReleaseObject は、以下のコードと同義です。
#program [Sample]

#method [Main, String, *~Main, Integer] As Global

#import [System.IO, System.Text]

*~Main
Var StreamReader [file]

  file = CreateObject[StreamReader, "test.txt", Encoding.UTF8]
  
  //何かしらのファイル操作処理
  
  //ReleaseObject [file]
  If [(file IsNot Null) && (file Is IDisposable)]
    file.Dispose
  End If
  file = Null
  
  Console.ReadKey [True]
MethodReturn


・Is 、IsNot 演算子 new!!
参照型が、あるクラスの型である・または継承していることを調べる演算子です。
インタフェースを実装しているかどうかのチェックにも使用できます。

#program [Sample]

#method [Main, String, *~Main, Integer] As Global

*~Main
Var Random [rnd]

  If [rnd Is Null]
    Console.WriteLine ["rndはNullです"]
  End If
  
  rnd = CreateObject[Random]
  
  If [rnd IsNot IDisposable]
    Console.WriteLine ["RandomクラスはIDisposableを実装していません"]
  End If
    
  Console.ReadKey [True]
MethodReturn


・CreateCOM 、ReleaseCOM キーワード new!!
CreateCOM キーワードは、COMオブジェクトの生成に使用します。
プログラムIDを指定する必要があります。

ReleaseCOM キーワードは、指定されたCOMオブジェクトを完全に解放します。
※ここでいう"完全"は、参照カウントがゼロになる状態です。


以下ではExcelブックを開き、セルに値を設定して保存しています。

#program [Sample]

#method [Main, String, *~Main, Integer] As Global

*~Main
Var Object [excel, books, sheets]
Var Object [book, sheet, cells]

  Try
    Console.WriteLine ["start"]
    
    excel = CreateCOM["Excel.Application"]
    excel.DisplayAlerts = False
    excel.Visible = False
    
    //ブックの取得
    books = excel.Workbooks
    book = books.Open("C:test.xls")
    
    //シートの取得
    sheets = book.Worksheets
    sheet = sheets{1}
    
    //セルに値を設定
    cells = sheet.Cells
    cells{1, 1}.Value = "1"
    cells{2, 1}.Value = "2"
    cells{3, 1}.Value = "3"
    
    book.Save
  Catch [Exception ex]
    Console.WriteLine [ex.Message]
  Finally
    If [excel IsNot Null]
      excel.Quit
    End if
    
    //解放
    ReleaseCOM [cells]
    ReleaseCOM [sheet]
    ReleaseCOM [sheets]
    ReleaseCOM [book]
    ReleaseCOM [books]
    ReleaseCOM [excel]
    
    Console.WriteLine ["end"]
    
    Console.ReadKey [True]
  End Try
MethodReturn

Mystic# 紹介 その3

2010-06-22 11:39:30 | Mystic#
次は、Mystic#の新しい構文および拡張された構文の一部を紹介します。

・例外処理 update!
従来にもTry-Catch-Finallyは使用できましたが、Mystic#では
例外オブジェクトの受け取りが可能となりました。

#program [Sample]

#method [Main, String, *~Main, Integer] As Global

*~Main
Var Integer [a, b, c]
Var Exception [ex]

  Try
    a = 4
    b = 0
    
    c = a b //ここで0除算例外が発生
  Catch [ex]
    Console.WriteLine [ex.Message]
  Finally
    Console.WriteLine [c]
    Console.ReadKey [True]
  End Try
MethodReturn

また、Catch句に限ってインライン型宣言ができます。
#program [Sample]

#method [Main, String, *~Main, Integer] As Global

*~Main
Var Integer [a, b, c]

  Try
    a = 4
    b = 0
    
    c = a b //ここで0除算例外が発生
  Catch [Exception ex]
    Console.WriteLine [ex.Message]
  Finally
    Console.WriteLine [c]
    Console.ReadKey [True]
  End Try
MethodReturn




・行の継続 new!!
従来は行は継続できませんでした。そのため、1行で非常に長いコードを記述するなど
可読性が落ちていました。Mystic#では、VisualBasicのように
_ (アンダースコア、アンダーバー)を使用することで行の継続を行うことができます。

#program [Sample]

#method [Main, String, *~Main, Integer] As Global
#method [Test, String, String, String, *~Test] As Local

*~Main
  Test ["これは", _
     "テスト", _
     "です。"]
  
  Console.ReadKey [True]
MethodReturn

*~Test
  Console.WriteLine ["{0}{1}{2}", _
            Argument0, _
            Argument1, _
            Argument2]
MethodReturn


行の継続が正常に動作しています。


・ヒアドキュメント new!!
従来は文字列も行の継続はできませんでした。
Mystic#は、""(ダブルクォーテーション)記号で括られる全ての文字及び改行が
文字列として扱われます(エスケープシーケンスは従来通り適用されます)

また、文字列の先頭に $ 記号を付加することで、インデントを無視した
ヒアドキュメントを記述できます。
#program [Sample]

#method [Main, String, *~Main, Integer] As Global

*~Main
  Console.WriteLine [ _
"あいうえお
  かきくけこ
    さしすせそ"
]

  Console.WriteLine [ _
$"あいうえお
  かきくけこ
    さしすせそ"
]

  Console.ReadKey [True]
MethodReturn



Mystic# 紹介 その2

2010-06-08 23:31:48 | Mystic#
いきなりですが、Mystic#で単純なコンソールアプリケーションの
ソースコードを紹介します。
※ソースコードは、Unicodeエンコーディングで保存されている必要があります。

#program [Sample]

#import [System.Collection]

#method [Main, String{}, *~Main, Integer] As Global

*~Main
Var Integer [i]

  For [i, 1, 5, 1]
    Console.WriteLine ["Hello World!"]
  Next

  Return [0]

MethodReturn


単純なコンソールアプリケーションはオブジェクト指向を
意識しないコードも書くことができるため、MysticSLに非常によく似た構文になります。

ここで、MysticSLと異なる点を紹介します。

・#program
ここには、そのファイルが何を表すのかを記述します。

クラスであれば #class、モジュールであれば #module とします。
#program は、プログラムのエントリポイントを記述するための特殊なモジュールを示します。


・#import
名前空間のインポートです。
※この例では意味の無いインポートです。


・#method
#method ディレクティブはMysticSLにも存在していますが、その記述の仕方が異なります。

従来は引数に型の概念を適用できず、引数の数のみ記述していましたが
Mystic#ではメソッド名とメソッドラベルの間に型を書き並べることでそのまま引数とすることができます。

また、メソッドラベルの後ろに1つだけ型を書き加えることができます。
型を記述した場合、メソッドはその型の戻り値を返すようになります。


・As Global
これは可視性を表しています。
可視性はメソッド以外にも、ファイル・プロパティ・変数に適用できます。

MysticSLに存在していた Global、 Local 以外にも、
自クラスおよび継承先でのみ参照可能な Protect、
同アセンブリ内でのみ参照可能な Inner
が新しく追加されています。


・Var Integer
変数の定義です。

MysticSLでは型を直接記述することができましたが、Mystic#では
Var キーワードに続けて型を記述する必要があります。

これは、代入される値によって型が決定される型推論を可能にするための仕様です。


・For
言わずと知れた For ループです

この例ではMysticSLと変わりありませんが、Mystic#ではStep値(第4引数)を省略することができます。


・Return
戻り値の存在するメソッド、およびプロパティのGetアクセサで
値を返しつつ処理を脱出するための命令です。

Mystic# 紹介 その1

2010-06-06 17:02:09 | Mystic#
MysticSLの後継言語、その名も Mystic#

名前から察する通り、.NET Frameworkで動作するアプリを開発できる言語です。

今回は、完全なオブジェクト指向となりました。

そのため、MysticSLとは互換性がほとんどありません。

MysticSLの命令を再現する互換モジュール等は用意するつもりでいますが、
オブジェクト指向となったことで概念から異なる部分もあり、
MysticSLを使ってくださっていた方にはちょっと申し訳ないな…という気持ちがありますが
実用性とのトレードオフとなっています。


Mystic#は .NET Framework 2.0 をターゲットとする純粋なMSILにコンパイルされます。

よって、WinFormsのすべてのGUI部品が使用可能であることはもちろんのこと、
サードパーティ製の.NET向けクラスライブラリを使用したり、
Mystic#でクラスライブラリDLLを作ることもできます。
(もちろんそのDLLはVB.NETやC#など、他の言語で使用可能)

独自のインタプリタを設けているわけではないので、
MysticSLと比較して数倍の実行速度、少なくともVB.NETやC#と同等の速度になります。

またEXEのサイズも、ランタイムを埋め込んでいたMysticSLが600KB超えであったのに対し、
Mystic#の単純なコンソールアプリケーションであれば10KB以下となります。


その他、.NET Framework 2.0 の主な機能を使用することができます。

以下はその一例です。

・クラス、インタフェース、継承、メソッドのオーバーロード
・ジェネリッククラス、ジェネリックメソッドの使用と作成
・デリゲート、イベントの定義
・例外処理

「Mystic#」 発進

2010-06-06 16:45:44 | Mystic#
こんにちは。

MysticSLの開発が滞ってだいぶ経ってしまいましたが、
ようやく後継言語の情報を発信するまでに至りました。

知らない人のために一応…MysticSLは"たけぽい"が作った簡単なスクリプト言語です。


さて、このMysticSLは高校の頃に考案し、地道ながら3年に渡り拡張を続けてきました。

当時は知識も技術も浅く、またランタイムの開発環境がVB6であったことから
実用的なモノはできませんでしたが、それでも「言語」らしくはなっていて
個人的には力作の部類でした。

※それでも関数がなく命令のみとか、GUI部品が少なかったりしました


それから数年、社会人となり時間がほとんど取れなくなって、MysticSLは放置されました。
しばらくして見た自分のコードはあまりに読みにくく、正直言ってメンテする気も起きませんでした。

そこで、もうこの際1から作り直してしまおうかと思い立ったわけです。

「どうせ作り直すならもっと実用的な仕様を…」と思いましたが、
MysticSLを使ってくださった方や開発続行を望む声もほんのわずかですがあったので、
あえてMysticSLの色を残した「使いにくい(笑」言語にしていこうと思います。

人はこれを開き直りというが果たしてどんな結果になったのか…