$30 off During Our Annual Pro Sale. View Details »

Scheme用nREPLの開発(エラー出力の改善)

Niyarin
February 06, 2022

 Scheme用nREPLの開発(エラー出力の改善)

Niyarin

February 06, 2022
Tweet

More Decks by Niyarin

Other Decks in Programming

Transcript

  1. Scheme用nREPLの開発 (エラー出力の改善) Niyarin @niyarium

  2. エディタからnREPLに繋ぎ、楽に開発したい nREPL: network REPL 1/6 エディタ repl 他にもLSPでできそうな機能も持たせたり (やっていないけど)

  3. Scheme用nREPL: Orange-paren ・依存ライブラリ SRFI 18 (Multithreading) SRFI 106 (Basic socket

    interface) ・Ring、Clojure nREPL風なミドルウェア (メッセージを処理するやつ) ・Vim用のクライアント 2/6 niyarin/orange-paren ・ 標準出力系手続きの処理 ・ 多値の出力 ・エラーの出力 ・define-libraryを意識したeval ・機能増やす (マクロ展開結果とかみたい ) やったこと これから
  4. nREPLからエラーをクライアントに送信したい この辺の出力、api有無は処理系依存 - api等がないこともある エラーメッセージはキャッチしたエラーをerror-object-messageでとれる 3/6 ソース上の位置やスタック情報がないのはつらい こういうのがほしい↓

  5. 自前でエラー表示をやる 4/6 ・評価前の式に手を入れる eval middlewareの前に位置記録や、式改変する middlewareを入れる よほど変なことをしないかぎり、想定外の挙動はない `(define (proc-name …`

    なら、ソースの位置と proc-nameを記録 defineを改造したdefineに置き換える
  6. 出力例 5/6 きれいにはなっていないが

  7. 実装方針 6/6 (import (scheme base) (scheme write) …. ) (import

    (except (scheme base) define) (only (orange-paren hack-expression) define) (scheme write) …. ) importを投げると改造したマクロが名前空間に挿入される (define log ‘()) (define-syntax define (syntax-rules () ((_ (proc-name …… (define (proc-name . args) (with-exception-handler (lambda (object) (set-log! log proc-name args)) ※ 実際には末尾呼び出し最適化を殺さないように外側の一回だけ例外キャッチする
  8. おしまい ・nREPLは考えることがたくさんある ・エラー処理とか ・S式は強い ソースコードに強引にロガーをはさむという処理も容易にできた ・今後やること ある名前空間内で評価したらその名前空間ないでevalようにする処理