Language(言語コーパス) | Simulang言語 | 日本単位系を作った
simulationライブラリで純粋な関数式プログラミングをします
方程式的なプログラミング | 状態の手順的と関数的な表記の相互変換
VM を作った | 4Dエンジン | 連続と離散の統一 | Simulang言語の規格
こんな日本語の文字を考案した(画像) | 人工言語
虫は宇宙人 | 人類の品種 | 言葉の起源 | DNAと門・綱・目
日本語は海豚の言葉 | ペンギン(ウルトラマン) | 猫語の「ニャー」の意味は2つ
Diablo 2 全スキル+21のチャーム | X3 TCで工場を買う方法
半光速度で宇宙旅行をする方法(超簡単です) | 日本単位系を作った(C#)
 1 2 3 4 5 ... 50
Simulang という言語の規格はこんな感じです
0   関東の国王      2021年8月4日 水 20:56
var x : R = 0
func f(a : R) : R = ret a + 1.0 * 2.0 (* = (a + 1.0) * 2.0 *)
cached y : R = ret f(x)

state mys : Z where s0 = 0 and s2 = ret s1 + 1
(* s0 s1 s2 are keywords! *)

var t : Z = 0
proc p(a : Z) = t <- t + a (* "proc"s have no "ret"s! *)

error return code is bool only, and uses register x0
func div(a : R, b : R) : R =
   if y = 0 then
       err // err is a keyword, x0 is false
   else
       ret a / b // x0 is true
   end
end
// and:
proc p x =
   if ... then err
   do ...
end
(* checking error: *)
try
y <- g(f(x)) // 1 line only
catch
...
...
end
(* another example: *)
try
do g(f(x))
catch
...
...
end

(* cached & state of structures! *)
cached y[obj : S] : R = ret f(obj.x)
state mys[obj : S] : Z where s0 = obj.x and s2 = ret s1 + 1
// !!!note that the init value of a state (& an eq2,3,4) in objs,
//    can catch args from (an only one) constructor of the obj,
//    for can restore a state from savedata!, such as:
struct S
   new [<savedata : T>] // but only supports one param!!! (so it may be type of a struct)
end
state myt[obj : S] : Z where s0 = g(savedata.arg1) and s2 = ret s1 + 1 // s0 only!
var savedata123 : T = new T
savedata123.arg1 <- 123
s <- new S[<savedata123>] // but only supports one param!!! (so it may be type of a struct)

an expr contains var names, operators, funtion names, ()s, and ,s

lambda, function pointers are NOT supported

R* is supported, vectors are supported (matrixes are NOT supported)

for, each, array, list, linkedlist are supported

(* for: *)
var y : Z
for y, n to m, _a + _b, _i * 2 // _a, _b, _i are keywords
(* => *)
func f(a, b) = ret a + b
func g(a, b) = ret i * 2
var y = g(n)
for i = n + 1 to m
   y <- f(y, g(i))

(* each: *)
var Y : Z{}
each Y, X, _e * 10 // _e is a keyword

(* for, each関数でのラムダ式は、それのクロージャは大域と自動を参照するが、
それ自体への関数ポインタは自動変数に限られるから、
それ(ラムダ式)をinlineでコンパイルすればクロージャの問題は回避される
(もちろん更に呼び出す関数はinlineできないが…)*)

(* vectors *)
// R() only! (for dot(), norm() etc)
var V1 : R() = (1.0, 2.0, 3.0) // const only!
var V2 : R() = (a, b, c) // error! (const only!)
var V3 : R() = (1.0, 2.0, 3.0) // error!
var V4 : R() = new R(x, y, z) // error!
var V5 : R() = new R(3) // ok! (const or var name only!)
var V6 : R() = new R(n) // ok! (const or var name only!)
var V7 : R() = new R(n + 1) // error! (const or var name only!)

(* array *)
var X1 : Z[] = [1, 2, 3] // const only!
var X2 : Z[] = [a, b, c] // error! (const only!)
var X3 : Z[,] = new Z[2, 3] // ok, 3-rank max (const or var name only)
var X4 : Z[,] = new Z[n, m] // ok, 3-rank max (const or var name only)
var X5 : Z[,] = new Z[n + 1, m + 1] // error! (const or var name only!)
var X6 : Z[][] = new Z[][] // error
var x : Z = X1(0) // ok

(* list *)
var Y1 : Z{} = {1, 2, 3} // const only!
var Y2 : Z{} = {a, b, c} // error! (const only!)
var Y3 : Z{} = new Z{} // ok
var Y4 : Z{}{} = new Z{}{} // error!
var y : Z = Y1(0) // ok

(* linkedlist & foreach is NOT supported! *)

(* an element of vector, array, list *)
x1 <- Vec1(0)
x2 <- Arr1(0, 0) // 3-rank max
x3 <- Lst1(0)

struct S
   x : Z
   t : T
X : Z()
X2 : Z[]
X3 : Z[,]
X4 : Z{}
t2 : T[]
t3 : T[,]
t4 : T{}
end

struct T
   y : R
   s : S
end

var s1 = new S // ok
var s2 = new S() // error
var s3 = new S(123) // error
var s4 = new S[<savedata123>] // ok, but only supports one param!!! (so it may be type of a struct)

indent is NOT supported, use "end" instead!
var x : R = 0
func f(a : R) : R =
   ret a * a
end
cached y : R =
   ret f(a)
end

state r : R where s0 = 0.0 and s2 =
   ret s1 + 1.0
end

the "new" expressions:
y <- f(new C) // error
p <- new C // ok
arr <- [1, 2, 3] // ok
arr <- new Z[3] // ok
arr <- new Z[n] // ok
arr <- new C[<savedata123>] // ok, but only supports one param!!! (so it may be type of a struct)
// i.e. "new"(includes [], {}, ()) are narrow sense!

type conversions: via funcs
y <- g(Z2R(f(x1 * x2)))

consts are also supported:
const c : Z = f(x1 * x2 +3) // ok
const d : C = new C // ok

the init value of a state can also be an expression (includes "new")
state s : Z where s0 = f(x1 * x2 + 3) and s2 = ret ... // ok
state r : C where s0 = new C and s2 = ret ... // ok

expressions can also be used in "ret"
ret f(x1 * x2 + 3)
ret new C

expressions can also be used with "do" (but not "new" expressions)
do f(x1 * x2)
do g(y1 * y2)
do new C // error!

expressions can also be used in element accessing:
x1 <- Vec1(f(a + b))
x2 <- Arr1(f(a + b), g(c - d))
x3 <- List(f(a + b))

(* if with "do" *)
if ... then // expressions can also be used in "if", "elif"
   do f(x)
do g(x)
elif ... then
do f'(x)
do g'(x)
else
   do f''(x)
do g''(x)
end
(* a condition of "if" uses an expression (but not a "new" expression) *)
if f(x1 & x2) | g(~x3) then

loop i from 1 to 3 // ok
loop i from n to m // ok
loop i from 1 to n // ok
loop i from n + 1 to m + 2 // error! (const or var name only!)
(* for with "do" *)
loop i from 1 to n
do f(x)
do g(x)
end
// but there is no sub-scope of vars, so there must be:
loop i from 1 to 3
end
loop i2 from 1 to 3 // here using "i" will be syntax error!
end

(* 文字列の<-(割り当て)はアドレスではなく内容のコピーだ、
よって、手動でdelする必要は無い、
つまり、 使われたら、直ぐに、(しかも暗黙的に)delされることになる、
但し、""つまり即値文字列は、
プログラムの初期化の時に(動的に)heapにおいてnewされるものなのにも関わらず、
静的なものとして扱われ、
つまり、プログラムの終了の場合に解放されることにすればよい
(言い換えれば、構造体か配列などのconstに似ている) *)

(* need not to parse and convert () of arrays to [] in csharp,
just convert directly array var name to arr1.GetAt with () in csharp!
and, an array with () can not be a left-value!
use do set_val(arr1, exprIndex, exprValue) instead,
note but obj.x can be a left-value *)

// 演算子の優先順位は.csと.simとのコンパイルによって違ってくる!
// (コンパイラに警告される)

// the comment "(**)" is also single line!
// (for syntax high-light in RichTextBox of IDE)

// equation support:
eq2 myeqA : Z, R where // x + y = 0
   _x0 = 1
   _y0 = -1

   _x =
       ret - _y
   end
   _y =
       ret - _x
   end
end

eq3 myeqB Z, R, Z where // x + y + z = 0
   _x0 = 1
   _y0 = 2
   _z0 = -3

   _x = ret - _y - _z
   _y = ret - _x - _z
   _z = ret - _x - _y
end // max: eq4; _x, _y, _z, _w are keywords!

x <- eq2_get_x(myeqA)
do eq2_set_x(myeqA, 123)

x' <- eq3_get_x(myeqB)
do eq3_set_x(myeqB, 123, 456)

// differential support (use the default "-"):
diff dy : R where _v0 = 0 and _v = ret f(x)

// t, dt are keywords, but dt does not use "diff"!

下記は単なるメモですから、読み飛ばしてもOKですが…

var g_btn : Btn = null
proc p() =
 var btn : Btn = new Btn
 drawtxt btn.y

 g_btn <- btn
end

var g_x : Z
// means: class Btn { var x:Z var c:C cached y:Z= ret x + g_x }
struct Btn =
 x : Z
 c : C
end
cached y[o : Btn] : Z = ret o.x + g_x
// and compare to following:
func y'(o : Btn) : Z = ret o.x + g_x
// the impl of the former: (can also be impled in C#!!!)
struct Btn
 y_flag : bool
 y_val : Z
end
func y_get(o : Btn) : Z =
 if o.y_flag then
   ret o.y_val
 else
   o.y_val <- o.x + g_x
   o.y_flag <- true
   ret o.y_val
 end
end
proc mainloop_flush() =
 if g_btn ≠ null then g_btn.y_flag <- false
end
(*of refs "g_btn.y":*) y_get(g_btn)
//end impl of the former

struct C =
 w : Z
end
cached z[o : C] : Z = ret o.w * 2

var g_list : C{} = new C{}
do list_add(g_list, new C)
do list_add(g_list, new C)

// however, a state in an obj:
state st[o : Btn] : Z where s0 = 0 and s2 = ret s1 + o.x
// impl:
proc mainloop_update() =
 if g_btn ≠ null then
   g_btn.st_next <- g_btn.st_crrt + g_btn.x(*be not "o.x"!*)
 end
end
//how to resolve (*be not "o.x"!*)?
// -- gens a func, not inline(and we cannot inline it if in C#!)
func st_getnext(o : Btn, __s1) = ret s1 + o.x
(*...*) g_btn.st_next <- st_getnext(g_btn, g_btn.st_crrt)
この記事は 2021年10月11日 月 21:24 に作者によって編集されました
1   fcecbxcta      2021年9月4日 土 17:32
2   cnxnyzb      2021年9月4日 土 18:54
3   hlgkpdwzqkh      2021年9月4日 土 19:05
4   ymugetfpmem      2021年9月4日 土 20:08
5   lxvxfsf      2021年9月4日 土 20:10
6   gvqrqvvjiil      2021年9月4日 土 20:18
7   nfeasbzo      2021年9月4日 土 21:06
8   vchvabpor      2021年9月4日 土 21:17
9   mxzyftvcvu      2021年9月4日 土 21:43
10   ewzghh      2021年9月4日 土 22:55
11   apyrdvlufp      2021年9月4日 土 23:03
12   zetyyog      2021年9月4日 土 23:30
13   ofqplor      2021年9月4日 土 23:31
14   dupnsowdmw      2021年9月5日 日 0:27
15   buyiigydwi      2021年9月5日 日 0:32
16   carwyoidlx      2021年9月5日 日 0:44
17   lhspduqsubr      2021年9月5日 日 0:52
18   gospecr      2021年9月5日 日 1:04
19   wrhwdaqonm      2021年9月5日 日 1:10
 1 2 3 4 5 ... 50
ヒント: 海豚が日本を買おうとしましたが