Организация кода Clojure - PullRequest
10 голосов
/ 16 июля 2009

У меня есть программа, которая рисует фигуры на изображении. У меня есть отдельное пространство имен для каждой фигуры, и они находятся в отдельных файлах.


com / name / box.clj -> имеет пространство имен com.name.box.
com / name / triangle.clj -> имеет пространство имен com.name.triangle.

Все они имеют общую функцию generate, которая рисует их на экране, поэтому если я использую use, имена функций конфликтуют.

На данный момент я загружаю их с load-file. Есть ли лучший способ сделать это? Просматривая API Clojure, кажется, что есть несколько способов включения файлов. Какой вариант лучше для проекта с большим количеством файлов?

Ответы [ 2 ]

9 голосов
/ 16 июля 2009

Я тоже начал с использования load-file. Согласно документации Clojure для библиотек ,

Clojure определяет соглашения для именования и структурирования библиотек:
* Имя lib - это символ, который обычно содержит две или более частей, разделенных точками.
* Контейнер библиотеки - это ресурс Java, путь относительно класса которого получен из имени библиотеки:
о путь является строкой
o Точки в имени библиотеки заменяются косыми чертами в пути
o Дефисы в имени библиотеки заменяются подчеркиванием в пути.
o Путь заканчивается на ".clj"
* Библиотека начинается с формы "ns", которая
o создает пространство имен Clojure, которое разделяет его имя, и
o объявляет свои зависимости от классов Java, основных возможностей Clojure и / или других библиотек

Документация Clojure также предоставляет следующий пример объявления пространства имен (которое, я уверен, вы уже знаете, но я предоставляю его здесь для полноты):

(ns com.my-company.clojure.examples.my-utils
  (:import java.util.Date)
  (:use [clojure.contrib.def :only (defvar-)])
  (:require [clojure.contrib.shell-out :as shell]))

Итак, мой ответ - использовать libs для вашего проекта - это поможет упростить все эти папки. Чтобы «включить» библиотеку, вы будете использовать require, например:

(require 'clojure.contrib.def 'clojure.contrib.except 'clojure.contrib.sql)
(require '(clojure.contrib def except sql))

Пока документация верна и ваш проект относится к classpath, все должно с удовольствием загружаться. Надеюсь это ответит на твой вопрос. : D

6 голосов
/ 16 июля 2009

Наряду с использованием библиотек пространства имен, как уже было предложено, возможно, ваша обычная функция 'generate' является кандидатом на мультиметод? http://clojure.org/multimethods

Это поможет избежать столкновения имен функций и добавить общую абстракцию к вашим «фигурам», я думаю, это зависит от того, найдена ли соответствующая функция диспетчеризации.

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