我试图理解^:const
clojure中的内容.这就是开发人员所说的.http://dev.clojure.org/display/doc/1.3
(def常数{:pi 3.14:e 2.71})
(def ^:const pi(:pi constants))(def ^:const e(:e constants))
查找的开销:e和:地图中的pi发生在编译时,因为(:pi常量)和(:e常量)在评估其父def形式时进行评估.
这是令人困惑的,因为元数据用于符号的var绑定pi
,而var绑定到符号e
,但下面的句子说它有助于加速地图查找,而不是var查找.
有人可以解释一下^:const
正在做什么以及使用它背后的理由吗?请问这个比较使用一个巨大的let
块或使用宏象(pi)
和(e)
?
我一直在阅读代码和文档,试图了解类重新加载在clojure中的工作原理.根据许多网站,如http://tutorials.jenkov.com/java-reflection/dynamic-class-loading-reloading.html,每当你加载一个类本质上你获得字节码(通过任何数据机制),转换将字节码转换为类Class的实例(通过defineClass),然后通过resolveClass解析(链接)该类.(defineClass是否隐式调用resolveClass?).任何给定的类加载器只允许链接一次类.如果它试图链接现有的类,它什么都不做.这会产生问题,因为您无法链接新实例化的类,因此每次重新加载类时都必须创建类加载器的新实例.
回到clojure,我尝试检查加载类的路径.
在clojure中,您可以根据需要以多种方式定义新类:
匿名类:reify代理
命名类:deftype defrecord(在引擎盖下使用deftype)gen-class
最终,这些代码指向clojure/src/jvm/clojure/lang/DynamicClassLoader.java
其中DynamicClassLoader/defineClass使用super的defineClass创建一个实例,然后缓存该实例.当你想要检索类时,clojure加载调用forName调用类加载器和DynamicClassLoader/findClass,它首先在委托给超类之前查看缓存(这与大多数普通类加载器的工作方式相反,它们在哪里首先委托,而不是自己尝试.)混淆的重点如下:forName被记录为在返回之前链接类,但这意味着你不能从现有的DynamicClassLoader重新加载一个类,而是需要创建一个新的DynamicClassLoader但是我没有在代码中看到这一点.我理解代理和reify定义了匿名类,因此它们的名称不同,因此可以将其视为不同的类.但是,对于命名类,这会破坏.在真正的clojure代码中,您可以同时引用旧版本的类和对新版本类的引用,但尝试创建新类实例将是新版本.
请解释一下clojure如何在不创建DynamicClassLoader的新实例的情况下重新加载类,如果我能理解重新加载类的机制,我想将这个重新加载功能扩展到我可能使用javac创建的java .class文件.
注意:此问题涉及类RELOADING,而不仅仅是动态加载.重新加载意味着我已经实习了一个类,但想要实例化该实例的新更新版本.
我想重申一下,不清楚clojure如何能够重新加载deftype定义的类.调用deftype最终会调用clojure.lang.DynamicClassLoader/defineClass.再次执行此操作会导致再次调用defineClass,但手动执行此操作会导致链接错误.在这里发生了什么,允许clojure使用deftypes做到这一点?
我想要:
以下面的例子为例:
Red robotic birds are only composed of buttons, cheese, and wire.
Run Code Online (Sandbox Code Playgroud)
我想表达一类鸟类,红色和机器人的鸟类,有一个属性.这个属性是它们只由按钮,奶酪和电线组成.电线奶酪或按钮的类型没有限制.因此,应该可以推断出没有由纸构成的红色机器鸟.此外,这些鸟可以由项目按钮,奶酪和电线的子集组成.
在clojure/core.logic.prelude中,有使用defrel
和的关系和事实fact
.但是,我无法想出一个组合来解释这个事实.
在定义记录及其实现的接口之后,我可以通过其名称或使用点运算符的java互操作方式调用其方法.
user=> (defprotocol Eat (eat [this]))
Eat
user=> (defrecord animal [name] Eat (eat [this] "eating"))
user.animal
user=> (eat (animal. "bob"))
"eating"
user=> (.eat (animal. "bob"))
"eating"
user=>
Run Code Online (Sandbox Code Playgroud)
在表面下,那里发生了什么?是否定义了新的clojure函数?如果您定义的函数共享相同的名称会发生什么(这可能吗?),这些歧义如何解决?
此外,是否可以为其他java对象"导入"java方法,以便您不需要.运营商,以便行为如上?(例如,用于统一用户界面的目的)
clojure/src/jvm/clojure/lang/RT.java
以上似乎是clojure源代码中最重要的源文件之一.为了理解架构,RT代表什么?
我正在尝试理解clojurescript中的命名空间模型.我知道javascript不是内置的命名空间支持,所以它是通过谷歌闭包库添加的.但是,我不明白clojurescript如何处理这些差异.有人可以解释一下吗?
让我们说例如我想使用谷歌图表api,并尽可能使用高级编译.我在closure/build
调用中使用了什么,ns
表单的外观如何以及从代码中引用api的最佳方式是什么?我查看了https://github.com/sritchie/contour,但该示例不使用高级编译,我没有在project.clj文件中看到引用google api的选项.
我知道该binding
表单允许在clojure中重新绑定动态范围.到目前为止,我所见过的唯一用途是用于I/O,例如在print
哪里*out*
可以反弹到你当时想要的作家.
我希望看到真正利用binding
其他设施无法正常工作的优势的例子.就个人而言,我只是在将用户提供的对象传递给所有函数的情况下才使用它真的很乏味.基本上我正在尝试创建辅助函数使用的上下文.(类似于这种情况何时应该在Clojure中使用临时重新绑定-a-special-var成语?)更具体地说,我依靠用户创建动态绑定到*db*
var以允许数据库函数知道操作什么.当用户需要编写大量嵌套调用数据库函数时,这特别有用.通常,我很好,如果我需要编写宏来让自己更容易,但要求用户这样做似乎很糟糕.话虽如此,我尽量避免这样做.
"绑定"的其他一些好用例有哪些我可以复制并合并到我的代码中?
假设我想构建一个包含多个组件的大型clojure库.作为开发人员,我想将许多组件保存在不同的命名空间中,因为许多辅助函数可以具有相似的名称.我并不一定想把事情变得私密,因为在极端情况下它们可能具有实用性,并且私人背后的解决方案并不好.(换句话说,我想建议代码使用,而不是完全阻止使用.)
但是,我希望库的用户在命名空间中操作,并在每个子库中使用许多函数子集的并集.什么是惯用或最好的方法呢?我想到的一个解决方案是编写一个生成的宏:需要并通过定义一个给定的var名称列表来创建一个新的var映射(参见第一个代码示例).是否存在使用此方法的权衡,例如扩展类型会发生什么?有没有更好的方法(或内置)?
宏示例(src/mylib/public.clj):
(ns mylib.public
(:require [mylib.a :as a])
(:require [mylib.b :as b]))
(transfer-to-ns [+ a/+
- b/-
cat b/cat
mapper a/mapper])
Run Code Online (Sandbox Code Playgroud)
再次,澄清一下,最终目标是在mylib用户创建的其他项目中创建一些文件,以便能够创建类似(src/someproject/core.clj)的内容:
(ns someproject.core
(:require [mylib.public :as mylib]))
(mylib/mapper 'foo 'bar)
Run Code Online (Sandbox Code Playgroud)
@Jeremy Wall,请注意您提出的解决方案并未满足我的需求.让我们假设存在以下代码.
MYLIB/a.clj:
(ns mylib.a)
(defn fa [] :a)
Run Code Online (Sandbox Code Playgroud)
MYLIB/b.clj:
(ns mylib.b)
(defn fb [] :b)
Run Code Online (Sandbox Code Playgroud)
MYLIB/public.clj:
(ns mylib.public
(:use [mylib.a :only [fa]])
(:use [mylib.b :only [fb]]))
Run Code Online (Sandbox Code Playgroud)
somerandomproject/core.clj :(假设类路径设置正确)
(ns somerandomproject.core
(:require [mylib.public :as p])
;; somerandomproject.core=> (p/fa)
;; CompilerException java.lang.RuntimeException: No such var: p/fa, compiling: (NO_SOURCE_PATH:3)
;; …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用jgit的api使用以下代码执行git pull/push
org.eclipse.jgit.api.Git.open(theRepoFile).pull().call()
Run Code Online (Sandbox Code Playgroud)
但我得到例外
JSchException Auth fail
com.jcraft.jsch.Session.connect (Session.java:461)
org.eclipse.jgit.transport.JschConfigSessionFactory.getSession (JschConfigSessionFactory.java:116)
org.eclipse.jgit.transport.SshTransport.getSession (SshTransport.java:121)
org.eclipse.jgit.transport.TransportGitSsh$SshPushConnection.<init> (TransportGitSsh.java:306)
org.eclipse.jgit.transport.TransportGitSsh.openPush (TransportGitSsh.java:152)
org.eclipse.jgit.transport.PushProcess.execute (PushProcess.java:130)
org.eclipse.jgit.transport.Transport.push (Transport.java:1127)
org.eclipse.jgit.api.PushCommand.call (PushCommand.java:153)
Run Code Online (Sandbox Code Playgroud)
即使使用cgit pull and push工作.
我尝试检查SO以获取示例代码
但上面的问题没有提供一个完整的编码示例,说明使用通常通过ssh密钥进行身份验证的远程仓库执行git pull所需的操作.应该有一种方法来获取凭证信息~/.ssh/
或等效的窗口.
我已经看到变异观察者用它来修改doms的属性,例如使用谷歌浏览器开发工具.但是,我不能找到如何在textarea
用户输入或粘贴时更改文本时调用函数.在我的代码中,当用户键入时,即使将所有observe选项设置为true,也不会调用回调.这是什么代码?
clojure ×8
classloader ×1
constants ×1
java ×1
javascript ×1
jgit ×1
jsch ×1
namespaces ×1
protocols ×1