Clojure 文档表示:
注册 INT 信号处理程序。调用此函数后,Ctrl-C 会导致给定的函数 f 被单参数信号调用。
如果没有提供函数,则使用 thread-stopper。
实际上,如果没有提供函数会发生什么:
Exception in thread "SIGINT handler" java.lang.IllegalArgumentException: No matching method stop found taking 1 args for class java.lang.Thread
at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:127)
at clojure.lang.Reflector.invokeInstanceMethod(Reflector.java:102)
at clojure.repl$thread_stopper$fn__11691.invoke(repl.clj:277)
at clojure.repl$set_break_handler_BANG_$fn__11694.invoke(repl.clj:289)
at clojure.repl.proxy$java.lang.Object$SignalHandler$d8c00ec7.handle(Unknown Source)
at jdk.unsupported/sun.misc.Signal$InternalMiscHandler.handle(Signal.java:198)
at java.base/jdk.internal.misc.Signal$1.run(Signal.java:219)
at java.base/java.lang.Thread.run(Thread.java:833)
有人(libera.chat上的#clojure中的TimMc)建议,Java 8之后移除了单参数停止函数,因此现在在没有提供函数的情况使用 set-break-handler! 并无实际作用。