小编Neo*_*mov的帖子

Clojure&ClojureScript:clojure.core/read-string,clojure.edn/read-string和cljs.reader/read-string

我不清楚所有这些读字符串函数之间的关系.好吧,很明显clojure.core/read-string可以读取由pr[n]或甚至输出的任何序列化字符串print-dup.很明显,clojure.edn/read-string读取根据EDN规范格式化的字符串.

但是,我从Clojure脚本开始,并不清楚是否cljs.reader/read-string遵守.这个问题是由于我有一个Web服务正在发出以这种方式序列化的clojure代码:

(with-out-str (binding [*print-dup* true] (prn tags)))
Run Code Online (Sandbox Code Playgroud)

那就是产生包含数据类型的对象序列化.但是,这是不可读的cljs.reader/read-string.我总是得到这种类型的错误:

Could not find tag parser for = in ("inst" "uuid" "queue" "js")  Format should have been EDN (default)
Run Code Online (Sandbox Code Playgroud)

起初,我认为这个错误被抛出cljs-ajax但是在测试了cljs.reader/read-string一个rhino REPL后,我得到了同样的错误,这意味着它cljs.reader/read-string本身就被抛出了.它是由maybe-read-tagged-type函数引发的,cljs.reader但不清楚这是因为读者只能使用EDN数据,还是......?

另外,根据与Clojure文档的差异,唯一可以说的是:

The read and read-string functions are located in the cljs.reader namespace
Run Code Online (Sandbox Code Playgroud)

这表明他们应该完全具有相同的行为.

clojure clojurescript edn

26
推荐指数
3
解决办法
8023
查看次数

在Clojure中管理资源池的最佳方法

我有一个Web服务端点,它使用来自Java库的可变资源.该Web服务端点可以同时接收多个查询.(端点使用Ring/Compojure实现).创建这些资源成本很高,因此为每个Web服务调用重新创建它们实际上是低效的.

我想要做的是创建一个pool我在Web服务启动时填充的资源.然后,每次调用端点时,它都会从池中获取资源,将其用于处理,然后将其推回池中并等待下一次调用.

我想知道在Clojure中最好的方法是什么?是否有一个"池"Clojure库可以帮助我吗?

我天真地尝试使用原子中的向量来实现它,其中向量的每个项目都是该资源.然而,它很快就了解到它无法以这种方式真正发挥作用.

pool clojure

7
推荐指数
1
解决办法
507
查看次数

Emacs + Cider(Clojure)+自动完成:如何获取文档字符串?

我正在尝试正确配置emacs来编写我的Clojure代码.我将这些Emacs配置基于这篇好文章.

但是,我确实更改了一些设置,比如他正在使用的主题等.我一直在检查自动完成(Eldoc?我不确定)在Clojure中显示函数的文档字符串,以及我自己的代码.

我想看一下截图中的文档:

eldoc

但是,我无法显示"黄色"文档框.我不确定这是否是由于我的.emacs文件配置错误,或者是否是我必须使用的命令或...

这是我的.emacs档案:

(add-to-list 'custom-theme-load-path "~/.emacs.d/lib/noctilux-theme")

(require 'package):
  (add-to-list 'package-archives
    '("marmalade" . "http://marmalade-repo.org/packages/")
    '("melpa" . "http://melpa.milkbox.net/packages/"))

;; Initialize all the ELPA packages (what is installed using the packages commands)    
(package-initialize)  

;; Set bigger fonts
(set-default-font "Courier New-13")  

;; Setup to have a french keyboard layout working   
(require 'iso-transl)  

;; Show parenthesis mode
(show-paren-mode 1)  

;; rainbow delimiters
(global-rainbow-delimiters-mode)

;; paredit
(add-hook 'clojure-mode-hook 'paredit-mode)
(add-hook 'nrepl-mode-hook 'paredit-mode)
(global-set-key [f7] 'paredit-mode)

;; theme
(load-theme …
Run Code Online (Sandbox Code Playgroud)

emacs autocomplete clojure cider

5
推荐指数
1
解决办法
4111
查看次数

让Leiningen和Cygwin工作

我想让Leiningen和Cygwin一起工作.

我认为我遇到的一个问题是我在"C:\ Program Files\Java ..."目录中安装了Java.这个空间似乎引起了问题.

当我尝试在Cygwin中运行lein脚本时,我收到以下错误:

./lein: line 325: C:\Program Files\Java\jdk1.8.0_05\bin\java.exe : command not found
Run Code Online (Sandbox Code Playgroud)

然后我认为这个问题就是空间.所以我改变了第325行:

"$LEIN_JAVA_CMD" \
Run Code Online (Sandbox Code Playgroud)

到(用于测试目的):

"$'C:\\\Program Files\\\Java\\\jdk1.8.0_05\\\bin\\\java.exe'" \
Run Code Online (Sandbox Code Playgroud)

但是,我仍然收到此错误:

./lein: line 325: $'C:\\Program Files\\Java\\jdk1.8.0_05\\bin\\java.exe' : commande introuvable
Run Code Online (Sandbox Code Playgroud)

但是,这个文件显然存在:

Owner@Owner-PC ~
$ ls -alh $'C:\\Program Files\\Java\\jdk1.8.0_05\\bin\\java.exe'
-rwxr-xr-x 1 Owner None 187K  8 mai   15:39 C:\Program Files\Java\jdk1.8.0_05\bin\java.exe
Run Code Online (Sandbox Code Playgroud)

lein脚本似乎正在为Cygwin正确配置Leiningen,但我无法让它工作.

请注意,我之前 Cygwin 之外安装了Leiningen (我在Windows的普通shell中运行它).

我的设置,任何想法可能有什么问题?

cygwin clojure leiningen

5
推荐指数
1
解决办法
2394
查看次数

Elisp:使用let*和(lambda),符号的变量值为void

免责声明:我今天开始使用elisp进行攻击.

我真的很想知道我得到了以下错误:

Symbol's value as variable is void: response
Run Code Online (Sandbox Code Playgroud)

使用以下代码:

(let* ((response (cons 'dict nil)))
  (nrepl-request:eval
   code 
   (lambda (resp) 
      (print resp (get-buffer "*sub-process*"))
      (nrepl--merge response resp))
   (cider-current-connection) 
   (cider-current-session)))
Run Code Online (Sandbox Code Playgroud)

我的理解是,当从lambda函数调用时response,在let*子句的范围内......但显然它不是.

这似乎也适用于此代码

所以我有点迷失为什么我得到这个错误以及我应该怎么做.

emacs elisp

3
推荐指数
1
解决办法
860
查看次数

Clojure:交叉引用的变量,声明和编译错误

在命名空间中,我定义了两个vars(以及其他)是map:

(declare bar)

(def foo {:is-related-to bar})

(def bar {:is-related-to foo})
Run Code Online (Sandbox Code Playgroud)

因为bar我定义时不存在foo,所以我正在使用它进行声明(declare bar).

到目前为止没有问题,一切都在REPL中按预期工作.

我们唯一注意到的是,当我检查fooREPL时,我发现它bar是未绑定的,我认为可以通过以下方式使用declare:

#<Unbound Unbound: #'user/bar>
Run Code Online (Sandbox Code Playgroud)

当我尝试用lein jar或编译软件时出现问题lein ring war(因为它是一个Ring应用程序).我从编译器得到的错误是:

Exception in thread "main" java.lang.RuntimeException: Can't embed object in code, maybe print-dup not defined: Unbound: #'user/bar, compiling...
Run Code Online (Sandbox Code Playgroud)

我认为这也是预料之中的,因为我认为编译器不能处理未绑定的变量.

在任何情况下,如果要预期所有这些行为,如果无法编译,为什么人们使用前向声明?我可能在这里遗漏了一些东西.

java clojure

2
推荐指数
1
解决办法
119
查看次数

Clojure :(:refer-clojure:exclude [read])显然不起作用

我遇到了问题(:refer-clojure :exclude [read]).我的设置如下:

我有一个文件foo.clj是:

(ns foo.core)

(load "foo_bar")
Run Code Online (Sandbox Code Playgroud)

然后我有一个文件bar.clj是:

(ns foo.core
  (:refer-clojure :exclude [read]))

(defn read [])
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中,我确实在多个文件中拆分了命名空间.这就是为什么我(load)foo.clj文件中有一系列语句是入口点.

问题是,当我编译这个文件时,我仍然得到一个着名的错误:

警告:read已经引用:#'clojure.core /在命名空间中读取:clj-osf.crud,替换为:#'clj-osf.crud/read

我不认为这会是一个很大的问题,但问题是,当我从另一个应用程序使用该库时,其他应用程序将无法编译并告诉我什么foo.core/read根本不存在.

我也尝试改变foo.clj:

(ns foo.core
  (:refer-clojure :exclude [read]))

(load "foo_bar")
Run Code Online (Sandbox Code Playgroud)

但同样的问题也会发生.这是Clojure中的错误,还是我错过了什么?

我正在使用Clojure 1.6

clojure

2
推荐指数
1
解决办法
903
查看次数

Clojure:使用切换键和另一个地图中的值创建地图

我试图从输入创建一种恢复索引map.我得到的输入图是:

{"id-1" {"values" ["a" "b" "c"]}, "id-2" {"values" ["a" "b" "c"]}}
Run Code Online (Sandbox Code Playgroud)

然后我希望将此其他地图作为结果:

{"a" ["id-1" "id-2"], "b" ["id-1" "id-2"], "c" ["id-1" "id-2"]}
Run Code Online (Sandbox Code Playgroud)

但是,我认为我的思绪确实发疯了,而且我认为自己已经把自己画成了角落而没有开箱即用.这是我到目前为止所得到的,它看起来很臭:

(->> {"id-1" {"values" ["a" "b" "c"]} "id-2" {"values" ["a" "b" "c"]}}
       (map #(->> (get (second %) "values")
              (map (fn [x y] (hash-map y x)) (into [] (repeat (count (get (second %) "values")) (first %))))
              (apply merge-with concat)))
       (apply merge-with concat))
Run Code Online (Sandbox Code Playgroud)

基本上,我使用第一个map用于"迭代"我的所有输入值.然后我使用第二个地图创建一系列看起来像这样的单独地图:

({"a" "id-2"} {"b" "id-2"} {"c" "id-2"} {"a" "id-1"} {"b" "id-1"} {"c" "id-1"})
Run Code Online (Sandbox Code Playgroud)

为了获得该地图,我创建了一个中间数组 …

clojure

1
推荐指数
1
解决办法
313
查看次数

Clojure:创建一个宏来引用地图的每个符号

我正在尝试编写一个将地图作为输入的宏,并引用该地图中存在的每个符号(键和值).

这是我想做的.假设我有一个宏quote-everything,它将这样的地图作为输入:

{foo "foo" :bar bar}
Run Code Online (Sandbox Code Playgroud)

然后,评估:

(quote-everything {foo "foo" :bar bar})
Run Code Online (Sandbox Code Playgroud)

会产生:

{quote(foo) "foo" :bar quote(bar)}
Run Code Online (Sandbox Code Playgroud)

基本上,我希望宏生成一个新的地图,其中引用每个符号.问题是我不知道从哪里开始,如果有可能的话.问题是地图可以是任何东西,宏也应该支持嵌套地图.

可以使用来完成符号的检测symbol?.但是,为了支持嵌套映射,宏可能应该调用自己.但我不知道应该如何使用这样的宏创建新地图.

任何指针将不胜感激.

macros clojure

0
推荐指数
1
解决办法
103
查看次数

标签 统计

clojure ×8

emacs ×2

autocomplete ×1

cider ×1

clojurescript ×1

cygwin ×1

edn ×1

elisp ×1

java ×1

leiningen ×1

macros ×1

pool ×1