butterfly dream

FX自動取引のための時系列分析・信号処理・戦略ブログ

科学技術計算用プログラミング言語:Sci-Lispの自作(4日目):キーワード

chaploud-blog.hatenablog.com

Sci-Lisp自作の4日目です。3日目に紹介した、「インタプリタの作り方」という本を先にすべてやり終えてから、という気持ちを抑えつつ今日の記事です。(なぜなら、大概こういったものはやり終える前に熱量が冷めてしまうから)

book.impress.co.jp

Sci-Lispのキーワード

Sci-Lispの仕様決めのため、草案としていろんなサンプルコードを書き出しました。その中で、言語の基本機能に関わるキーワード(予約語)が見えてきましたので紹介します。

Sci-Lispのキーワード

せっかくなので、同時並行で開発しているSci-LispVSCode拡張機能によるシンタックスハイライトが適用されている画像を貼りました。まだ何も実装が決まっていないのですが、キーワードの大まかな機能を説明します。変数じゃなくてVarだろ、とか定義/値/代入/束縛の意味が揺れているだろ、と突っ込みを入れたくなると思いますが、そのあたりは、申し訳ありません、ぼんやり使っています。厳密性はあとから勉強しつつ整えていきたいと思います。

let

レキシカルスコープを持つ変数への値の束縛に使います。Clojureと違い、変数への再代入は許す予定です。

const

主にグローバルで定数を定義するのに用います(defに:constをつけるなどして不要かも?)

def

グローバルで変数への値の束縛に使います。関数やクラスも束縛できます。

defn

グローバルで関数定義に使います。def + fnの組み合わせのショートハンドです。

fn

無名関数を作ります。

if

条件分岐に使います。

when

真の場合のみ評価する場合に使います。

for

forループに使います。

while

whileループに使います。

break

ループのbreakに用います。

continue

ループのcontinueに用います。

struct

構造体の定義に用います。

enum

列挙体の定義に用います。

class

クラスの定義に用います。

macro

マクロの定義に用います。

throw

例外を投げるのに使います。

try

例外を受け取りたい範囲を囲みます。

catch

例外を受け取り、例外処理を行います。

ns

名前空間の定義に用います。

set!

束縛された変数に破壊的変更(要するに再代入)を行うときに用います。

cond

リッチな条件分岐に用います。

return

早期リターンしたい場合に用います。

yield

ジェネレータ、遅延評価の際に用います。

import

モジュールやライブラリの読み込みに用います。

this

クラス内でインスタンスを指すために用います。

終わりに

単なるS式の皮をかぶったPythonじゃないか!と突っ込まれそうですが、その通りです。最初の動機としては、「Python+Numpy+matplotlib+pandas+scipyとC++の高速性がものすごく手短に扱える時系列・信号処理・統計計算用DSLを作る」だったので。S式である必要性は今のところ差別化以外の理由が見つかりませんが、検討・実装のイテレーションを繰り返していくうちに必ずや一部の人には「使いたい」と思わせられる美しさと利便性を備えた言語に仕上げていきたいと思います。Done is better than perfect.