wsoft-project / losetta Goto Github PK
View Code? Open in Web Editor NEWThe execution environment and command line interface for AliceScript.
Home Page: https://docs.wsoft.ws/products/alice
License: MIT License
The execution environment and command line interface for AliceScript.
Home Page: https://docs.wsoft.ws/products/alice
License: MIT License
array関数を使用して初期化した配列にアクセスできない
var a=array();
a+=0;///0x00 The method or operation is not implemented.
while
ループ中で変数を宣言すると二回目以降のループでエラーになる
正しい方法でwhile構文を使用しているにもかかわらず、エラー0x039: 括弧が不均等です
が発生する。
以下のどちらのコードも同じエラーが発生した。
while(true)
{
print("Hello");
}
var condition = true;
while(condition)
{
print("Hello");
}
Interpreter_Process
を使って実行したアプリケーションが別の権限を使用して任意のコードを実行したり、ライブラリを読み込んだりできてしまう(また、それを防ぐ手段がない)。
次のコードは、Interpreter_Process
を使ってユーザー入力の式を計算するプログラムである。悪意のあるコードを含むライブラリをwrong.ice
とする。
using Alice.Console;
using Alice.Interpreter;
// 標準入力から[2+3]などの式を受取る
var exp_str = read();
// 例えば、[5]などと評価される
var result = interpreter_process(exp_str);
// 出力例 2+3 = 5
print("{0} = {1}",exp_str,result);
このプログラムで次のように実行する。
>>import("wrong.alice");
import("wrong.alice"); =
このとき、wrong.alice
がインタプリタのpublic
領域を変更することがありうる。これによって後続の処理がwrong.alice
によって書き換えられ、重大な脆弱性へとつながる恐れがある。
関数でparamsパラメータが使用できない
as
演算子を使って文字列から数値への変換が失敗したときにINVALID_NUMERIC_REPRESENTATION(0x02b)例外が発生するが、もともとas
演算子の定義は次の通りだ。SAIMに違反する。
型変換演算子asは、左辺の値を右辺の表す型に変換します。右辺はtype型である必要があり、型変換に失敗した場合はnullを返します。
下記のコードをinclude
でデバッグした。
print("ユークリッドの互除法を使って最大公約数を計算するサンプル");
print("はじめに、最大公約数を求める自然数を入力してください。");
function InputNaturalNum(str)
{
write(str+">");
var ip = read() as number;
if(ip!=null && ip > 0)
{
return ip;
}else{
print("有効な自然数を入力してください");
return InputNaturalNum(str);
}
}
InputNaturalNum("1つ目の数字");
これに、次のように入力した。
>>include("yu-crid.txt");
ユークリッドの互除法を使って最大公約数を計算するサンプル
はじめに、最大公約数を求める自然数を入力してください。
1つ目の数字>dresf
発生した例外は下の通り。
INVALID_NUMERIC_REPRESENTATION(0x02b): 引数であるdresfは有効な数値の形式ではありません
詳細情報: https://a.wsoft.ws/alice/exceptions/0x02b
スタックトレース
場所 keyword function GetVar(); 場所 yu-crid.txt:行 6
場所 custom function InputNaturalNum(str); 場所 yu-crid.txt:行 16
場所 command function include();
生文字列表現ではない"" " ""
が"
を表してしまう問題。
Alice2.0のすべての実装でtry-catch構文が使えない
try
{
print("Hello,World!");
}
catch(e)
{
print(e);
}
出力
Hello,World!
エラー0x01f: Catchステートメントがありません
try
{
print("Hello,World!");
}
catch
{
}
出力
エラー0x01f: Catchステートメントがありません
エラー0x020: 次のブロックを実行できませんでした [print("ERROR");};]
エラー0x000: Index was outside the bounds of the array.
Alice.Random.random_int
に最大最小値をもたせて実行すると、クラッシュする。
最大最小値がいかなる値でも同様にクラッシュする。
using Alice.Random;
random_int(1,3);
new式でインスタンス化したオブジェクトのプロパティが参照できない
Alice.Diagnostics.debug_indent()
を実行した後でも、デバッグ出力がインデントしない。
if文内で発生した例外を続行するとNullExceptionが発生する
文字列を引数に持つ関数にnullを渡せない
次のようなコードを実行した
var count = 0;
while(count < 10)
{
print(count++);
}
このコードは次のように出力される
0
0
0
0...
次のコードを試してみる
var count = 0;
if(true)
{
print(++count);
}
print(count);
このコードは次のように出力される
0
1
0
どうやらスコープ内での変数の増減は、スコープ外に出ると取り消されるか、そもそもスコープ内外で書き込み時に別の変数が参照されている可能性がある。
式形式のラムダも、ステートメント形式のラムダもまったく動作しない。また、デリゲートの定義中に内容コードが実行されてしまうよう。
print("ラムダ式のテストです");
var lambda = ()=>print("Hello,Lambda!");
var zizyo = (x)=>x*x;
lambda();
print(zizyo(2));
print("これでテストは完了です");
print("ラムダ式のテストです");
var lambda = ()=>{print("Hello,Lambda!");};
var zizyo = (x)=>{x*x;};
lambda();
print(zizyo(2));
print("これでテストは完了です");
>>alice test
ラムダ式のテストです
Hello,Lambda!
エラー0x004: 変数:[x]は定義されていないか、存在しません 4行 ファイル名:\.alice\test
|Local| Name | Type | Content |
|Local| lambda | NONE | |
エラー0x004: 変数:[x]は定義されていないか、存在しません 4行 ファイル名:\.alice\test
|Local| Name | Type | Content |
|Local| lambda | NONE | |
エラー0x004: 変数:[x]は定義されていないか、存在しません 4行 ファイル名:\.alice\test
|Local| Name | Type | Content |
|Local| lambda | NONE | |
エラー0x001: 関数:[lambda]は定義されていないか、存在しません 6行 ファイル名:\.alice\test
|Local| Name | Type | Content |
|Local| lambda | NONE | |
エラー0x001: 関数:[zizyo]は定義されていないか、存在しません 8行 ファイル名:\.alice\test
|Local| Name | Type | Content |
|Local| lambda | NONE | |
エラー0x000: Object reference not set to an instance of an object. 8行 ファイル名:\.alice\test
|Local| Name | Type | Content |
|Local| lambda | NONE | |
これでテストは完了です
次のコードを実行すると、item.Convert(number;
の位置でエラー0x038: 括弧が不均等です
が出力される
var ary=["0","1","2"];
ary.Select(item=>item.Convert(number));
例外は次の通り
エラー0x038: 括弧が不均等です0
item.Convert(number;
0行 ファイル名:
|Local| Name | Type | Content |
|Local| item | STRING | 0 |
|Local| ary | ARRAY | [0, 1, 2] |
エラー0x038: 括弧が不均等です0
item.Convert(number;
0行 ファイル名:
|Local| Name | Type | Content |
|Local| item | STRING | 1 |
|Local| ary | ARRAY | [0, 1, 2] |
エラー0x038: 括弧が不均等です0
item.Convert(number;
0行 ファイル名:
|Local| Name | Type | Content |
|Local| item | STRING | 2 |
|Local| ary | ARRAY | [0, 1, 2] |
Losetta/Alice2.0で無名で関数の宣言ができてしまう。つまり、次のようなコードは実行できる。
function (){/*SOMETHING*/}
一方、次のコードは実行できない。
();
関数内で変数を宣言したときそれを再帰的に呼び出すとエラーになる
下記は、入力した値が100を超えるまで二乗を続ける関数f(x)
を定義している。
function f(x)
{
var y = x**2;
if(y < 100)
{
return f(y);
}
return y;
}
この関数を定義した上で、下記のように実行するとエラーが出力された。
>>>f(3)
VARIABLE_ALREADY_DEFINED(0x03e): 変数[y]はすでに定義されています
詳細情報: https://a.wsoft.ws/alice/exceptions/0x03e
スタックトレース
場所 keyword function x();
場所 custom function f(x);
場所 custom function f(x);
使用実態のないWSOFTScript互換関数をAlice.Runtime内のAlice.Legacy名前空間に移動したい
Unix環境でシバンが使えるように一行目の#!
を無視できるようにしたい
web_download_text
関数がbytes
型を返す
using Alice.Net;
return web_download_text("<Some url>") is bytes;
//Output : true
文字列補間中にスタックトレースが追加されない
期待する動作は以下の通り。
print($"{err;}");
スタックトレース
場所 Literal
場所 print
でも現実はこう。
スタックトレース
場所 Literal
do-while完了後に0x020エラーが発生する
var n=0;
do
{
print(n++);
}
while(n<5);
また、while
末尾の;
セミコロンを削除しても結果は同じだった。
for文で一度も本文が処理されない場合に0x004: 変数:[i]は定義されていないか、存在しませんが発生する
for(var i=0;i>3;i++)
{
print(i);
}
せっかくcatchではException返すからthrow式でExcepionオブジェクトを使って例外発生させるようにしたい
foreach(a in b)で配列bを一つずつaに代入するが、他のfor(var i;i++;i<n)構文などとvarの必要性に一貫性がない。どちらでも使えるようにとかするべき。
#15 で_が導入されたが()=>{}も使用したい
AliceScriptは.NET相互運用機能によって、関数を.NETコードで定義できるが、毎回ライブラリエントリポイントで関数を定義する必要がある。そこで、.NETの機能として提供されている 属性 機能を使って関数の情報を定義し、自動的に読み込まれるようにしたい。
以下は、C#を用いた想定プラグインの関数である。
using AliceScript;
using AliceScript.Interop;
namespace MyLibrary
{
[Function("greet",NameSpace= "MyLibrary",ArgMin=1]
public class GreetFunction : FunctionBase
{
public override Invoke(object sender, FunctionBaseEventArgs e)
{
string greet = "Hello," + e.Args[0].ToString();
e.Return = new Variable(greet);
}
}
}
# 互換性の維持について
互換性を維持するために、従来のNameSpaceも残した上で、これをマージする
関数の引数に、とくていの型のみを受け入れるような仕組みが欲しい。
function test(string str){
print(str.type);
}
test(1);// ここで例外発生
デリゲート内で演算のみを行うとその結果が反映されないか、エラーが発生する
古くはAliceScriptRC1でもこの問題が存在することを確認した。Alice2.1以降の問題ではない模様。
>>var increment = x=> x+1;
>>increment(1);
1 // 2が返されることを期待する
>>increment = delegate(x){return x+1;}
>>increment(1);
1 // 2が返されることを期待する
>>var addperiod = x=>x+".";
>>addperiod("Hello");
エラー0x003: 次の演算子を処理できませんでした。[+] 0行 ファイル名: // Hello.が返されることを期待する
env_get_environmentvariableが環境変数のリストではなくobjectを返してしまう。
private void Env_get_envirnomentVariable_Run(object sender, FunctionBaseEventArgs e)
{
if (e.Args.Count > 0)
{
e.Return = new Variable(Environment.GetEnvironmentVariable(e.Args[0].AsString()));
}
else
{
e.Return = new Variable(Environment.GetEnvironmentVariables().Keys);
}
}
0x029例外が発生してfor文が動作しない
オブジェクトのプロパティに複合代入演算が使えない。次のコードはエラーになる。
class A
{
var event = delegate.Activate();
}
var instance=new A();
instance.event+=_=>print("Hello,World!");
次のコードのように配列の型付けをできるようにしたい。
var num_array = array(number).Activate();
ちなみにこのジェネリクスもどきはarray
キーワードが関数であることを使用している。
new
キーワードが使えるようになるともっときれいに書ける。
var num_array = new array(number);
ジェネリクスを使えなくても次みたいなメソッド表現でもいいかも。
var num_array = array.specify(number).Activate();
ここでbyte型とchar型を導入することでC#と近いデータと文字列を使うことができる。
例えば、str
とchar_array
は本質的に等価である。
var str = "Hello,World";
var char_array = array(number).Activate();
char_array = "Hello,World";
string
型はarray(char)
型のエイリアスと言えるようになる。
デリゲートを使ってイベントを実装しているとき、C#のように次のように記述したい時がある。
var count = 0;
onclick += _=>print(count++);
しかしこのコードは期待通りに動作しない。なぜなら、onclick
のスコープは呼び出し元にあって定義したところのスクリプトにはないからである。
for文がスコープ外のコードを実行する
for()
{
hoge();
}
something();
これがループのたびにsomething()以下のコードを実行する。
関数内で発生した例外に対して関数外のtryブロックが効かない
function hoge()
{
error;
}
try
{
hoge();//エラー発生
}catch()
{
}
#10 でラムダ式で丸括弧が使用できなくなった影響で、引数のない状態を表現できない
alice update実行時にファイル名:/usr/local/bin/.alice/updateないか、存在しません
エラーが発生する。
また、更新自体は正常に完了しているようである。にもかかわらず、更新はユーザーによって取り消されましたと表示される。
次のコマンドで更新を実行する
sudo alice update --args force
環境の判定: OS:Linux,アーキテクチャ:x64
https://api.wsoft.ws/download/detail?id=WS144&feature=version から最新バージョンを取得しています...
最新バージョン : 0.9.15.0
この実装よりも新しい実装が公開されています。
更新を実行しますか?(Y/N)>>y
https://download.wsoft.ws/WS144/Download から最新バイナリをダウンロードしています...
ダウンロードが完了しました。
0.9.15.0 に更新しました
ファイル名:/usr/local/bin/.alice/updateないか、存在しません 13行 コード:var download_id="";
|Local| Name | Type | Content |
|Local| path | STRING | /usr/local/bin/alice |
|Local| tmp | STRING | /usr/local/bin/alice.old |
|Local| url | STRING | https://download.wsoft.ws/WS144/Download |
|Local| version_url | STRING | https://api.wsoft.ws/download/detail?id=WS144&feature=version |
|Local| new_version | STRING | 0.9.15.0 |
|Local| force | BOOLEAN | true |
|Local| check | BOOLEAN | false |
|Local| target_filename | STRING | {0}alice |
|Local| download_id | STRING | WS144 |
|Local| iswin | BOOLEAN | false |
|Local| platform | STRING | Linux |
|Local| arch | STRING | x64 |
更新はユーザーによって取り消されました
switch
式で、選択されるより後の条件が実行されてしまう。実際のコードと出力を参照されたい。
print("Switch式のテストです");
print("0か1、それ以外のいずれかを入力してください");
var input = read();
switch(input){
case "0":{
print("0が入力されました");
}
case "1":{
print("1が入力されました");
}
default:{
print("それ以外が入力されました");
}
}
print("これでテストは完了です");
>>alice test
Switch式のテストです
0か1、それ以外のいずれかを入力してください
>0
0が入力されました
1が入力されました // これは表示されるべきではない
それ以外が入力されました // これは表示されるべきではない
>>alice test
Switch式のテストです
0か1、それ以外のいずれかを入力してください
>1
1が入力されました
それ以外が入力されました // これは表示されるべきではない
>>alice test
Switch式のテストです
0か1、それ以外のいずれかを入力してください
>2
それ以外が入力されました // この挙動は正しい
これでテストは完了です
for時に0x014エラーが発生する
for(var i = 0; i < 3; i++>)
{
print("Hello,World");
}
if-elseが使用できない
COULDNT_FIND_OPERATOR(0x02e): 演算子 `else`は定義されていないか、存在しません
詳細情報: https://a.wsoft.ws/alice/exceptions/0x02e
スタックトレース
場所 command function Alice.print(); 場所 K:\LocalFiles\Docments\WSOFT\Losetta\alice\bin\Debug\net6.0\test.txt:行 1
場所 command function include();
Alice.Drawing名前空間とそれに所属するクラスは、今までデバッグ目的にしか使用されたことがなく、今後もAlice.RuntimeでGUIをサポートしないのならば不必要で、それなのにファイルサイズやメモリに悪影響を与えている。
代入や変数の定義時に、変数名と代入演算子の間に空白があると代入が実行されずエラーとなる。
>>var test = 0;
エラー0x004: 変数:[test]は定義されていないか、存在しません
型変換の実行時に目的の型と現在の型が同一のときnull
が返る。次のコードを参照のこと
var r = 1 as number;
return r.type;// 出力例 : NONE
次の式は簡単なtrue
をnumber
型にするコード。んでも次の式を評価するとスタックする
true ? 1 : 0
Alice.Random.random_intに最大値だけを指定して実行すると、nullが返ってくる
最大値がいかなる値でもnull
を返す。
using Alice.Random;
random_int(14);
AlicePackageにデジタル署名できるようにし、パッケージの改ざんがないかどうかを確認できる仕組みが欲しい
Alice.Interpreter.gc_gettotalmemory
が値を返さない。
is
とas
演算子が動作しない。
ラムダ式と関係ある?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.