科学技術計算用プログラミング言語:Sci-Lispの自作(4日目):キーワード
Sci-Lisp自作の4日目です。3日目に紹介した、「インタプリタの作り方」という本を先にすべてやり終えてから、という気持ちを抑えつつ今日の記事です。(なぜなら、大概こういったものはやり終える前に熱量が冷めてしまうから)
Sci-Lispのキーワード
Sci-Lispの仕様決めのため、草案としていろんなサンプルコードを書き出しました。その中で、言語の基本機能に関わるキーワード(予約語)が見えてきましたので紹介します。
せっかくなので、同時並行で開発しているSci-LispのVSCode拡張機能によるシンタックスハイライトが適用されている画像を貼りました。まだ何も実装が決まっていないのですが、キーワードの大まかな機能を説明します。変数じゃなくて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.