如何在 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))

但是,如果我们想读取sin1sin2中的参数怎么办?

我们有多少种方法可以做到?

谢谢。

我不确定你到底在问什么,但你可以通过满足 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)