如何在 Clojure 中定义 C++ "function object"(仿函数)?
How could a c++ "function object" (functor) be defined in Clojure?
"c++ function object"(仿函数)我的意思是:"an object for which the function call operator is defined."
我想有几种方法可以做到这一点。举个例子,假设我们需要一个参数化函数:
f(x) = sin(x*freq) // maths
我们可以使用 "a function constructor":
(defn newSinus [freq]
(fn [x] (Math/sin (* freq x)))
)
(def sin1 (newSinus 2.0) )
(def sin2 (newSinus 1.5) )
(println (sin1 1.5))
(println (sin2 2.0))
但是,如果我们想读取sin1
或sin2
中的参数怎么办?
我们有多少种方法可以做到?
谢谢。
我不确定你到底在问什么,但你可以通过满足 clojure.lang.IFn
接口来定义一个可作为函数调用的记录:
(defrecord Adder [x]
clojure.lang.IFn
(invoke [_ y]
(+ x y)))
((->Adder 3) 4) ; => 7
(def 加法器(部分 + 3))
(加法器 4)
此外,创建一个闭包也会做同样的事情
(defn make-adder[x] (fn [y] (+ x y))
根据@exupero 的回答,我为 "sinus" 示例推导出以下代码。
;;
;; --- Sinus ---
;; freq: R // state
;; R -> constructor()
;; R -> () -> R // this is invoke
;; freq() -> R // getter, in fact it is freq: R
;; -------------
(defrecord Sinus [freq]
;;
;; implement this interface so Sinus
;; appears as a "function object"
;;
clojure.lang.IFn
(invoke [_ x]
(Math/sin(* freq x))))
;; -----------------------------
;; "main()"
;; -----------------------------
;;
;; s1 <- new Sinus (2.5)
;;
(def s1 (Sinus. 2.5))
;;
;; s1.freq()
;;
(:freq s1)
;;
;; s1(4)
;;
(s1 4)
"c++ function object"(仿函数)我的意思是:"an object for which the function call operator is defined."
我想有几种方法可以做到这一点。举个例子,假设我们需要一个参数化函数:
f(x) = sin(x*freq) // maths
我们可以使用 "a function constructor":
(defn newSinus [freq]
(fn [x] (Math/sin (* freq x)))
)
(def sin1 (newSinus 2.0) )
(def sin2 (newSinus 1.5) )
(println (sin1 1.5))
(println (sin2 2.0))
但是,如果我们想读取sin1
或sin2
中的参数怎么办?
我们有多少种方法可以做到?
谢谢。
我不确定你到底在问什么,但你可以通过满足 clojure.lang.IFn
接口来定义一个可作为函数调用的记录:
(defrecord Adder [x]
clojure.lang.IFn
(invoke [_ y]
(+ x y)))
((->Adder 3) 4) ; => 7
(def 加法器(部分 + 3)) (加法器 4)
此外,创建一个闭包也会做同样的事情
(defn make-adder[x] (fn [y] (+ x y))
根据@exupero 的回答,我为 "sinus" 示例推导出以下代码。
;;
;; --- Sinus ---
;; freq: R // state
;; R -> constructor()
;; R -> () -> R // this is invoke
;; freq() -> R // getter, in fact it is freq: R
;; -------------
(defrecord Sinus [freq]
;;
;; implement this interface so Sinus
;; appears as a "function object"
;;
clojure.lang.IFn
(invoke [_ x]
(Math/sin(* freq x))))
;; -----------------------------
;; "main()"
;; -----------------------------
;;
;; s1 <- new Sinus (2.5)
;;
(def s1 (Sinus. 2.5))
;;
;; s1.freq()
;;
(:freq s1)
;;
;; s1(4)
;;
(s1 4)