将一段 Lisp 代码移植到 Clojure (PAIP)

我正在阅读 Peter Norvig 撰写的 人工智能编程范式 (PAIP),并且尝试用 Clojure 而不是 Common Lisp 编写所有的代码。然而,我被第 39 页上的这段代码卡住了:

(defparameter *simple-grammar*  '((sentence -> (noun-phrase verb-phrase))   (noun-phrase -> (Article Noun))   (verb-phrase -> (Verb noun-phrase))   (Article -> the a)   (Noun -> man ball woman table)   (Verb -> hit took saw liked))  "A grammar for a trivial subset of English.") (defvar *grammar* *simple-grammar*)

我该如何将其翻译成 Clojure?谢谢。


回答:

我是一个相对的 Clojure 新手,前段时间也做了完全一样的练习。这里需要考虑的是,你是否想尽可能地坚持 Norvig 的代码(就像编写 “具有 Common-Lisp 风味” 的 Clojure),或者你是否想编写更接近惯用的 Clojure 代码。这是我所做的:

(use '[clojure.contrib.def :only [defvar]])(defvar *simple-grammar*   {:sentence [[:noun-phrase :verb-phrase]]   :noun-phrase [[:Article :Noun]]   :verb-phrase [[:Verb :noun-phrase]]   :Article ["the" "a"]       :Noun ["man" "ball" "woman" "table"]   :Verb ["hit" "took" "saw" "liked"]}  "A grammar for a trivial subset of English.")

defvar 是一种语法糖,允许你更自然地向 vars 添加文档字符串。 在这种情况下,我使用一个 map(由 {} 分隔的键值对)来获得从每个规则的 LHS 到 RHS 的字典式查找。 我还使用 vectors(由 [] 分隔)而不是列表来表示每个规则的 RHS。 一般来说,“惯用的” Clojure 代码很少使用列表来保存顺序数据; 除非您正在表示 Clojure 形式(源代码),否则首选 vectors。

这些类型的更改将允许你使用更多语言的内置功能,而无需例如编写一些辅助函数来操作嵌套列表。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注