标签: s-expression

什么是不正确的名单?

这是我上一个问题的后续行动:为什么我们需要零?显然,大多数时候都会使用正确的列表.但不正确的清单的目的是什么?

lisp scheme s-expression

5
推荐指数
2
解决办法
1382
查看次数

在OOP中解析S表达式的正确方法

我正在寻找一种方法来实现一个S表达式读取器(稍后将同时使用一个Scheme解释器和一个编译器),但我一直在问自己(如果有的话)我应该为它编写一个AST.

我一直在阅读SICP,这在Scheme中非常简单,但我希望以OO方式在C++中实现解释器和编译器.

请记住,我这样做只是为了学习目的,所以我并不是在寻找最简单或最快捷的方法,而是寻找正确且可重复使用的方法.

我在一些Scheme实现中看到人们解析s表达式并且很容易输出cons单元,如下所示:

  struct Sexpr
  {
  };

  struct Cons : public Sexpr
  {
    Sexpr* left;
    Sexpr* right;
  };

  struct IntAtom : Sexpr
  {
    int value;
  };
Run Code Online (Sandbox Code Playgroud)

每种方案都有一个Sexpr的子类Atom,或者类似的东西.

我不确定,但这对我来说似乎是一个黑客......这项工作不应该由翻译而不是读者完成吗?

我想知道的是,这是否被认为是读取S表达式的最佳(或正确)方式,还是解析器的作用比解析器更重要?解析器是否应该有自己的AST而不是依赖于cons细胞?

c++ oop scheme abstract-syntax-tree s-expression

5
推荐指数
1
解决办法
2347
查看次数

在S-Expression(词法范围)中搜索和替换变量名?

使用启用了Paredit的emacs.如何搜索LISP(Clojure)S表达式并重命名变量?我想在当前的S表达式中而不是全局表达式中进行.

lisp emacs clojure paredit s-expression

5
推荐指数
1
解决办法
416
查看次数

Lisp s 表达式的平面求值

我试图弄清楚如何实现 Lisp 评估 非递归。我的基于 C 的评估器是Minimal Lisp文件 l1.c。然而,其中的几个函数再次递归为 eval:eval、apply、evargs、evlist 以及 Lisp Ops DefineFunc、whileFunc、setqFunc、ifFunc...

我正在尝试找出一个平坦的评估。我可以想出一些可能的方法:

  1. 转换为字节码并在VM中执行
  2. 实现一个扁平的 Forth 求值器并在 Forth 中实现 Lisp 求值,这就是lf.f所做的事情。
  3. 另一种可能性可能是将 l1.c 中的所有递归函数加入到一个大 switch 循环中。局部变量将被连接到基于堆的结构中,对递归子函数的调用将由基于堆的返回堆栈实现。

我的问题是:是否有算法/论文/实现以不同的方式进行平面评估。我正在寻找一种不转换为字节码但类似于使用下推堆栈的无递归“深度优先遍历”的实现。我想对原始的 s 表达式进行操作。

答案:在 C 语言中实现求值器时,您需要在平面循环中实现整个过程,手动实现返回堆栈和堆栈帧,使用 goto 和 switch() 对控制流进行建模。这是一个例子:flat

c lisp eval s-expression

5
推荐指数
2
解决办法
1257
查看次数

S表达式到DOT的转换库

我正在寻找一个简单的脚本或库来将s表达式转换为点格式,并且在谷歌搜索中没有太多运气.

我遇到了一个旧的awk脚本(lisp2dot),但是我相信我的表达式可能过于复杂,因为我正在从遗传编程框架中生成S表达式.我希望把它变成点格式,这样我就可以了解输出树的外观.

任何建议都是必要的...我宁愿不要手工完成,因为它只是为了演示目的而满足我对输出的好奇心(因为阅读大型s表达式会变得很麻烦).

converter dot s-expression

5
推荐指数
1
解决办法
185
查看次数

在C中运行嵌入式R.

我写了一段C代码,声明了一个大小为4x4的方阵.然后它从R rgig中的包GeneralizedHyperbolic中调用的采样函数中采样.它使用来自gnu的gsl库反转矩阵并吐出结果.这是从C调用R的练习.

#include <stdio.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <stddef.h>

// for gsl
#include <gsl/gsl_machine.h>
#include <gsl/gsl_rng.h>
#include <gsl/gsl_randist.h>
#include <gsl/gsl_cdf.h>
#include <gsl/gsl_cblas.h>
#include <gsl/gsl_sf_gamma.h>
#include <gsl/gsl_vector.h>
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_blas.h>
#include <gsl/gsl_linalg.h>

// for R embedding in C
#include <Rinternals.h>
#include <Rdefines.h>
#include <Rembedded.h>
#include <R_ext/Parse.h>

void gsl_square_matrix_inverse (gsl_matrix *, gsl_matrix *, int);
SEXP get_rInvGauss(void);

int main(void)
{
    // Define the dimension n of the matrix
    // and the signum s (for LU decomposition) …
Run Code Online (Sandbox Code Playgroud)

c r s-expression

5
推荐指数
1
解决办法
919
查看次数

pyparsing的嵌套字典输出

我正在使用pyparsing来解析表单的表达式:

"and(or(eq(x,1), eq(x,2)), eq(y,3))"
Run Code Online (Sandbox Code Playgroud)

我的测试代码如下所示:

from pyparsing import Word, alphanums, Literal, Forward, Suppress, ZeroOrMore, CaselessLiteral, Group

field = Word(alphanums)
value = Word(alphanums)
eq_ = CaselessLiteral('eq') + Group(Suppress('(') + field + Literal(',').suppress() + value + Suppress(')'))
ne_ = CaselessLiteral('ne') + Group(Suppress('(') + field + Literal(',').suppress() + value + Suppress(')'))
function = ( eq_ | ne_ )

arg = Forward()
and_ = Forward()
or_ = Forward()

arg << (and_ | or_ |  function) + Suppress(",") + (and_ | or_ | …
Run Code Online (Sandbox Code Playgroud)

python pyparsing s-expression

5
推荐指数
1
解决办法
1778
查看次数

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

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

/* Construct result list from variables containing the results */
SEXP res = PROTECT(allocVector(VECSXP, 3)); /* list of length 3 */
SET_VECTOR_ELT(res, 0, ScalarReal(a)); /* numeric(1) */ 
SET_VECTOR_ELT(res, 1, somenumericvector); /* numeric(<some length>) */
SET_VECTOR_ELT(res, 2, ScalarInteger(i)); /* integer(1) */

/* Name components and return */
SEXP nms = PROTECT(allocVector(STRSXP, 3)); /* names as SEXP */
char *nms_ = CHAR(STRING_ELT(nms, 0)); /* pointer to names */
char *names[3] = {"result_numeric", "result_numeric_vector", "result_integer"};
for(i = 0; i …
Run Code Online (Sandbox Code Playgroud)

c r s-expression

5
推荐指数
2
解决办法
1201
查看次数

在类型上使用'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

open Core.Std
open Option.Monad_infix

open Battey.Kernel

type hit = (sentence * int) with sexp
Run Code Online (Sandbox Code Playgroud)

生成此警告:

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.

其他信息:我使用ocamlc的4.02.3版本(如通过安装opam …

ocaml pattern-matching compiler-warnings s-expression

5
推荐指数
1
解决办法
242
查看次数

如何在编写R扩展时返回命名的VECSXP

最近我遇到了一个错误,当我修复它时,我想知道是否有可能返回一个VECSXP(即一个R列表类型),其中元素被命名.这个c ++代码:

SEXP do_bla() 
{
   int prtCnt = 0;
   SEXP a = PROTECT(allocMatrix(REALSXP, 5, 5));
   prtCnt++;
   SEXP b = PROTECT(allocVector(REALSXP, 5));
   prtCnt++;
   SEXP OS = PROTECT(allocVector(VECSXP, 2));
   prtCnt++;
   SET_VECTOR_ELT(OS, 0, a);
   SET_VECTOR_ELT(OS, 1, b);
   UNPROTECT(prtCnt);
   return OS;
}
Run Code Online (Sandbox Code Playgroud)

会给我一个R中两个元素(矩阵和向量)的列表:

s <- .Call("do_bla", ....)
Run Code Online (Sandbox Code Playgroud)

可以像这样索引:

 s[[1]]; s[[2]]
Run Code Online (Sandbox Code Playgroud)

为了实现这一目标,我需要做些什么改变:

s$a; s$b
Run Code Online (Sandbox Code Playgroud)

或者这不可能吗?

c r s-expression r-extension

5
推荐指数
2
解决办法
501
查看次数