clojure 看函数内部
clojure look inside a function
函数很容易创建:
(defn x [y] (* y y))
(x 8) ;64
但是他们很难检查因为
(print x) ; #<core$x my-namespace$x@34990a46>
不是很有用。有没有办法窥视内部?
如果没有办法,一个复杂的程序或者一个巨大的宏也许可以跟踪在哪里创建和组合函数,比如 valgrind 跟踪数组的长度等。也许已经编写了一些工具来进行这种调试。
编辑:
这是另一个问题的部分重复,区别在于编程方式与 REPL。但是,我不知道这些任务有何不同,因为答案很复杂。
就其纯粹形式而言,这是不可能的。函数在很大程度上对调用它们的代码是不透明的。这导致许多 Clojure 程序员更喜欢在可能的情况下传递数据(特别是地图),这样可以更容易地组合起来。
可以获取函数的源代码并从中做出一些推断,尽管这很难,因为源代码可能包含来自系统的某些状态,这些状态在编译时不再存在,还有许多其他挑战。
core.async 是一个巨大的重宏库,确实会从这种能力中受益,尽管它缺乏解决跨函数调用的异步操作的能力,因为目前认为在一般情况下正确地做到这一点是不切实际的感觉。不过,在某些情况下,您可以通过检查源代码来获得您想要的一些效果。
函数很容易创建:
(defn x [y] (* y y))
(x 8) ;64
但是他们很难检查因为
(print x) ; #<core$x my-namespace$x@34990a46>
不是很有用。有没有办法窥视内部?
如果没有办法,一个复杂的程序或者一个巨大的宏也许可以跟踪在哪里创建和组合函数,比如 valgrind 跟踪数组的长度等。也许已经编写了一些工具来进行这种调试。
编辑: 这是另一个问题的部分重复,区别在于编程方式与 REPL。但是,我不知道这些任务有何不同,因为答案很复杂。
就其纯粹形式而言,这是不可能的。函数在很大程度上对调用它们的代码是不透明的。这导致许多 Clojure 程序员更喜欢在可能的情况下传递数据(特别是地图),这样可以更容易地组合起来。
可以获取函数的源代码并从中做出一些推断,尽管这很难,因为源代码可能包含来自系统的某些状态,这些状态在编译时不再存在,还有许多其他挑战。
core.async 是一个巨大的重宏库,确实会从这种能力中受益,尽管它缺乏解决跨函数调用的异步操作的能力,因为目前认为在一般情况下正确地做到这一点是不切实际的感觉。不过,在某些情况下,您可以通过检查源代码来获得您想要的一些效果。