Inheritance Clojure中的多个方法未返回预期值
我正在学习《Clojure的快乐》这本书,现在在多方法部分。在那本书中,他们给出了一个示例,该示例应该返回一个东西,但为我返回另一个(我尝试了LightTable和Emacs)。代码有点长;我尽我所能把它剪了下来,但为此道歉。这是倒数第二个未按预期返回的命令(内联显示)。我怎样才能使它正常工作 助手函数是这个问题的附带函数,因此您可以先跳到multi-methods。我把它们包括在内,以防它们可能是问题的根源。如果您需要了解更多信息,我会在末尾添加一条说明Inheritance Clojure中的多个方法未返回预期值,inheritance,clojure,polymorphism,dispatch,multimethod,Inheritance,Clojure,Polymorphism,Dispatch,Multimethod,我正在学习《Clojure的快乐》这本书,现在在多方法部分。在那本书中,他们给出了一个示例,该示例应该返回一个东西,但为我返回另一个(我尝试了LightTable和Emacs)。代码有点长;我尽我所能把它剪了下来,但为此道歉。这是倒数第二个未按预期返回的命令(内联显示)。我怎样才能使它正常工作 助手函数是这个问题的附带函数,因此您可以先跳到multi-methods。我把它们包括在内,以防它们可能是问题的根源。如果您需要了解更多信息,我会在末尾添加一条说明 (ns joy.udp (:ref
(ns joy.udp
(:refer-clojure :exclude [get]))
;; helpers
(defn beget [this proto]
(assoc this ::prototype proto))
(def clone (partial beget {}))
(defn get [m k]
(when m
(if-let [[_ v] (find m k)]
v
(recur (::prototype m) k))))
;;;;;;; compiler
(defmulti compiler :os)
(defmethod compiler ::unix [m] (get m :c-compiler))
(defmethod compiler ::osx [m] (get m :llvm-compiler))
;;;;;;; home
(defmulti home :os)
(defmethod home ::unix [m] (get m :home))
(defmethod home ::bsd [m] "/home")
;;;;;;; compile-cmd
(defmulti compile-cmd (juxt :os compiler))
(defmethod compile-cmd [:osx "gcc"] [m] (str "/usr/bin/" (get m :c-compiler)))
(defmethod compile-cmd :default [m] (str "Unsure where to locate " (get m :c-compiler)))
;;;;;;;;; hierarchy inheritence
(derive ::osx ::unix)
(derive ::osx ::bsd)
(prefer-method home ::unix ::bsd)
(derive (make-hierarchy) ::osx ::unix)
;;;;;;;;;;;; data-maps
(def unix {:os ::unix, :c-compiler "cc", :home "/home", :dev "/dev"})
(def osx (-> (clone unix)
(assoc :os ::osx)
(assoc :llvm-compiler "clang")
(assoc :home "/Users")))
(compile-cmd osx) ;; This should return "/usr/bin/gcc"
;=> "Unsure where to locate cc"
(compile-cmd unix)
;=> "Unsure where to locate cc"
*关于助手的注意事项:新的get
根据ns限定关键字::prototype
重新定义,该关键字在beget
中使用,它基本上只是assoc
-将一个映射与该关键字和另一个映射作为其值关联到作为参数输入的映射。这个新的{:关键字{map as val}}对最终通过底部定义的clone
函数关联到osx数据映射中。新定义的数据映射用作上述代码底部多方法调用的参数
我不熟悉多种方法,只想直观地了解多态调度在Clojure中的工作原理。我是不是疯狂地认为这太复杂了
(defmethodcompilecmd[::osx“gcc”][m](str)/usr/bin/(get m:c-compiler)))
应该是
(defmethodcompilecmd[::osx“clang”][m](str)/usr/bin/(get m:c-compiler)))
(defmethodcompilecmd[::osx“gcc”][m](str)/usr/bin/(get m:c-compiler)))
应该是
(defmethodcompilecmd[::osx“clang”][m](str)/usr/bin/(get m:c-compiler)))
(defmethodcompilecmd[::osx“gcc”][m](str)/usr/bin/(get m:c-compiler)))
应该是
(defmethodcompilecmd[::osx“clang”][m](str)/usr/bin/(get m:c-compiler)))
(defmethodcompilecmd[::osx“gcc”][m](str)/usr/bin/(get m:c-compiler)))
应该是
(defmethodcompilecmd[::osx“clang”][m](str)/usr/bin/(get m:c-compiler)))
juxt
返回一个向量,其中包含对参数上并置函数求值的结果。如果你评估
((juxt :os compiler) osx)
你得到
[:joy.udp/osx "clang"]
这意味着compilecmd
将在调用
(编译cmd osx)
因为您的multimethod中没有这些分派值,所以您触发了默认值。
juxt
返回一个向量,其中包含对参数上并置函数求值的结果。如果你评估
((juxt :os compiler) osx)
你得到
[:joy.udp/osx "clang"]
这意味着compilecmd
将在调用
(编译cmd osx)
因为您的multimethod中没有这些分派值,所以您触发了默认值。
juxt
返回一个向量,其中包含对参数上并置函数求值的结果。如果你评估
((juxt :os compiler) osx)
你得到
[:joy.udp/osx "clang"]
这意味着compilecmd
将在调用
(编译cmd osx)
因为您的multimethod中没有这些分派值,所以您触发了默认值。
juxt
返回一个向量,其中包含对参数上并置函数求值的结果。如果你评估
((juxt :os compiler) osx)
你得到
[:joy.udp/osx "clang"]
这意味着compilecmd
将在调用
(编译cmd osx)
因为您的multimethod中没有这些分派值,所以触发了默认值。我感谢您的回答,但我仍然得到了两个调用相同的输出。我猜
(compile cmd[::osx“clang”]…)
中的向量表示以下函数将在这些类型中的每一个上分派,但是您是否可以向我解释一下juxt函数发生了什么?这一更改为我做到了。你试过重新加载你的名称空间吗?好的,我成功了!谢谢我不得不退出IDE并重新打开它。重置repl连接、保存、关闭和重新打开文件是不够的。有没有更简单的方法来重新加载我的姓名空间?我很感激你的回答,但我仍然得到两个电话相同的输出。我猜(compile cmd[::osx“clang”]…)
中的向量表示以下函数将在这些类型中的每一个上分派,但是您是否可以向我解释一下juxt函数发生了什么?这一更改为我做到了。你试过重新加载你的名称空间吗?好的,我成功了!谢谢我不得不退出IDE并重新打开它。重置repl连接、保存、关闭和重新打开文件是不够的。有没有更简单的方法来重新加载我的姓名空间?我很感激你的回答,但我仍然得到两个电话相同的输出。我猜(compile cmd[::osx“clang”]…)
中的向量表示以下函数将在这些类型中的每一个上分派,但是您是否可以向我解释一下juxt函数发生了什么?这一更改为我做到了。你试过重新加载你的名称空间吗?好的,我成功了!谢谢我不得不退出IDE并重新打开它。重置repl连接、保存、关闭和重新打开文件是不够的。有没有更简单的方法来重新加载我的姓名空间?我很感激你的回答,但我仍然得到两个电话相同的输出。我猜(compile cmd[::osx“clang”]…)
中的向量表示以下函数将在这些类型中的每一个上分派,但是您是否可以向我解释一下juxt函数发生了什么?此更改是为了