问题标签 [s-expression]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1522 浏览

c - 如何构造一个命名列表(一个 SEXP)以从使用 .Call() 调用的 C 函数返回?

我通过调用 C 代码.Call("foo", <args>),其中 foo 调用其他 C 函数,计算结果并返回它。结果是一个长度为 3 的列表,我想命名这个列表。为此, foo 这样做:

这是构造长度为 3 的命名列表的正确方法吗?

C 函数确实返回到 R,但是一旦我将输出分配给 R 中的变量,我立即得到分段错误。可能有什么问题?我可以在上面的'return res;'之前放置'debug statement's(简单printf("...\n"))并且它们执行得很好。有没有方便的方法来调试从R调用的C代码?

0 投票
2 回答
525 浏览

bash - jq 或 xsltproc 替代 s 表达式?

根据 Unix 哲学,我有一个项目,其中包含一堆使用 bash 脚本捆绑在一起的小程序。他们的交换格式最初是这样的:

其中-:分隔的字段是元数据,而ASTs 是脚本按原样传递的 s 表达式。这很好用,因为我可以用来cut -d ' '从 AST 中拆分元数据,并cut -d ':'深入研究元数据。但是,我随后需要添加一个包含空格的元数据字段,这会破坏这种格式。由于没有字段使用标签,我切换到以下内容:

由于我设想将来会添加更多元数据字段,因此我认为是时候切换到更结构化的格式而不是玩“猜标点符号”的游戏了。

而不是分隔符,cut我可以使用 JSON 和jq,或者我可以使用 XML 和xsltproc,但是由于我已经在 AST 中使用 s 表达式,我想知道是否有一种很好的方法可以在这里使用它们?

例如,看起来像这样的东西:

我的要求是:

  • 以最少的样板直接使用 stdio,因为这是我的程序读取/写入数据的地方
  • 可从 shell 脚本轻松调用,为bash 的进程调用和流水线提供非常引人注目的替代方案
  • 如果可能,流式 I/O;IE。我宁愿一次使用一个 AST,而不是消耗整个输入来寻找结束)
  • 快速且轻量级,尤其是在它被多次调用的情况下;每个 AST 只有几 KB,但它们加起来可以达到数百 MB
  • 至少应该在 Linux 上工作;跨平台就好了

显而易见的选择是使用 Lisp/Scheme 解释器,但我使用过的唯一一个是 Emacs,它太重量级了。也许另一个实现更轻量级并且适合这个?

在 Haskell 中,我使用过 shelly、turtle 和 atto-lisp,但我的大部分代码都用于在 String/Text/ByteString、包装/解包Lisp、实现我自己的carcdrcons等之间进行转换。

我已经阅读了一些关于 scsh 的内容,但也不知道这是否合适。

0 投票
2 回答
766 浏览

clojure - 计算树数据结构的深度 - clojure

我正在尝试实现一种算法来通过 Clojure Zippers 找到序列表达式的深度。

这就是我解释要转换为树数据结构的序列的方式。有没有直接的方法可以通过 Zipper 库计算(从给定的例子中计算的深度为 2)?

任何建议,将不胜感激!

0 投票
2 回答
911 浏览

go - 在 Go 中解析 s 表达式

如果您不熟悉,这里是 lis.py 的链接:http: //norvig.com/lispy.html

我正在尝试在 Go 中实现一个小型 lisp 解释器。我受到了 Peter Norvig 在 Python 中的 Lis.py lisp 实现的启发。

我的问题是我想不出一种有效的方法来解析 s 表达式。我曾想过一个计数器,当它看到“(”时会增加 1,当看到“)”时会减少。这样,当计数器为 0 时,你就知道你有一个完整的表达式。

但问题在于,这意味着您必须对每个表达式进行循环,这会使解释器对于任何大型程序都非常慢。

任何替代想法都会很棒,因为我想不出更好的方法。

0 投票
1 回答
438 浏览

c - 在 C 中标记一个 s 表达式

我正在尝试创建自己的 Lisp 解释器,但在解析 s 表达式时遇到了一些问题。我最初的想法是标记表达式并一次处理一个位。在我自己的尝试失败后,我遇到了一些代码来执行此操作,但是我对它的输出感到困惑。

用法:

输出:

看着代码,我已经预料到它,例如,输出17和非17 '(a b c)或输出2和非2)。是什么原因造成的,我该如何解决?如果在这种情况下标记化不是最佳解决方案,我也愿意接受建议。

第二点,像这样的参数是str绝对必要的吗?startend参数是否不够,因为之前不需要start数据?

0 投票
2 回答
1253 浏览

python - 使用 Python 漂亮打印 Lisp

有没有办法在 Python 中漂亮地打印 Lisp 样式的代码字符串(换句话说,一堆平衡的括号和文本)而不重新发明轮子?

0 投票
4 回答
136 浏览

clojure - Lisp-family:符号调用和符号作为参数的不同评估

lisp-family(编辑:lisp-1)语言中是否有一种方法可以区分符号评估作为函数或参数的位置(即在评估时覆盖该符号的评估)?
作为一个例子(我不需要这个功能,这是一个例子),我想对一组对象实现某种中缀操作,可以由对象本身调用

这实际上会将函数 some-operator 应用于 my-obj 和参数。
但是当此对象在代码中的其他任何地方用作参数时,例如:

它将评估为 my-obj 的值。
谢谢你。

0 投票
1 回答
362 浏览

pattern-matching - 在类型上使用 'with sexp' 会生成“警告 4:这种模式匹配很脆弱”

我刚刚开始在我的自定义类型上使用with sexp语法扩展(在此处此处描述)。但是,我注意到,当我这样做时,我会收到以下关于我的类型的警告:

Warning 4: this pattern-matching is fragile. It will remain exhaustive when constructors are added to type Sexplib.Type.t.

假设这是因为with sexp语法生成的 sexp 转换器仅处理为 Sexp (Sexp.ListSexp.Atom) 定义的类型构造函数。

我通常会尝试修复编译中的任何警告;有没有办法让编译器在这里开心(没有让它在所有情况下都完全抑制警告)?

编辑:用于降价格式。

更新:提供来自hit.ml.

生成此警告:

File "hit.ml", line 6, characters 5-27: Warning 4: this pattern-matching is fragile. It will remain exhaustive when constructors are added to type Sexplib.Type.t.

其他信息:我在opammacbook(优胜美地)上使用 ocamlc 的 4.02.3 版本(通过 安装),并且正在使用 113.00.00corecore_kernel. 我也-w A用于我的 cflags。

对更新延迟表示歉意;假期让我远离我的笔记本电脑/互联网连接。

感谢您的反馈!

0 投票
3 回答
1080 浏览

scala - 在 Scala 中定义 s-expr 的惯用方式

Scala 如何“希望”我定义s-expr?在英语中,我们递归地定义 s-expr,如下所示:“一个 s-expr 要么是一个原子,要么是一个 s-expr 的列表。” 你在 Scala 里怎么说?

我很确定这是错误的:

Either也可能不适合这个,从那时起我必须区分Leftand Right,这是无关紧要的。

您如何创建这样的递归类定义,以便它与 Scala 的其余部分很好地协同工作?

0 投票
2 回答
232 浏览

java - 如何匹配括号来解析 S 表达式?

我正在尝试创建一个执行以下操作的函数:

假设输入的代码是“(a 1 2 (b 3 4 5 (c 6) |7) 8 9)”,其中管道 | 符号是光标的位置,

函数返回:一个字符串“b 3 4 5 (c 6) 7”,表示光标范围内的代码

一个 int 8 表示字符串相对于输入的起始索引

一个 int 30 表示字符串相对于输入的结束索引

我已经有可以完全返回的工作代码。然而,问题在于忽略注释,同时跟踪上下文(例如字符串文字、我自己的文字分隔符等)。

这是跟踪上下文的代码:

首先,我将像这样使用上面的函数:

其次,我将向前和向后使用它,因为当前执行描述顶部所述功能的方法是(在伪代码中):

如您所见,此功能可以正向和反向工作。或者至少是大部分。唯一的问题是,如果我向后使用此功能,正确扫描评论(由标准 ECMA 双斜杠“//”表示)会变得混乱。

如果我要为反向上下文应用程序创建一个单独的函数并递归检查每一行是否有双斜杠,然后将“//”之后的所有内容都设为注释(或在函数使用的方向上,在此之前的所有内容//),这将花费太多的处理时间,因为我想将其用作音乐的实时编码环境。

此外,在尝试执行该returnCodeInScopeOfCursor方法之前删除注释可能不可行......因为我需要跟踪代码的索引以及不跟踪的内容。如果我要删除评论,所有代码位置都会变得一团糟,并跟踪我在哪里删除了确切的内容以及删除了多少字符等......我正在使用的文本区域输入 GUI(RichTextFX ) 不支持 Line-Char 跟踪,因此仅使用 char 索引跟踪所有内容,因此存在问题...

所以......我对如何处理我当前的代码感到非常困惑。任何帮助、建议、意见等......将不胜感激。