首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Clojure中的STDIN中读取单个字符?

如何从Clojure中的STDIN中读取单个字符?
EN

Stack Overflow用户
提问于 2019-10-26 14:58:41
回答 1查看 346关注 0票数 0

我正在编写一个循环,它只适用于单字符输入。根据用户按下的内容(不按ENTER键),我希望显示用户键入的键,然后重复。如果用户按下"q",则循环必须退出。

制约因素:

  • 我不关心Unicode (只支持美国ASCII字符集是可取的)。
  • i只关心Unixy系统(只有Linux才行)。
  • 我使用的是莱宁根。

这能办到吗?一些搜索让我找到了jline2,它有ConsoleReader类,但它似乎在jline3中消失了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-28 04:08:41

我看到了https://gist.github.com/mikeananev/f5138eeee12144a3ca82136184e7a742,并使用了链接的重复答案,得到了以下结果:

代码语言:javascript
复制
; Need `(:import [org.jline.terminal TerminalBuilder Terminal])`

(defn new-terminal
  "creates new JLine3 Terminal.
  returns terminal object"
  ^Terminal [term-name]
  (let [terminal (-> (TerminalBuilder/builder)
                     (.jna true)
                     (.system true)
                     (.name term-name)
                     (.build))]
    terminal))

(defn interactive-loop []
  (let [t (new-terminal "xxx")]
    (.enterRawMode t)
    (let [reader (.reader t)]
    (loop [char-int (.read reader)]
      (case (char char-int)
        \q (do
          (println "Bye!")
          (.close reader)
          (.close t))
        (do (println (char char-int))
            (recur (.read reader))))))))

我在NixOS上,显然jline3库依赖于正在安装的infocmp二进制文件,这是流行的ncurses包的一部分。不幸的是,我目前使用的Nixpkgs版本没有打包这个二进制文件,所以我在这里输入了一个PR:https://github.com/NixOS/nixpkgs/pull/72135

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58571928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档