【发布时间】:2016-02-23 15:40:44
【问题描述】:
我正在写一个 DSL,我想实现调试。
但是,我丢失了所有行信息,因为我使用 (read-string the-input) 读取用户输入,然后它不再是源,而是使用 eval 评估的 s 表达式。
我首先想到的是,只需在每行末尾添加代码(用户不知情),如下所示:
(user-func-a)
(user-func-b)
会变成:
(user-func-a) (my-source-index 0)
(user-func-b) (my-source-index 1)
但是,这会以多行形式分崩离析:
(+ (my-source-index 0)
1 (my-source-index 1)
2 (my-source-index 2)
3) (my-source-index 3)
然后我想实现括号跟踪,所以只有当括号关闭时我才会添加源索引:
(+
1
2
3) (my-source-index 3)
但后来我想,等等,cmets 呢?我必须跟踪';'也可以,否则就是这样:
(+
1 ;) (my-source-index 1)
2 (my-source-index 2)
3) (my-source-index 3)
即使我实现了这一点,我也必须跟踪注释符号不在引号中的位置(文本的一部分)等等。
在那之后我并没有走得更远(可能会有更多的怪癖......)并来到这里。是否有任何用于 clojure 的库来解析代码,找出行周围的上下文并避免此类麻烦?
【问题讨论】: