2012-02-26 2 views
2

Это сообщение блога (http://williamedwardscoder.tumblr.com/post/18319031919/programming-language-readability) содержит реализацию автозаполнения в Haskell и Python для сравнения читаемости языков программирования.Как реализовать пример автозаполнения в Clojure?

Любопытно узнать, как реализовать то же самое в Clojure. Будет ли код Clojure более читабельным из-за его большей способности абстракции?

+0

Почему бы вам не попробовать? –

+0

Я только на пятый день обучения Clojure. Это слишком много для меня. Ответ будет полезен для моего обучения. Заранее благодарим за тех, кто отвечает кодами. – jemeshsu

ответ

4

Минималистская реализация:

(ns trie.example) 

(defn trie-add [trie & words] 
    (reduce 
    (fn [trie word] 
    (assoc-in trie (concat word [::val]) word)) 
    trie 
    words)) 

(defn trie-matches [trie prefix] 
    (letfn [(search [node] 
      (mapcat (fn [[k v]] 
         (if (= ::val k) [v] (search v))) 
        node))] 
    (search (get-in trie prefix)))) 

Пример использование:

;; Create trie 
(def trie (trie-add {} "foo" "ba" "bar" "baz" "qux" "quux")) 

;; trie looks like this: 
{\q 
{\u 
    {\u {\x {:trie.example/val "quux"}}, 
    \x {:trie.example/val "qux"}}}, 
\b 
{\a 
    {\z {:trie.example/val "baz"}, 
    \r {:trie.example/val "bar"}, 
    :trie.example/val "ba"}}, 
\f {\o {\o {:trie.example/val "foo"}}}} 

;; Autocomplete 
(trie-matches trie "ba") 
=> ("baz" "bar" "ba") 

вещь, как сортировка, хранение значений без слов, и сжатие в качестве упражнения для читателя.

Смежные вопросы