Атрибутика двусмысленности в Clojure - PullRequest
3 голосов
/ 22 октября 2010

В документации для специальных форм Clojure (http://clojure.org/special_forms) пример для :pre и :post выглядит следующим образом:

(defn constrained-sqr [x]
    {:pre  [(pos? x)]
     :post [(> % 16), (< % 225)]}
    (* x x))

Как Clojure может определить, является ли карта, содержащая метаданные, определением функции? Разве метаданные не должны предшествовать вектору params? Согласно документации для defn (http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/defn), синтаксис

(defn name doc-string? attr-map? [params*] body)

с attr-map? перед вектором параметров. Разве это не правильно:

(defn constrained-sqr
    {:pre  [(pos? x)]
     :post [(> % 16), (< % 225)]}
    [x]
    (* x x))

Должен ли я подать отчет об ошибке или я неправильно его прочитал?

Извините, что забрал гниды.

1 Ответ

5 голосов
/ 22 октября 2010

Карта должна следовать за вектором аргументов, потому что это зависит от аргументов.И вы можете иметь несколько функциональных тел с разными арностями.Двусмысленность довольно проста: карта - единственная вещь в теле, это возвращаемое значение.Если бы после этого было что-то еще, карта была бы выброшена.Затем добавьте его в метаданные.Это очень простая и довольно простая эвристика, которая не должна конфликтовать ни с одним рабочим кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...