(def evil-code (str "(" (slurp "/mnt/src/git/clj/clojure/src/clj/clojure/core.clj") ")" ))
(def r (read-string evil-code ))
Run Code Online (Sandbox Code Playgroud)
工作,但不安全
(def r (clojure.edn/read-string evil-code))
RuntimeException Map literal must contain an even number of forms clojure.lang.Util.runtimeException (Util.java:219)
Run Code Online (Sandbox Code Playgroud)
不起作用......
如何安全地阅读Clojure代码(将所有'#s本身作为自己的东西)保存到树中?想象一下,Clojure防病毒软件希望扫描代码中的威胁,并希望使用数据结构,而不是使用纯文本.
任何lisps支持嵌套的s表达式吗?例如
((f 2) 3 4)
Run Code Online (Sandbox Code Playgroud)
对于这(f 2)
大概计算一个函数/宏应用上3 4
.
是否可以让lisp支持这样的事情?或者是否有技术限制禁止这种做法/使其不切实际?
我在读XML不是S-Expressions.XML范围是一种严格的,S表达式也是如此.在我见过的每种编程语言中,你都不能拥有以下内容:
<b>BOLD <i>BOTH </b>ITALIC</i>
== BOLD BOTH ITALIC
它甚至不能用S-Expressions表达:
(bold "BOLD" (italic "BOTH" ) "ITALIC" )
== :(
是否有任何编程语言支持这种"重叠"范围?它有什么实际用途吗?
如果可能的话,我正在寻找一个普通的lisp impl.(另外,我不想将sexp转换为XML并在结果上使用xpath.)
我喜欢常见的口齿不清,但有时输入简单的数学表达式是非常痛苦的
a(8b^2+1)+4bc(4b^2+1)
Run Code Online (Sandbox Code Playgroud)
(当然我可以转换它,但它有点慢,我先写(+()()),然后在每个括号中我放(*()())...)
我想知道这里是否有人知道更好的输入方法.我正在考虑编写一个数学宏,在哪里
(math “a(8b^2+1)+4bc(4b^2+1)”)
Run Code Online (Sandbox Code Playgroud)
扩展到
(+ (* a (1+ (* 8 b b))) (* 4 b c (1+ (* 4 b b))))
Run Code Online (Sandbox Code Playgroud)
但解析是名称很长的变量的问题.
有人有更好的建议吗?
Sexplib的语法扩展使得OCaml中的任意用户定义数据结构的序列化和反序列化变得容易.通常通过with sexp
在类型定义的末尾添加注释来完成:
type a = A of int | B of float with sexp
Run Code Online (Sandbox Code Playgroud)
这似乎不直接推广到基于仿函数的类型,也不清楚Sexplib标准类型转换器如何捕获甚至标准仿函数.
到目前为止,我已经通过int Map.Make(String).t
在序列化之前将特定的Map类型实例(例如)展平到列表来解决这个问题,反之亦然,但是肯定这一点并没有完全被Sexplib/Jane Street Core的雄心勃勃的作者所忽视.我还注意到旧版本的电池在自定义性别序列化中混合了它们的主要模块,如[Bat] Map,但这已被删除了一段时间.
如何使用Sexplib序列化常用的地图或其他复杂仿函数类型?
我正在使用vim-sexp和vim-sexp-mappings-for-regular-people插件来编辑Clojure文件.我不太明白什么是slurp和barf命令.
我试着和他们一起玩,似乎他们在相邻表格的开头/结尾插入/删除表格.那是对的吗?如果没有,什么是slurp和barf的正确定义?
我最近在KiCad中创建了一些PCB封装,它们存储在s-expression文件中,其数据如下所示:
(fp_text user %R (at 0 5.08) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start -27.04996 -3.986) (end -27.24996 -3.786) (layer F.Fab) (width 0.1))
(pad "" np_thru_hole circle (at 35.56 0) (size 3.175 3.175) (drill 3.175) (layers *.Cu *.Mask)
(clearance 1.5875))
(pad 96 smd rect (at 1.25 3.08473) (size 0.29972 1.45034) (layers F.Cu F.Paste F.Mask)
(clearance 0.09906))
Run Code Online (Sandbox Code Playgroud)
我希望能够编写shell one-liners来有效地编辑多个参数.我通常会使用Awk这样的东西,但是s表达式的递归性质使它不适合这项任务.我想知道是否存在一种带有解释器的编程语言,用于处理管道数据并且可以本地处理s表达式.也许Lisp的数据驱动方言会这样做,但我不知道在哪里看.
总之,我希望能够以类似于Awk允许我逐行处理数据列的方式快速编辑s表达式文件; 仅在s表达式的情况下,处理将逐级执行.
例如:发现所有的的pad
类型的表达式smd
用(size 0.29972 1.45034)
,并重新编号基于其位置每一个.
所有 Lisp 开发人员似乎都知道什么是 S 表达式。但有人能为非 Lisp 开发者解释一下这一点吗?
已经有一个维基百科条目(https://en.wikipedia.org/wiki/S-expression)。但如果您不想深入了解细节,那么这并没有多大帮助。
什么是 S 表达式?我可以用 S-Expression 表达什么?Lisp 通常使用 S 表达式的目的是什么?S 表达式只与 Lisp 开发人员相关吗?