gpt4 book ai didi

multithreading - Clojure运行具有零个或一个输入的函数的多线程

转载 作者:行者123 更新时间:2023-12-03 13:14:58 27 4
gpt4 key购买 nike

我正在Clojure中尝试运行独立线程,并且得到了我不理解的不同行为。
对于我的代码编辑器,我使用的是Atom(而不是emacs),REPL是Chlorine。
我正在测试一个仅打印数字的非常简单的函数。
此打印从100打印到1,不输入任何内容:

(defn pl100 []
"pl100 = Print Loop from 100 to 1"
(loop [counter 100]
(when (pos? counter)
(do
(Thread/sleep 100)
(println (str "counter: " counter))
(recur (dec counter))))))
除了输入内容外,此代码执行的操作完全相同:
(defn pl-n [n]
"pl-n = Print Loop from n to 1"
(loop [counter n]
(when (pos? counter)
(do
(Thread/sleep 100)
(println (str "counter: " counter))
(recur (dec counter))))))
当我使用
(.start (Thread. #(.run pl100)))
; --> prints to console REPL
; --> runs with no errors
此代码
  • 打印到控制台REPL(在这里我称为lein)和
  • 运行无错误

  • 当我使用
    (.start (Thread. #(.run (pl-n 100))))
    ; prints to console REPL
    ; --> java.lang.NullPointerException: Cannot invoke "Object.getClass()" because "target" is null
    此代码
  • 打印到控制台REPL
  • 以上述异常
  • 结尾

    当我使用
    (.start (Thread. pl100))
    ; --> prints to the console REPL
    ; --> runs with no errors
    此代码
  • 打印到控制台REPL
  • 运行无错误

  • 当我使用
    (.start (Thread. (pl-n 100)))
    ; --> prints to Atom REPL, not console REPL!
    ; ends with exception
    ; Execution error (NullPointerException) at java.lang.Thread/<init> (Thread.java:396).
    ; name cannot be null
    ; class java.lang.NullPointerException
    此代码
  • 打印到Atom REPL(我使用的是Atom,而不是emacs)!不像其他
  • 那样进入控制台REPL
  • 以异常
  • 结尾

    所以,有人可以帮我了解一下吗:
  • 当我运行接受输入的函数时,为什么会出现Java错误?为什么函数调用不等效?
  • (.run ...)在做什么?
  • 为什么有时代码会打印到控制台,而其他时候却打印到Atom/Chlorine?
  • 最佳答案

    简单回答:Thread.run需要一个函数。您的第一个展览为它提供了一个功能pl100,并且可以按预期工作:

    #(.run pl100)
    如果您不给 .run一个函数,而是给它调用 pl100函数返回的值,那将发生完全不同的事情。实际上, pl100返回nil,因此 Thread.run会抛出NullPointerException:
    #(.run (pl100)) ;; NullPointerException
    这就解释了为什么您的第二次展览没有达到您的预期。 pl-n返回nil,然后将nil传递给 Thread.run时出现异常:
    #(.run (pl-n 100)) ;; NullPointerException
    为了弥合差距-在不需要参数的函数 Thread.run和需要参数的函数 pl-n之间,您可以引入无参数函数(以满足 Thread.run),该函数用所需的参数调用 pl-n。习惯上,这将是一个匿名函数。不幸的是,您不能将 #()嵌套在 #()内,因此您将不得不为一种匿名函数(更可能是外部函数)使用更为冗长的 (fn [] ...)语法。

    关于multithreading - Clojure运行具有零个或一个输入的函数的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65852747/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com