我正在按照维基百科上的描述在C#中编写SECD机器的模拟器.我已完成基本操作,但我不确定如何实现该指令.rap
在维基百科,它说rap:
rap像ap一样工作,只是它用当前的一个替换了虚拟环境的出现,从而使递归函数成为可能
因为ap它说:
ap弹出一个闭包和堆栈中的参数值列表.闭包通过将其环境安装为当前参数来应用于参数,将参数列表推到前面,清除堆栈,并将C设置为闭包的函数指针.先前的S,E值和C的下一个值保存在转储中.
这是我的实施 ap
public void ap()
{
Push(S, ref D);
Push(E, ref D);
Push(C, ref D);
List closure = Pop(ref S);
List paramlist = Pop(ref S);
E = closure.Tail;
Push(paramlist, ref E);
C = closure.Head;
S = List.Nil;
}
Run Code Online (Sandbox Code Playgroud)
请注意,这List是我对Lisp样式"cons"单元格的实现.
令我困惑的是,究竟有何rap不同ap?例如,环境寄存器(E)究竟发生了什么?我发现维基百科的定义有点含糊不清,并且找不到任何能够解释它的东西.
许多脚本解释器喜欢irb或node作为评估者工作.如果我执行此代码,
10
Run Code Online (Sandbox Code Playgroud)
它将评估并打印值本身,并且不会出错.
当我安装lua它时,它作为执行者而不是评估者.所以当我放10,它会出错.
我可以让Lua解释器作为评估者工作吗?
我正在尝试将SICP的元循环评估程序转换为Clojure.在setup-environment调用extend-environment不编译因为我收到错误"尝试调用未绑定的fn".这是代码的一部分:
(... loads of methods for creating and managing environment list)
(def primitive-procedures
(list (list 'car first)
(list 'cdr rest)
(list 'cons conj) ;; TODO: reverse
(list 'null? nil?)
(list 'list list)
(list '+ +)
(list '- -)
(list '* *)
(list '/ /)
;; more primitives
))
(def primitive-procedure-names
#(map [first
primitive-procedures]))
(def primitive-procedure-objects
(fn [] (map (fn [p] (list 'primitive (second p)))
primitive-procedures)))
(def the-empty-environment '())
(defn extend-environment [vars vals base-env]
(if …Run Code Online (Sandbox Code Playgroud) 当我尝试在 Dr. Racket 中运行评估器时,它显示错误:“模块语言:定义窗口中只能有一个表达式”。
显然这个窗口中有多个定义,一个评估器有多个定义,那么我如何运行这些多个定义?或者是否有任何其他方法来运行评估器。
任何帮助,将不胜感激。
type bool_exp =
TT
| FF
| Var of string
| And of bool_exp * bool_exp
| Not of bool_exp ;;
eval : bool_exp -> (string -> bool) -> bool
Run Code Online (Sandbox Code Playgroud)
我正在尝试编写一个名为的求值函数eval.我是OCaml的新手并不习惯语法.我在哪里可以写这篇文章?
evaluator ×5
metacircular ×2
scheme ×2
clojure ×1
interpreter ×1
lua ×1
ml ×1
ocaml ×1
racket ×1
sicp ×1