首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将一段Lisp代码移植到Clojure (PAIP)

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

Stack Overflow用户
提问于 2010-12-31 22:48:42
回答 2查看 1.5K关注 0票数 11

我正在阅读Peter的人工智能编程(PAIP)的范例,我正在尝试用code而不是通用的Lisp编写所有的代码。然而,我仍然停留在第39页的代码上:

代码语言:javascript
复制
(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?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-01 03:50:29

一段时间前,我是一位相关的Clojure新手,做过这个练习。这里要考虑的是,您是否希望尽可能严格地遵守Norvig的代码(比如编写“Common风味”Clojure),或者是否希望编写一些更接近习惯Clojure的代码。我所做的是:

代码语言:javascript
复制
(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添加docstring。在本例中,我使用一个映射(由{}分隔的键值对)从每个规则的LHS到RHS进行字典式查找。我还使用向量(由[]分隔)代替列表来表示每条规则的RHS。一般来说,“惯用”Clojure代码很少使用列表来保存顺序数据;除非表示Clojure表单(源代码),否则向量是首选的。

这些类型的更改将允许您使用语言的更多内置功能,而不需要编写小助手函数来操作嵌套列表。

票数 12
EN

Stack Overflow用户

发布于 2010-12-31 23:31:01

Ken是对的,只是对def*窗体做了一些简单的更改,以及一种不同的docstring风格(函数定义中的docstring比普通的vars要简单一些):

代码语言:javascript
复制
(def ^{:doc "A grammar for a trivial subset of English."} 
  *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)))

(def *grammar* *simple-grammar*)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4572608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档