---
title: Glisp文法
date: 2024-07-18T15:47:44.000Z
updated: 2026-03-09T01:41:26.367Z
tags:
  - glisp
url: https://baku89.com/Glisp%E6%96%87%E6%B3%95
---

# 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`

### 型注釈

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