Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

    View Slide

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

    View Slide

  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
    ・機能増やす
    (マクロ展開結果とかみたい )
    やったこと
    これから

    View Slide

  4. nREPLからエラーをクライアントに送信したい
    この辺の出力、api有無は処理系依存
    - api等がないこともある
    エラーメッセージはキャッチしたエラーをerror-object-messageでとれる
    3/6
    ソース上の位置やスタック情報がないのはつらい
    こういうのがほしい↓

    View Slide

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

    View Slide

  6. 出力例
    5/6
    きれいにはなっていないが

    View Slide

  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))
    ※ 実際には末尾呼び出し最適化を殺さないように外側の一回だけ例外キャッチする

    View Slide

  8. おしまい
    ・nREPLは考えることがたくさんある
    ・エラー処理とか
    ・S式は強い
    ソースコードに強引にロガーをはさむという処理も容易にできた
    ・今後やること
    ある名前空間内で評価したらその名前空間ないでevalようにする処理

    View Slide