标签: clojure

在 Clojure 中将字符串向量转换为哈希映射

我有以下数据结构:

["a 1" "b 2" "c 3"]

我如何将其转换为哈希映射?

我想要以下数据结构:

{:a 1 :b 2 :c 3}

clojure data-structures data-transform

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

Clojure 上记忆斐波那契数引起的 StackOverflowError

配置

在clojure 1.10.3openjdk 17.0.1下测试

问题

下面是斐波那契记忆法的稍微修改版,一般技术参考维基记忆法

(def fib
  (memoize #(condp = %
              0 (bigdec 0)
              1 1
              (+ (fib (dec %)) (fib (- % 2))))))

(fib 225) ; line 7
Run Code Online (Sandbox Code Playgroud)

我原以为像Clojure这样的FPmemoized Fibonacci中的上述内容在精神上相当于下面Python中的命令式DP

def fib(n):
    dp = [0, 1] + [0] * n
    for i in range(2, n + 1):
        dp[i] = dp[i - 1] + dp[i - 2]
    return dp[n]
Run Code Online (Sandbox Code Playgroud)

问题1

在我的例子中,当斐波那契数升至225时,为什么实际上会出现以下错误?

Syntax error (StackOverflowError) …
Run Code Online (Sandbox Code Playgroud)

clojure memoization dynamic-programming

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

为什么我的 clojure 循环返回单个字母而不是整个单词?

我正在尝试循环一组字符串,删除多余的文本。它有效,但太好了。给定这样的输入:

#{"TORCASO,133114,117,0.04,89045.38,99.00,0.00,0.00,0.00,0.00,0.00" "POTOCZNY,98770,170,0.06,87231.39,98.82,0.00,(S),0.00,0.00,(S)"}
Run Code Online (Sandbox Code Playgroud)

我的输出如下所示:

#{\A \C \N \O \P \R \S \T \Y \Z}
Run Code Online (Sandbox Code Playgroud)

但我希望它看起来像这样:

#{"TORCASO" "POTOCZNY"}
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

(defn shorten-string
  [string]
  (first (str/split string #",")))


(defn handle-csv
  [strings]
  (loop [remaining-strings strings final-set #{}]
   (if (empty? remaining-strings)
     final-set
     (let [[part & remaining] remaining-strings]
       (recur remaining
              (into final-set
                    (shorten-string part)))))))
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

loops clojure

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

根据索引合并clojure中地图的两个向量

我在 clojure 中有两个地图向量,我希望将它们合并,使其成为单个地图向量,但每个索引处的地图都被合并。我只是想知道做到这一点的最佳方法。

例如:

[{:sku "e1" :name "example1"} {:sku "e2" :name "example2"}]
[{:color "Blue" :price 9.99} {:color "Red" :price 15.99}]
Run Code Online (Sandbox Code Playgroud)

将合并为:

[{:sku "e1" :name "example1" :color "Blue" :price 9.99} {:sku "e2" :name "example2" :color "Red" :price 15.99}]
Run Code Online (Sandbox Code Playgroud)

maps merge vector clojure

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

具有不确定数量的键的映射向量的 Clojure 规范

我正在尝试为一个函数编写一个 clojure 规范,该函数采用以下两个映射作为参数。

{1 BL0-MD0-SU, 0 BL0-SM0-SU}
{0 [https://gateway.pinata.cloud/ipfs/QmcLjsUDHVuy8GPUPmj4ZdGa3FWTfGnsKhWZ4dxqUaGGXk/doge.jpg ], 1 [https://gateway.pinata.cloud/ipfs/QmcLjsUDHVuy8GPUPmj4ZdGa3FWTfGnsKhWZ4dxqUaGGXk/doge.jpg ]}
Run Code Online (Sandbox Code Playgroud)

每张地图的长度可以不同,具体取决于用户希望购买多少件 T 恤。我不确定如何为此编写规范,以允许每个映射中的键和值的数量发生变化。如果我可以断言每个映射都包含相同数量的键,那也会很有用。

编辑:

当以下内容通过时,规范也应该通过:

{1 BL0-MD0-SU, 0 BL0-SM0-SU, 2 BL0-LG0-SU}
{0 [https://gateway.pinata.cloud/ipfs/QmcLjsUDHVuy8GPUPmj4ZdGa3FWTfGnsKhWZ4dxqUaGGXk/doge.jpg ], 1 [https://gateway.pinata.cloud/ipfs/QmcLjsUDHVuy8GPUPmj4ZdGa3FWTfGnsKhWZ4dxqUaGGXk/doge.jpg ], 2 [ ]}
Run Code Online (Sandbox Code Playgroud)

testing specifications clojure leiningen clojure.spec

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

如何在 Clojure 中创建泛型类型的 Java 对象?

Clojureempty改变了 Java 集合的类型。例如一个JavaParser MethodCallExpr物体mce

(type (.getArguments mce))
;; => com.github.javaparser.ast.NodeList
(type (emtpy (.getArguments mce)))
;; => nil
(type (into (empty (.getArguments mce)) (.getArguments mce)))
;; => clojure.lang.PersistentList
Run Code Online (Sandbox Code Playgroud)

(.setArguments mce ???)需要???是 a NodeList<Expression>,那么如何???在 clojure 中创建一个对象呢?

谢谢!

clojure javaparser

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

为什么reduce不会导致clojure中的堆栈溢出?

假设您有以下代码:

(reduce + 1 (range 1 13000))
Run Code Online (Sandbox Code Playgroud)

这是否不会导致堆栈溢出,因为它没有优化尾部调用?或者说reduce类似于循环?

clojure

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

with-open 宏在 clojure 中的幕后作用是什么?

从视觉上看,with-open看起来类似于let。我知道 with-open 是有不同的目的,但我找不到关于正在with-open做什么的明确答案。并且,with-open 中的第一个参数是什么?

文档是这样说的:

“bindings => [name init ...] 评估 try 表达式中的主体,其中名称绑定到 inits 的值,以及以相反顺序对每个名称调用 (.close name) 的 finally 子句。”

我不明白。如果有人解释 with-open 的实际用途,我将不胜感激?

clojure

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

如何在使用 metosin 进行 json 解组时仅将 key-decode-fn 应用于顶级键

我有一个只能解码密钥的要求。

考虑下面的例子 -

(require '[jsonista.core :as json])
(import
 (com.fasterxml.jackson.core JsonFactory$Feature)
 (com.fasterxml.jackson.databind ObjectMapper)
 (com.fasterxml.jackson.datatype.joda JodaModule))

(def s "{\"name\":\"person1\",\"book\":\"Demo Book\",\"hash\":{\"key1\":\"value1\",\"key2\":\"value2\",\"key3\":\"value3\"}}")

(def ^ObjectMapper object-mapper
  (let [obj-mapper (json/object-mapper {:decode-key-fn true :modules [(JodaModule.)]})]
    (doto obj-mapper
      (-> .getFactory (.disable JsonFactory$Feature/USE_THREAD_LOCAL_FOR_BUFFER_RECYCLING)))
    obj-mapper))

(json/read-value s object-mapper)
Run Code Online (Sandbox Code Playgroud)

我想得到的输出是

{:book "Demo Book", :name "person1", :hash {"key3" "value3", "key2" "value2", "key1" "value1"}}
Run Code Online (Sandbox Code Playgroud)

在上面的 json 中,顶层被转换为键,嵌套不会转换为键,而是保留为字符串。

:decode-key-fn true使所有键和没有:decode-key-fn true所有键都是字符串,这不是我想要的。我怎样才能达到同样的效果?

clojure

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

如何打印所需的命名空间?

我需要命名空间,我可以使用它:

(ns core
  (:require [hello :as h]))

(println h/x)
Run Code Online (Sandbox Code Playgroud)

但为什么我不能只打印名称空间?

(println h) # Unable to resolve symbol: h in this context 
Run Code Online (Sandbox Code Playgroud)

我用 deps-tools 和 leiningen 尝试过这个

clojure

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