gpt4 book ai didi

clojure - 我可以将 Clojure 表单从一个包转换到另一个包吗?

转载 作者:太空宇宙 更新时间:2023-11-03 18:40:33 24 4
gpt4 key购买 nike

背景

我为 Emacs 编写了一个 hack,它允许我将 Clojure 表单从编辑器缓冲区发送到 REPL 缓冲区。它工作正常,除了如果两个缓冲区位于不同的命名空间中,则复制的文本通常没有意义,或者更糟的是,它可能有意义但与编辑器缓冲区中的文本具有不同的含义。

我想转换文本,使其在 REPL 缓冲区中有意义。

Common Lisp 的解决方案

在 Common Lisp 中,我可以使用以下函数来完成此操作:

;; Common Lisp

(defun translate-text-between-packages (text from-package to-package)
(let* ((*package* from-package)
(form (read-from-string text))
(*package* to-package))
(with-output-to-string (*standard-output*)
(pprint form))))

和示例使用:

;; Common Lisp

(make-package 'editor-package)
(make-package 'repl-package)

(defvar repl-package::a)

(translate-text-between-packages "(+ repl-package::a b)"
(find-package 'editor-package)
(find-package 'repl-package))
;; => "(+ A EDITOR-PACKAGE::B)"

输入字符串和输出字符串中的包名称限定不同——这正是解决包之间复制和粘贴文本问题所需要的。

(顺便说一句,有关于如何在 Common Lisp 进程中运行翻译代码以及如何在 Emacs 世界和 Common Lisp 世界之间移动东西的内容,但我对此很满意而且我不是特别想深入了解它在这里。)

Clojure 中的非解决方案

这是 Clojure 的直接翻译:

;; Clojure

(defn translate-text-between-namespaces [text from-ns to-ns]
(let [*ns* from-ns
form (read-string text)
*ns* to-ns]
(with-out-str
(clojure.pprint/pprint form))))

和示例使用:

;; Clojure

(create-ns 'editor-ns)
(create-ns 'repl-ns)

(translate-text-between-namespaces "(+ repl-ns/a b)"
(find-ns 'editor-ns)
(find-ns 'repl-ns))
;; => "(+ repl-ns/a b)"

所以 Clojure 中的翻译函数什么也没做。这是因为 Common Lisp 和 Clojure 中的符号和包/命名空间的工作方式不同。

在 Common Lisp 中,符号属于一个包,符号包的确定发生在读取时。

在 Clojure 中,出于充分的理由,符号不属于命名空间,符号命名空间的确定发生在评估时。

这可以在 Clojure 中完成吗?

最后,我的问题是:我可以将 Clojure 代码从一个命名空间转换到另一个命名空间吗?

最佳答案

我不明白您的用例,但这是一种将符号从一个命名空间转换为另一个命名空间的方法。

(require 'clojure.walk 'clojure.pprint)

(defn ns-trans-form [ns1 ns2 form]
(clojure.walk/prewalk
(fn [f] (if ((every-pred symbol? #(= (namespace %) ns1)) f)
(symbol ns2 (name f))
f))
form))

(defn ns-trans-text [ns1 ns2 text]
(with-out-str
(->> text
read-string
(ns-trans-form ns1 ns2)
clojure.pprint/pprint)))

(print (ns-trans-text "editor-ns" "repl-ns" "(+ editor-ns/a b)" ))
;=> (+ repl-ns/a b)

因此,editor-ns/a 被转换为 repl-ns/a

关于clojure - 我可以将 Clojure 表单从一个包转换到另一个包吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15293727/

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