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中找到这样的方法。
答案 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))))