Glisp文法
原則
- 要素の間は必ず区切り文字を入れなくてはならない
(concat [][])→(concat [] [])^Number(+ 1 2)→^Number (+ 1 2)
- 英語を排する
fn→=>Top→***Bottom→_|_Unit→()
- ネストを浅く書くことが出来る
- 可変長引数
- Clojureでいうメタデータ = 型注釈
- 型について
- 型は必ずデフォルト値を持つ
- 型も値であり、名前空間を値と共有する
- 型は階層関係を持たない
- 代わりに明示的にキャストするための関数を形に対して付与する
cast: (value: T, targetType: G.Type) => UNumberからIntはMath.floor、その逆は_.ident
- 代わりに明示的にキャストするための関数を形に対して付与する
- すべての値は型である
0は0のみからなるリテラル型Numberは、値としてのNumberそれ自身のみからなる型を意味することは出来ない
- すべての式はパスを持つ
- let式の戻り値:
../return
- let式の戻り値:
型注釈
interface Type<T> {
id: string;
default: T;
module?: Record<string, any>;
meta?: Record<string, any>;
}型から型を作る
型はCallableであり、型から派生型を生み出す関数。
オプショナルな第一引数と、メタデータを追記するためのキーワード付き引数を受け取る。
module(型に紐づいたstatic constやmethodなどをまとめる場所)は拡張できない(したい)
{x: 10 y: 20}
((Vector Number) [1 2 3] label="Numeric List")コンストラクタはmodule内に収める
(Mat2d.new 2 0 0 2 0 0)関数宣言
(=> (str: String n: Number) (concat ...(repeat str n)))
(=> (arg0: Required arg1?: Optional): ReturnType (ƒ arg0 arg1))
(=> <T> (test: Boolean then: T else: T): T)
(=> <T: Show> (v: T) (show v))
(Mat2d.trs [0 0] (rad π)
;; 関数型
(=> (a: Number b: Number): Number)
(=> (Number Number): Number)
;; 1-step eval
repeat = (=> <T> (`v: T n: Number): (Vector Number)
(if (= n 0) []
`[~v ...~(repeat v (-- n))]))Let式
{a = 10
b = 20
c = (* a b)
(+ a b c)}レコード
{x: 10 key1: 20}
{x: 10 x: 20}キーワード付き引数
スクリプト
- ... という式を挿入する
(Action.insert . \(+ ~π 2))`: πは、挿入先においても参照が通るように変更される(Action.insert . \(+ π 2)`: πはそのまま挿入されるAction.insertの型は(=> (\loc: Symbol `expr: ***): (IO ()))`
(Action.let x 20)(=> (\sym: Symbol `expr: ***): (IO ()))`
**Quote ** - ```
- 関数本体の最外殻がquoteされた場合、1-step evaluationのありようを制御する
- 関数の仮引数がquoteされた場合、その関数が呼び出される時、引数は評価されず、式のまま渡される
関数適用式 ()
(+ 1 2 3)
(fn arg0 arg1 key0=value0 key1=value1)アイディア
1/2 ;; 有理数リテラル
20rad ;; 角度
(* [1 2] Vec2.I) ;; アドホック多相
(++ "a" "b")
(++ (Path.circle [0 0] 20) (Path.line [20 20] [120 240]))
(IO String) ;; Stringアクション
;; 入力 Bndr.jsインスタンス
(Input Number)
;; 表示。UIの他に、MIDIのボタンのLEDにフィードバックしたりなんだり出来る
(Display Boolean)
;; Pipe
(-> x (=> (x: Number) (* x 10)) --)