我使用一个实例化另一个匿名类的方法实例化一个匿名类,并且从这个内部匿名类我想调用一个属于外部匿名类的方法.为了说明它,假设我有这个界面:
interface ReturnsANumber {
int getIt();
}
Run Code Online (Sandbox Code Playgroud)
然后,在我的代码中的某个地方,我这样做:
ReturnsANumber v = new ReturnsANumber() {
int theNumber() {
return 119;
}
public int getIt() {
// In a modern version of Java, maybe I could do
// var a = this;
// and then call a.theNumber();
ReturnsANumber w = new ReturnsANumber() {
int theNumber() {
return 1;
}
public int getIt() {
return this.theNumber();
}
};
return w.getIt();
}
};
System.out.println("The number is " + v.getIt());
Run Code Online (Sandbox Code Playgroud)
问题:
在最里面的方法中getIt
,我想调用theNumber() …
我有一个 Python3 Poetry 项目,其中有一个pyproject.toml
指定依赖项的文件:
[tool.poetry.dependencies]
python = "^3.10"
nltk = "^3.7"
numpy = "^1.23.4"
scipy = "^1.9.3"
scikit-learn = "^1.1.3"
joblib = "^1.2.0"
[tool.poetry.dev-dependencies]
pytest = "^5.2"
Run Code Online (Sandbox Code Playgroud)
我requirements.txt
使用命令将这些依赖项导出到文件中poetry export --without-hashes -f requirements.txt --output requirements.txt
,生成以下文件requirements.txt
:
click==8.1.3 ; python_version >= "3.10" and python_version < "4.0"
colorama==0.4.6 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Windows"
joblib==1.2.0 ; python_version >= "3.10" and python_version < "4.0"
nltk==3.8.1 ; python_version >= "3.10" and python_version …
Run Code Online (Sandbox Code Playgroud) 我正在计算 Clojure 中 3d 点云的边界框。点云表示为 Java 原始浮点数组,点云中的每个点都使用 4 个浮点存储,其中最后一个浮点未使用。像这样:
[x0 y0 z0 u0 x1 y1 z1 u1 .... ]
Run Code Online (Sandbox Code Playgroud)
点云的大小为 19200,即数组中的 4*19200 个浮点数。
其中一些值可能不是有限的(它们是无限的或 NaN)。因此,任何包含非有限值的点都应完全排除在计算之外。我已经在 Java 和 Clojure 中实现了这个计算,但是出于某种原因,Clojure 版本仍然慢了大约 4 到 5 倍。
这是 Clojure 代码的样子:
(defn good-compute-bbox [^floats data]
(let [n (alength data)]
(loop [i (int 0)
minx (float (aget data 0))
maxx (float (aget data 0))
miny (float (aget data 1))
maxy (float (aget data 1))
minz (float (aget data 2))
maxz (float (aget data 2))]
(if …
Run Code Online (Sandbox Code Playgroud) 我正在使用clojure.spec
解析 DSL。不幸的是,测试是否符合我的规范的计算时间似乎呈指数增长。我想了解原因,以及如何解决。
这是规范的样子:
(spec/def ::settings map?)
(spec/def ::header (spec/spec
(spec/cat :prefix #{:begin-example}
:label string?
:settings (spec/? ::settings))))
(def end-block [:end-example])
(spec/def ::not-end (partial not= end-block))
(spec/def ::end #{end-block})
(spec/def ::block (spec/cat
:header ::header
:data (spec/* ::not-end)
:suffix ::end))
(spec/def ::form (spec/alt :block ::block
:form any?))
(spec/def ::forms (spec/* ::form))
Run Code Online (Sandbox Code Playgroud)
为了执行规范,我编写了一个小函数,为规范生成有效数据,并编写了一个大小参数来控制数据的大小:
(defn make-sample-data [size]
(transduce
(comp (take size)
cat)
conj
[]
(repeat [:a 1 :b :c [:begin-example "a" {:indent 4}] :d :e [:end-example] 9])))
(make-sample-data 1)
;; …
Run Code Online (Sandbox Code Playgroud) 我想要一个宏this-ns
,以便它返回被调用位置的名称空间。例如,如果我有这个代码
(ns nstest.main
(:require [nstest.core :as nstest]))
(defn ns-str [x]
(-> x (.getName) name))
(defn -main [& args]
(println "The ns according to *ns*:" (ns-str *ns*))
(println "The actual ns:" (ns-str (nstest/this-ns))))
Run Code Online (Sandbox Code Playgroud)
我希望调用lein run
会产生这个输出:
The ns according to *ns*: user
The actual ns: nstest.main
Run Code Online (Sandbox Code Playgroud)
我想出的实现是以下代码:
(ns nstest.core)
(defmacro this-ns []
(let [s (gensym)]
`(do (def ~s)
(-> (var ~s)
(.ns)))))
Run Code Online (Sandbox Code Playgroud)
它似乎确实有效,但感觉非常hacky。值得注意的是,在上面的例子中,它会扩展到在函数内部def
调用,感觉不是很干净。-main
我的问题:有没有更好的方法来实现this-ns
获取this-ns
被调用的命名空间?
我正在尝试使用Clojure 中的ojAlgo Java 库,但我无法调用Expression类的weight方法。
为了演示它,我有一个具有此依赖项的 Leiningen 项目: [org.ojalgo/ojalgo "47.3.1"]
我正在尝试这样做:
(ns ojalgo-test
(:require [clojure.reflect :as r])
(:import [org.ojalgo.optimisation ExpressionsBasedModel
Expression]
CallExpressionWeight))
(def m (ExpressionsBasedModel.))
;; => #'ojalgo-test/m
(def e (.addExpression m))
;; => #'ojalgo-test/e
(.weight e 1.0) ;; ERROR!
Run Code Online (Sandbox Code Playgroud)
但是,最后一行失败并出现错误
- 未处理的 java.lang.IllegalArgumentException 没有找到匹配的方法权重,为类
org.ojalgo.optimisation.Expression取 1 个参数
问题:为什么会出现此错误,以及如何调用该weight
方法而不会出现错误?
但有趣的是,我可以写一个小的Java类来调用这个方法:
import org.ojalgo.optimisation.Expression;
public class CallExpressionWeight {
public static void apply(Expression e, double w) {
e.weight(w);
}
}
Run Code Online (Sandbox Code Playgroud)
这有效:
(CallExpressionWeight/apply e 1.0)
;; => nil …
Run Code Online (Sandbox Code Playgroud) 这是我的问题:假设我需要clojure.reflect :as r
,然后,例如,做
(->> (r/reflect java.lang.String)
:members
(filter #(= (:name %) 'getBytes))
first
:return-type)
Run Code Online (Sandbox Code Playgroud)
这将评估byte<>
哪个是符号.我怎么可以映射符号到Java类,那就是,我怎么能写一个函数type-symbol-to-class
,使得
(assert
(= (class (byte-array [1 2 3]))
(type-symbol-to-class 'byte<>)))
Run Code Online (Sandbox Code Playgroud)
不抛出异常?如果该函数适用于更多符号而不仅仅是好的byte<>
.
clojure ×5
clojure.spec ×1
geometry ×1
java ×1
java-8 ×1
methods ×1
performance ×1
pip ×1
python ×1