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