Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Clojure Jython互操作_Python_Interop_Lisp_Clojure_Jython - Fatal编程技术网

Python Clojure Jython互操作

Python Clojure Jython互操作,python,interop,lisp,clojure,jython,Python,Interop,Lisp,Clojure,Jython,我想知道是否有人试图调用Jython函数 从Clojure内部,以及如果是这样的话,你是如何做的。我有 没有使用Jython,但我想Jython解释器可以 以与任何其他java代码和Python程序相同的方式调用 可以在其中运行。然而,我想知道是否有可能 以某种方式从Clojure调用单个python函数。就像我说的,我 我还没有尝试过这一点,所以它实际上可能是简单明了的 显而易见。我只是想知道是否有人试过这样做 谢谢, Rob注意:我刚刚意识到,问题是专门从Clojure调用Jython函数,

我想知道是否有人试图调用Jython函数 从Clojure内部,以及如果是这样的话,你是如何做的。我有 没有使用Jython,但我想Jython解释器可以 以与任何其他java代码和Python程序相同的方式调用 可以在其中运行。然而,我想知道是否有可能 以某种方式从Clojure调用单个python函数。就像我说的,我 我还没有尝试过这一点,所以它实际上可能是简单明了的 显而易见。我只是想知道是否有人试过这样做

谢谢,
Rob

注意:我刚刚意识到,问题是专门从Clojure调用Jython函数,而不是构建一个成熟的Jython-Clojure互操作解决方案。。。但是我已经写了一篇关于我对后者最初想法的小文章,我想这是合乎逻辑的下一步。我的意思是,在不方便访问Python类的情况下,您是如何使用有趣的Python包的?编写Python函数来包装方法调用等是一个可能的想法。。。但这是一个相当可怕的问题。不管怎样,还是这样

对于Clojure中Jython执行的Python函数的基本调用,请阅读下面的第二段和代码片段。然后阅读其余部分,以获得乐趣和意想不到的收益

我认为最初的体验远不是天衣无缝的。。。事实上,我的预测是,消除颠簸可能真的是一种巨大的痛苦。尽管如此,我还是有一种预感,这实际上比从Java调用Jython更容易。我只给你一个很长的0.02欧元。。。希望有更博学的人来告诉我我不知道我在说什么

首先要注意的是,Jython将所有内容封装在自己的类中,所有这些类都是从
org.python.core.PyObject
派生的,不需要费心让python可调用
Callable
Runnable
等。对于一些多方法/宏包装器来说,这实际上可能不是什么问题

Python类可以从Java中使用,但我(可能有缺陷)的理解是,通常,当试图对Jython创建的Python类实例执行操作时,Java代码只看到从Java基类或接口继承的方法。。。否则,需要特殊格式的docstring(!)。这里是JythonWiki上的链接。(不知道它是如何更新的。)很酷的一点是,
PyObjectDerived
(用户定义的Python类的实例)可以被说服使用给定的参数调用其方法。因此,通过勤奋的包装工作,人们可能希望能够使用某种程度上可以接受的语法来完成这项工作

事实上,让我们看看一些代码:

;; a handy instance of PythonInterpreter...
(def python (org.python.util.PythonInterpreter.))
(.eval python "5")
; -> #<PyInteger 5>
以及上述文件的对应文件:

(defmulti py-unwrap class)
;; if unsure, hope it's not a PyObject at all...
(defmethod py-unwrap :default [x] x)
(defmethod py-unwrap org.python.core.PyInteger [n] (.getValue n))
(defmethod py-unwrap org.python.core.PyString [s] (.toString s))
函数:您可以调用它们,也可以调用它们。后一个选项更令人愉快,因为它接受常规Java对象的Java数组,尽管它仍然返回
PyObject
。前者采用适当数量的位置参数,这些参数应该已经由
PyObject
s提供。我不知道如何传入关键字参数。。。虽然Jython不知怎么做到了,但一定有办法

下面是一个超基本的帮助程序,用于
\u jcall
-类型的调用:

(defn py-call [pyf & args]
  (apply (fn [pyf & args] (._jcall pyf (into-array args)))
         (map #(if (string? %) (py-eval %) %)
              (cons pyf args)))
您可以
.exec
一个包含
事实的Python定义的字符串,然后执行
(py调用“fact”10)
以获取一个
;如果你喜欢,就把它打开

诸如此类。。。我不知道的是:

  • 需要做什么样的努力才能使它足够有用,以便将有趣的Clojure代码与有趣的Python代码连接起来
  • 为Python调用提供合理的语法是否需要做任何对性能有害的事情

  • 谢谢,我一定要试试这个。我的目标是在不受Python限制的情况下使用自然语言工具包。Python为lambda找的可悲的借口没有多大乐趣。我在Clojure论坛上交叉发布,Marc Downie指出Py.java2py和._uto java_u_u将非常有用。刚刚注意到!不过,很高兴这里有链接。有Jython专家的建议也很好,也许持续的讨论会带来一些有用的东西…:-)我很想知道你在NLT的情况如何。我肯定会在Clojure小组中遵循这一思路,如果需要,我会很乐意尝试并提供帮助。快乐的黑客!从那时起,我一直在为这个目的建立一个小图书馆:太棒了!谢谢分享。:-)
    (defn py-call [pyf & args]
      (apply (fn [pyf & args] (._jcall pyf (into-array args)))
             (map #(if (string? %) (py-eval %) %)
                  (cons pyf args)))