tôi là một người mới Clojure tương đối đã trải qua bài tập chính xác này một lúc trước. Một cái gì đó để xem xét ở đây là liệu bạn có muốn tuân thủ chặt chẽ nhất có thể với mã Norvig hay không (như viết "Clojure có hương vị thường gặp-Lisp) hoặc nếu bạn muốn viết một cái gì đó gần gũi hơn với Clojure thành ngữ. Dưới đây là những gì tôi đã làm:
(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 là đường cho phép bạn thêm docstrings vào vars một cách tự nhiên hơn. Trong trường hợp này, tôi đang sử dụng một bản đồ (các cặp khóa giá trị được giới hạn bởi {}) để tra cứu kiểu từ điển từ LHS của từng quy tắc đến RHS. Tôi cũng đang sử dụng vectơ (được giới hạn bởi []) thay vì danh sách để thể hiện RHS của từng quy tắc. Nói chung, mã Clojure "thành ngữ" hiếm khi sử dụng danh sách để giữ dữ liệu tuần tự; vectơ được ưu tiên trừ khi bạn đại diện cho các biểu mẫu Clojure (mã nguồn).
Những loại thay đổi này sẽ cho phép bạn sử dụng nhiều sức mạnh tích hợp của ngôn ngữ thay vì ví dụ: phải viết các hàm trợ giúp nhỏ để thao tác danh sách lồng nhau.
Nguồn
2011-01-01 03:50:29
Tôi không biết Clojure, nhưng nó không trích dẫn danh sách các chữ theo cùng một cách? Chỉ cần thay đổi 'defparameter' thành' def'. Dường như docstrings được cung cấp theo một cách khác, mặc dù, và tôi không chắc chắn về điều đó ... – Ken
Nhìn vào http://norvig.com/paip/simple.lisp, đó là nguồn cho mã của bạn, nó * xuất hiện * rằng -> không được sử dụng trong mã thực tế, nhưng hoạt động như đường cú pháp cho danh sách các danh sách ở trên đó. –
Tôi đã thực hiện một số paip trong clojure (nhiều hơn đến) https://github.com/nickik/ParadigmsOfAIProgramming – nickik