以前にこの質問をしたことがありますが ( Locating unmatched delimiters in Clojurescript )、まだ十分な答えがありません。
パラメータの不一致などのエラーがリーダーによって検出されている行の警告を取得したいと思います。Clojure は通常、非常に一般的なエラーをスローするだけで、ファイルの名前のみをスローしますが、行などはスローしません。
私はどちらかを持っていたいです
- この情報を提供する clojure 固有のツール (lint ツールのようなもの)
- これらのスタック トレースの読み取りに関するアドバイス
私は自分の問題を発見したので、私が抱えていた問題についてもっと正確に知りたいと思っています。複数のファイルにまたがるコードで配布された Clojurescript をコンパイルしていました。コードがコンパイルされなくなったことを発見したとき、そのうちの約 3 つに変更を加えたことを知りました。エラー メッセージは、 行)
のファイルの不一致に関するものでした。しかし、私は、私が実質的に変わっていないことを確信していました.a.cljs
1
a.cljs
そのため、そのようなエラーが発生したときに実行する通常の方法をとっていました (それほど頻繁ではありません)。
- ファイル全体をvimでインデントして、インデントが「おかしくなっている」かどうかを確認します。
- git diff を使用して、作業コピーと最新の履歴 (私は詳細なコミットを行っています) の変更を探し、最近変更した箇所を見つけます。
今回はそう簡単には変化に気づきませんでした。]
最終的に、問題は閉じ括弧が積み重なったファイルの一部、つまり)]))])
他のファイルの途中のようなものに欠落していることがわかりましたc.cljs
。何らかの理由で、vim clojure は以下の関数をより多くまたは間違ってインデントしなかったため、インデントに基づく「検出」が機能しませんでした。
clojure リーダーがこれらの括弧の不一致の場所をうまく吐き出せないのには、おそらく十分な理由があることを認識しています。私の質問が軽蔑的であると理解しないでください。かなり長い間場所を探した後、{([
;
コメントと単純な"
文字列を処理する小さな (〜 50 行) スタックベースの括弧マッチング プログラム (C++ で認めなければなりません) を作成しました。正しいパーサーに近いものはありません。それでも、正しい行と文字を指摘してくれました。
Clojure のエラー メッセージの品質に関して:一部は貧弱ですが、Clojure の構文は非常に単純であり、ほとんどの場合、構文を正しく理解するだけなので、ほとんど不満はありません (セマンティクスは別のトピックです)。それにもかかわらず、不一致の括弧でこのような貧弱なエラーメッセージを出す Lisp は、特に Lisp を使ったことがない人にとっては少し不運です。私はpareditを知っています。私はそれを使用しました(少なくともvim-paredit)。これは、s式を操作するための優れたツールです。しかし、それはいくつかのことをより複雑にし、私は paredit と vim-fugitive を混ぜて悪い経験をしました。
示唆されているように、ハッキングと clojure コアへの貢献: 実際にはオプションかもしれませんが、そのソース コードをブラウジングするときは、飛び込むのに本当に多くの労力がかかります. leiningen と一緒に使用すると、その方が簡単かもしれません。
私の投稿は、ある意味で一部の人々を刺激したと感じています。clojure プロジェクトを否定するつもりはありませんでした。プログラミング言語を提供してくれた clojure 開発者には本当に感謝しています。