Glisp文法

原則

  • 要素の間は必ず区切り文字を入れなくてはならない
    • (concat [][])(concat [] [])
    • ^Number(+ 1 2)^Number (+ 1 2)
  • 英語を排する
    • fn=>
    • Top***
    • Bottom_|_
    • Unit()
  • ネストを浅く書くことが出来る
    • 可変長引数
  • Clojureでいうメタデータ = 型注釈
  • 型について
    • 型は必ずデフォルト値を持つ
    • 型も値であり、名前空間を値と共有する
    • 型は階層関係を持たない
      • 代わりに明示的にキャストするための関数を形に対して付与する
        • cast: (value: T, targetType: G.Type) => U
        • Number から IntMath.floor、その逆は _.ident
    • すべての値は型である
      • 00 のみからなるリテラル型
      • Numberは、値としてのNumberそれ自身のみからなる型を意味することは出来ない
  • すべての式はパスを持つ
    • let式の戻り値: ../return

型注釈

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)) --)