这是我上一个问题的后续行动:为什么我们需要零?显然,大多数时候都会使用正确的列表.但不正确的清单的目的是什么?
我正在寻找一种方法来实现一个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细胞?
使用启用了Paredit的emacs.如何搜索LISP(Clojure)S表达式并重命名变量?我想在当前的S表达式中而不是全局表达式中进行.
我试图弄清楚如何实现 Lisp 评估 非递归。我的基于 C 的评估器是Minimal Lisp文件 l1.c。然而,其中的几个函数再次递归为 eval:eval、apply、evargs、evlist 以及 Lisp Ops DefineFunc、whileFunc、setqFunc、ifFunc...
我正在尝试找出一个平坦的评估。我可以想出一些可能的方法:
我的问题是:是否有算法/论文/实现以不同的方式进行平面评估。我正在寻找一种不转换为字节码但类似于使用下推堆栈的无递归“深度优先遍历”的实现。我想对原始的 s 表达式进行操作。
答案:在 C 语言中实现求值器时,您需要在平面循环中实现整个过程,手动实现返回堆栈和堆栈帧,使用 goto 和 switch() 对控制流进行建模。这是一个例子:flat。
我正在寻找一个简单的脚本或库来将s表达式转换为点格式,并且在谷歌搜索中没有太多运气.
我遇到了一个旧的awk脚本(lisp2dot),但是我相信我的表达式可能过于复杂,因为我正在从遗传编程框架中生成S表达式.我希望把它变成点格式,这样我就可以了解输出树的外观.
任何建议都是必要的...我宁愿不要手工完成,因为它只是为了演示目的而满足我对输出的好奇心(因为阅读大型s表达式会变得很麻烦).
我写了一段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) 我正在使用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) 我调用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) 我刚刚开始在我的自定义类型上使用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.List
和Sexp.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 …
最近我遇到了一个错误,当我修复它时,我想知道是否有可能返回一个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)
或者这不可能吗?