2024 Clojure 状态调查! 中分享您的想法。

欢迎!请查看关于页面,了解如何使用本网站的一些更多信息。

0 投票
命名空间和变量

我对 Clojure 完全新手,我正尝试使用 Slurp 和 JSON 来做一些基本操作。

我找到了一些代码(不起作用),我将它用作示例,尝试了解一些基础知识。
以下代码原本是用来从 Ipinfo.io 获取一些 JSON 数据,然后从中提取城市名称并打印出来。
我在命名空间中遇到了许多错误,以至于我甚至无法测试实际的代码。:-(`

任何帮助都将非常感谢!:-)
Jason

(ns my-namespace

(:require [clojure.core :as core]
			[clojure.data.json :as json]))

(defn get-city [ip-addr]

(let [resp (core/slurp (str "https://ipinfo.io" ip-addr "/json"))
	city-name (->> resp 
			(json/read-str)
			:city)]
(core/prn city-name)
city-name))

1 答案

0 投票

你几乎已经完成!只需注意以下几点

  1. 你不需要require clojure.core,在每个命名空间中都默认加载,所以只需要

    (ns my-namespace (:require [clojure.data.json :as json]))

就足够了。

  1. 你似乎缺少了主机名后的斜杠。

  2. data.json默认会将JSON作为字符串键读取,所以上述所有操作都有效,除了:city部分。在Clojure中,使用REPL与数据交互并逐步进行工作很有帮助——这样你可以快速看到read-str返回了一个带字符串键的映射。

  3. 要查找该函数的文档,使用(doc json/read-str)查看doc字符串,它指向了doc json/read中记录的代码。有一个:key-fn选项,默认是identity,但你也可以使用keyword函数来构造关键字键。一旦这样做,你想使用->而不是->>来连接第一元素。

综合起来

(ns my-namespace
  (:require [clojure.data.json :as json]))

(defn get-city [ip-addr]
  (let [resp (slurp (str "https://ipinfo.io/" ip-addr "/json"))
        city-name (-> resp 
                      (json/read-str :key-fn keyword)
                      :city)]
    city-name))
尝试了,但仍然得到ns错误。这是错误信息...

user=> (ns my-namespace (:require [clojure.data.json :as json]))
执行错误(FileNotFoundException)在 my-namespace/eval138$loading(REPL:1)。
无法在类路径中定位 clojure/data/json__init.class, clojure/data/json.clj 或 clojure/data/json.cljc。
此代码需要在类路径上使用 data.json 库。依赖信息可在 https://github.com/clojure/data.json/#releases-and-dependency-information 找到,但需要更多关于您如何启动 repl 的信息,才能知道如何添加它。
我刚刚使用 clj 启动了 repl。
我可能需要使用 lein。
好的!通过使用以下命令启动 clj 运行它:
clj -Sdeps '{:deps {org.clojure/data.json {:mvn/version "2.4.0"}}}'

程序还有一些问题...
实验中...
我在分解它
这可行
(print (slurp (str "https://ipinfo.io/" ip "/json"))))

但似乎我创建函数时无法正确传入IP地址
(defn mytest [ip]
(print (slurp (str "https://ipinfo.io/" ip "/json")))) )

mytest 24.80.129.110
#object[my_namespace$mytest 0x2e8a1ab4 "my_namespace$mytest@2e8a1ab4"]
在(REPL:18:0)处读取源代码时出现语法错误。
无效数字:24.80.129.110

mytest "24.80.129.110"
#object[my_namespace$mytest 0x2e8a1ab4 "my_namespace$mytest@2e8a1ab4"]
"24.80.129.110"
Clojure中函数的调用始终涉及包围在括号中,并且IP地址必须是一个字符串才能成为有效的值,所以

(mytest "24.80.129.110")
OMG!我无法相信自己做了这件事!
谢谢了!
...