Clojure выдает ошибку только при использовании пространства имен - PullRequest
0 голосов
/ 20 апреля 2011

Я начал работать над игрой в шахматы в Clojure, но у меня проблемы с пространством имен. Вверху моего файла у меня есть

(ns chess.core
    (:require clojure.contrib.str-utils2))

, а также определяют несколько функций, в том числе to-string, которые превращают символ игровой фигуры в строку. Однако, когда я компилирую:

core.clj:21:8:
  error: java.lang.Exception: Unable to resolve symbol: to-string in this context (core.clj:21)

Я провел некоторые эксперименты и обнаружил, что при первом вызове функции, которую я определил сам, я получаю сообщение об ошибке. Я также обнаружил, что я обычно не получаю сообщение об ошибке, если закомментирую вызов ns. Иногда это можно исправить, перезапустив сервер Swank (а иногда нет). Некоторое время у меня был (ns chess.core), который выдавал ту же ошибку, поэтому я закомментировал ее и продолжил взлом. Но теперь мне нужно что-то в верхнем регистре, поэтому мне нужны str-utils.

Говоря о str-utils, я использую Leiningen, и у меня есть следующее в project.clj под :dependencies:

                 [org.clojars.jhowarth/clojure-contrib "1.2.0-RC3"]]
;                [clojure.contrib.str-utils2 "1.2.1"]]

Верхний работает, нижний - нет.

Поэтому я чувствую, что просто не знаю, как работают пространства имен и библиотеки Clojure, но в то же время все остальные, похоже, успешно используют (ns foo.bar).

Ответы [ 2 ]

0 голосов
/ 20 апреля 2011

Трудно сказать, не видя, как вы используете функцию to-string, но вы можете проверить это объяснение того, как require, ns и use работают: http://blog.8thlight.com/articles/2010/12/6/clojure-libs-and-namespaces-require-use-import-and-ns. Это захватываетвещи, которые лично меня смущают в библиотеках и пространствах имен.

0 голосов
/ 20 апреля 2011

При компиляции определения оцениваются сверху вниз. Если вы обратитесь к функции, которая определена позже в файле, вы получите эту ошибку. Я думаю, что, удалив ns сверху, вы фактически ссылаетесь на функцию с тем же именем в другом пространстве имен (вероятно, пользователь ns по умолчанию).

Если вы не можете переместить функцию выше первого ее использования, вы можете сделать (declare to-string) вверху и определить ее позже.

Что касается пакета str-utils2, он должен быть уже в clojure-contrib 1.2X. Начиная с версии 1.3 (которая еще не закончена), contrib будет разделен. Смотри http://groups.google.com/group/clojure/msg/c5cdfec990efb6f4

...