HN 日本語サマリー

← 一覧へ戻る
プログラミング

Rustの型システムにおけるLisp

Lisp in the Rust Type System (github.com)

37 pointsby quasigloam0 コメント

要約

`lisp-in-types`は、Rustのトレイトシステムを用いてLispの基本的な機能を実現する実験的なプロジェクトです。再帰関数やグローバル・レキシカル環境、`call/ec`といったLispの主要な機能が型レベルで実装されています。ただし、シンボルの手動宣言、数値の範囲制限、`defmacro`や`eval`の欠如など、いくつかの重要な制約があります。

全文翻訳

lisp-in-types RustトレイトシステムにおけるLisp。 制限事項 各シンボルは`defkey!()`マクロを介して手動で宣言する必要があります 数値は負の値にできません 数値は0〜8192の範囲のみです。`build.rs`を変更することでより多くの自然数を生成できますが、その場合`RUST_MIN_STACK`を増やして実行する必要があります。 `(defmacro ...)`はありません `eval`はありません 広範囲なテストはしていません。 機能 再帰関数 グローバルおよびレキシカル環境(`let`バインディングを介して) 関数呼び出しは適切に動作します `call/ec`が適切に機能します 例 階乗: ```rust type DefFac = expr!(defun SymFac (SymN) (if (= SymN 0) 1 (* SymN (SymFac (- SymN 1))))); type Global2 = <DefFac as EvalForm<Global1, Lex0>>::GlobalOut; type Fac5 = EvalValue<expr!((SymFac 5)), Global2, Lex0>; assert_same::<Fac5, N120>(); println!("(fac 5) => {:?}", <Fac5 as ToRtValue>::to_rt()); ``` `call/ec` (デリミテッド) // `call/ec`デモ (エスケープ継続、明示的タグ): // `(call/ec cc (lambda (k) (+ 1 (k 5)))) => 5` ```rust defkey!(SymCC, N10); defkey!(SymK, N11); type CallECExpr = expr!((call/ec SymCC (lambda (SymK) (+ 1 (SymK 5))))); type CallECResult = EvalValue<CallECExpr, Global1, Lex0>; assert_same::<CallECResult, N5>(); println!( "(call/ec cc (lambda (k) (+ 1 (k 5)))) => {:?}", <CallECResult as ToRtValue>::to_rt() ); ```