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字符串,该字符串引用了read,其中记录了该内容:(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"}}}'

程序还有一些问题...
实验中...
 
我在分解它
这可行
(打印(吸取(字符串“https://ipinfo.io/" ip "/json")))

但是当我创建一个函数时,似乎无法正确传递IP地址
(定义mytest [ip]
(打印(吸取(字符串“https://ipinfo.io/" ip "/json"))))

mytest 24.80.129.110
对象[my_namespace$mytest 0x2e8a1ab4 "my_namespace$mytest@2e8a1ab4"]
在(REPL:18:0)处读取源时发生语法错误。
无效的数字:24.80.129.110

mytest "24.80.129.110"
对象[my_namespace$mytest 0x2e8a1ab4 "my_namespace$mytest@2e8a1ab4"]
"24.80.129.110"
by
Clojure中的函数调用始终需要用括号包裹,并且IP地址必须是一个字符串才能作为有效值,所以

(mytest "24.80.129.110")
by
OMG!我简直不敢相信我做了那件事!
谢谢!
...