如何从JSCL方法

时间:2017-07-29 22:17:45

标签: javascript lisp common-lisp

JSCL是Common Lisp(CL)的实现之一。

它涵盖了除CLOS,格式等之外的许多CL功能。

它的REPL与其他CL实现一样。

我想知道如何从JS方面调用CL代码。

我想这样做:

// set the CL codes as string
var codes = "(defun f1(x) (+ x 1) )
(f1 99)";

// call CL codes from JSCL
JSCL.CL.call(codes);
=> 100

我想在JSCL中找到这样的方法。

2 个答案:

答案 0 :(得分:2)

您可以从JS控制台调用Common Lisp函数和特殊表单。 您只需在浏览器的控制台上键入以下代码即可。

在下面的示例中,第一个代码定义了返回值1的函数。第二个代码调用函数并打印评估值100。

jscl.CL.PRINT.fvalue.call(this, jscl.internals.pv, jscl.CL.EVAL.fvalue.call(this, jscl.internals.pv, jscl.packages["COMMON-LISP"].symbols["READ-FROM-STRING"].fvalue.call(this, jscl.internals.pv, jscl.internals.js_to_lisp("(defun f1(x)(+ x 1))"))))

jscl.CL.PRINT.fvalue.call(this, jscl.internals.pv, jscl.CL.EVAL.fvalue.call(this, jscl.internals.pv, jscl.packages["COMMON-LISP"].symbols["READ-FROM-STRING"].fvalue.call(this, jscl.internals.pv, jscl.internals.js_to_lisp("(f1 99)"))))

答案 1 :(得分:0)

暴露了新方法。

如果在JS控制台上键入以下代码,则会得到12。

(clojure.pprint/pprint (macroexpand '(defn every? "Returns true if (pred x) is logical true for every x in coll, else false." {:tag Boolean :added "1.0" :static true} [pred coll] (cond (nil? (seq coll)) true (pred (first coll)) (recur pred (next coll)) :else false)))) (def every? (clojure.core/fn ([pred coll] (cond (nil? (seq coll)) true (pred (first coll)) (recur pred (next coll)) :else false))))