某巨大掲示板の別言語のスレでなにやら名前が出ているようですが…
ここも捕捉されてしまったようです(;^ω^)嬉しいやら不安やら。
一応弁明しておきますが私は基本ROM専です。ので、それっぽい書き込みがあっても偽者です。
また私自身は積極的にこの言語を薦めることはしません。
前身のMysticSLともどもカス言語と言われましたが、まさにその通りだと思います。
むしろカス言語として名前が出るようになっただけでも喜ばしいことと思います。
カスでもいいから使ってみたいという人はコンパイラ準備できるまで少々お待ちいただければと…
ここも捕捉されてしまったようです(;^ω^)嬉しいやら不安やら。
一応弁明しておきますが私は基本ROM専です。ので、それっぽい書き込みがあっても偽者です。
また私自身は積極的にこの言語を薦めることはしません。
前身のMysticSLともどもカス言語と言われましたが、まさにその通りだと思います。
むしろカス言語として名前が出るようになっただけでも喜ばしいことと思います。
カスでもいいから使ってみたいという人はコンパイラ準備できるまで少々お待ちいただければと…
仕事が期をまたぐ忙しい時期に入ってしまった…
加えて引越しもあるのでコンパイラは10月下旬に入りそうですorz
その代わりといってはなんですが、Mystic#の新しい構文および拡張された構文、
およびオブジェクト指向に関する機能の一部の続きを1つ紹介します。
・プロパティ new!!
メソッドはそのオブジェクトが持つ機能の処理を行うものであるのに対し、
プロパティはオブジェクトの性質や状態を取得または設定するためのものです。
#property ディレクティブが新たに追加され、プロパティ名から右へ
インデックス用引数の型、ゲッター、セッター、プロパティの型、となります。
ゲッターおよびセッターのどちらかを省略すると、書き込み専用・読み取り専用にできます。
上記のプロパティを使用する場合は以下のようなコードになります。
加えて引越しもあるのでコンパイラは10月下旬に入りそうですorz
その代わりといってはなんですが、Mystic#の新しい構文および拡張された構文、
およびオブジェクト指向に関する機能の一部の続きを1つ紹介します。
・プロパティ new!!
メソッドはそのオブジェクトが持つ機能の処理を行うものであるのに対し、
プロパティはオブジェクトの性質や状態を取得または設定するためのものです。
#class [TestClass]
#property [IsTest, *~getIsTest, , Boolean] As Global
#property [Items, Integer, *~getItems, *~setItems, String] As Global
Var String [_item{}] As Local
*~getIsTest
Return [True]
MethodReturn
*~getItems
Return [_item{Argument0}]
MethodReturn
*~setItems
_item{Argument0} = PropValue
MethodReturn
#property [IsTest, *~getIsTest, , Boolean] As Global
#property [Items, Integer, *~getItems, *~setItems, String] As Global
Var String [_item{}] As Local
*~getIsTest
Return [True]
MethodReturn
*~getItems
Return [_item{Argument0}]
MethodReturn
*~setItems
_item{Argument0} = PropValue
MethodReturn
#property ディレクティブが新たに追加され、プロパティ名から右へ
インデックス用引数の型、ゲッター、セッター、プロパティの型、となります。
ゲッターおよびセッターのどちらかを省略すると、書き込み専用・読み取り専用にできます。
上記のプロパティを使用する場合は以下のようなコードになります。
#program [test]
#method [Main, String{}, *~Main, Integer] As Global
*~Main
Var TestClass [tCls]
Var Boolean [isTest]
Var String [item]
tCls = CreateObject[TestClass]
isTest = tCls.IsTest //読み取り専用プロパティ
item = tCls.Items{3} //インデックス付プロパティの取得
item = item.Trim
tCls.Items{4} = item //インデックス付プロパティへの設定
MethodReturn
#method [Main, String{}, *~Main, Integer] As Global
*~Main
Var TestClass [tCls]
Var Boolean [isTest]
Var String [item]
tCls = CreateObject[TestClass]
isTest = tCls.IsTest //読み取り専用プロパティ
item = tCls.Items{3} //インデックス付プロパティの取得
item = item.Trim
tCls.Items{4} = item //インデックス付プロパティへの設定
MethodReturn
Mystic#の開発なんですが、他にやることが多すぎて実はちょっと止まっています。
ですが公開要望がありましたので、コンパイラのみプレビュー版として
リリースしたいと思います。
正直まだ実装していない機能があったり、構文解析がヘタレで
ありえないコードを書くと意味不明なエラーを吐いたりと
不親切な点が多く残っていますが「ちゃんとしたコードを書けば」まともに動いてくれますw
公開時期についてですが、今本業が忙しいことと、外へ出すにはあまりに酷い部分を修正したい、
およびサンプルなんかを用意したいので、9月ごろを目処とします。
が、遅れたらすみませんorz
ですが公開要望がありましたので、コンパイラのみプレビュー版として
リリースしたいと思います。
正直まだ実装していない機能があったり、構文解析がヘタレで
ありえないコードを書くと意味不明なエラーを吐いたりと
不親切な点が多く残っていますが「ちゃんとしたコードを書けば」まともに動いてくれますw
公開時期についてですが、今本業が忙しいことと、外へ出すにはあまりに酷い部分を修正したい、
およびサンプルなんかを用意したいので、9月ごろを目処とします。
が、遅れたらすみませんorz
前回更新から時間が経ってしまいました…
引き続き、Mystic#の新しい構文および拡張された構文の一部を紹介します。
今回からは、オブジェクト指向に関わる部分もご紹介します。
・メソッドのオーバーロード new!!
オーバーロードとは、シグネチャ(引数の型や数といった、メソッドを構成する情報)が
異なる同名のメソッドを複数実装できることを言います。
従来はオーバーロード機能はなく、全ソースコード内のより後に記述されたメソッドのみが実際に使われるだけでした。
Mystic#ではオーバーロードをサポートします。
尚、上記の例ではラベル名に _ov0 等と付けていますが、文法上特に意味はありません。
お好きな記述やコーディング規約で命名できます。
・コンストラクタ new!!
コンストラクタは、クラスのインスタンス生成(クラスの実体化)を行うための
特殊なメソッドです。特にコンストラクタを記述しない場合はデフォルトコンストラクタとして
引数無しで作成されます。
このクラスをインスタンス化するコードは次の通りです。
#initialize ディレクティブは従来ではプログラム実行時に何より先に実行されるメソッドを宣言しましたが
Mystic#では全く別の意味(コンストラクタ)を持っていますので、誤用しないでください。
・クラスの継承 new!!
クラスの継承とは、既存のクラスの機能を引き継いで新しいクラスを作る機能のことです。
まず基本クラスを作成します。
次に、このクラスに Test2 メソッドを追加した新たなクラスを作成します。
Feat キーワードで継承するクラス名を記述します。このキーワードは
同時にインタフェースの実装にも使用しますが、インタフェースの項で解説します。
・メソッドのオーバーライド new!!
従来はオーバーライドという名の全く異なる機能しかなく、オブジェクト指向とはほど遠いものでした。
Mystic#ではオブジェクト指向としてのオーバーライドをサポートします。
オーバーライドとはクラスを継承する際に使用するものなので、まず基本クラスを作成します。
Test メソッド名の頭に -> という記号が付いているのに気付くと思います。
これは、継承した派生クラスに対しオーバーライドを許可するための修飾子です。
その他の言語のような、英単語になっていないため分かりづらいように思えますが
「このメソッドは他から乗っかられます」と言っているような記号のため、慣れれば非常にシンプルで分かりやすくなります。
次に派生クラスを作成します。
こちらでは -> という記号がメソッド名の後ろに付いています。
「同名メソッドに乗っかります」という意味になります。
また、.NETのオブジェクト指向ではオーバーライドしたメソッドは必然的に
オーバーライドされるメソッドにもなります。
よってMystic#では以下のような(冗長的な)記述もできます。
引き続き、Mystic#の新しい構文および拡張された構文の一部を紹介します。
今回からは、オブジェクト指向に関わる部分もご紹介します。
・メソッドのオーバーロード new!!
オーバーロードとは、シグネチャ(引数の型や数といった、メソッドを構成する情報)が
異なる同名のメソッドを複数実装できることを言います。
従来はオーバーロード機能はなく、全ソースコード内のより後に記述されたメソッドのみが実際に使われるだけでした。
Mystic#ではオーバーロードをサポートします。
#program [Sample]
#method [Main, String, *~Main, Integer] As Global
#method [Test, *~Test_ov0] As Local
#method [Test, Integer, *~Test_ov1] As Local
*~Main
Me.Test
Me.Test [4]
Console.ReadKey [True]
MethodReturn
*~Test_ov0
Console.WriteLine ["引数なし"]
MethodReturn
*~Test_ov1
Console.WriteLine ["引数は {0} です。", Argument0]
MethodReturn
#method [Main, String, *~Main, Integer] As Global
#method [Test, *~Test_ov0] As Local
#method [Test, Integer, *~Test_ov1] As Local
*~Main
Me.Test
Me.Test [4]
Console.ReadKey [True]
MethodReturn
*~Test_ov0
Console.WriteLine ["引数なし"]
MethodReturn
*~Test_ov1
Console.WriteLine ["引数は {0} です。", Argument0]
MethodReturn
尚、上記の例ではラベル名に _ov0 等と付けていますが、文法上特に意味はありません。
お好きな記述やコーディング規約で命名できます。
・コンストラクタ new!!
コンストラクタは、クラスのインスタンス生成(クラスの実体化)を行うための
特殊なメソッドです。特にコンストラクタを記述しない場合はデフォルトコンストラクタとして
引数無しで作成されます。
#class [TestClass]
#initialize [Integer, *~Init]
Var Integer [_test] As Local
*~Init
_test = Argument0
MethodReturn
#initialize [Integer, *~Init]
Var Integer [_test] As Local
*~Init
_test = Argument0
MethodReturn
このクラスをインスタンス化するコードは次の通りです。
#program [Sample]
#method [Main, String, *~Main, Integer] As Global
*~Main
Var TestClass [tClass]
tClass = CreateObject[TestClass, 3]
MethodReturn
#method [Main, String, *~Main, Integer] As Global
*~Main
Var TestClass [tClass]
tClass = CreateObject[TestClass, 3]
MethodReturn
#initialize ディレクティブは従来ではプログラム実行時に何より先に実行されるメソッドを宣言しましたが
Mystic#では全く別の意味(コンストラクタ)を持っていますので、誤用しないでください。
・クラスの継承 new!!
クラスの継承とは、既存のクラスの機能を引き継いで新しいクラスを作る機能のことです。
まず基本クラスを作成します。
#class [BaseClass]
#method [Test, *~Test] As Global
*~Test
Console.WriteLine ["基本クラスのTestメソッドです。"]
MethodReturn
#method [Test, *~Test] As Global
*~Test
Console.WriteLine ["基本クラスのTestメソッドです。"]
MethodReturn
次に、このクラスに Test2 メソッドを追加した新たなクラスを作成します。
#class [DerivedClass]: Feat[BaseClass]
#method [Test2, Integer, *~Test2] As Global
*~Test2
Console.WriteLine ["派生クラスの Test2 メソッドです。n渡された値は {0} です。", _
Argument0]
MethodReturn
#method [Test2, Integer, *~Test2] As Global
*~Test2
Console.WriteLine ["派生クラスの Test2 メソッドです。n渡された値は {0} です。", _
Argument0]
MethodReturn
Feat キーワードで継承するクラス名を記述します。このキーワードは
同時にインタフェースの実装にも使用しますが、インタフェースの項で解説します。
・メソッドのオーバーライド new!!
従来はオーバーライドという名の全く異なる機能しかなく、オブジェクト指向とはほど遠いものでした。
Mystic#ではオブジェクト指向としてのオーバーライドをサポートします。
オーバーライドとはクラスを継承する際に使用するものなので、まず基本クラスを作成します。
#class [BaseClass]
#method [->Test, Integer, *~Test] As Global
*~Test
Console.WriteLine ["基本クラスです。"]
MethodReturn
#method [->Test, Integer, *~Test] As Global
*~Test
Console.WriteLine ["基本クラスです。"]
MethodReturn
Test メソッド名の頭に -> という記号が付いているのに気付くと思います。
これは、継承した派生クラスに対しオーバーライドを許可するための修飾子です。
その他の言語のような、英単語になっていないため分かりづらいように思えますが
「このメソッドは他から乗っかられます」と言っているような記号のため、慣れれば非常にシンプルで分かりやすくなります。
次に派生クラスを作成します。
#class [DerivedClass] : Feat [BaseClass]
#method [Test->, Integer, *~Test] As Global
*~Test
Console.WriteLine ["派生クラスです。"]
MethodReturn
#method [Test->, Integer, *~Test] As Global
*~Test
Console.WriteLine ["派生クラスです。"]
MethodReturn
こちらでは -> という記号がメソッド名の後ろに付いています。
「同名メソッドに乗っかります」という意味になります。
また、.NETのオブジェクト指向ではオーバーライドしたメソッドは必然的に
オーバーライドされるメソッドにもなります。
よってMystic#では以下のような(冗長的な)記述もできます。
#class [DerivedClass] : Feat [BaseClass]
#method [->Test->, Integer, *~Test] As Global
*~Test
Console.WriteLine ["派生クラスです。"]
MethodReturn
#method [->Test->, Integer, *~Test] As Global
*~Test
Console.WriteLine ["派生クラスです。"]
MethodReturn