10

画像に形を描くプログラムがあります。形状ごとに個別の名前空間があり、それらは個別のファイルにあります。


com / name/box.clj->にはcom.name.box名前空間があります。
com / name/triangle.clj->にはcom.name.triangle名前空間があります。

それらはすべて、画面上に描画するgenerateと呼ばれる共通の関数を共有しているため、を使用するuseと、関数名が衝突します。

今のところ、私はそれらをロードしますload-file。これを行うためのより良い方法はありますか?Clojure APIを見ると、ファイルを含める方法は複数あるようです。たくさんのファイルがあるプロジェクトに適したオプションはどれですか?

4

2 に答える 2

9

私も。を使って始めましたload-filelibsに関するClojureのドキュメントによると、

Clojureは、libの命名と構造化の規則を定義します。
    * lib名は、通常、ピリオドで区切られた2つ以上の部分を含むシンボルです。
    * libのコンテナはJavaリソースであり、そのクラスパス相対パスはlib名から派生しています。o
        パスは文字列です
        。olib名のピリオドはパスのスラッシュに置き換えられます
        。olib名のハイフンは下線に置き換えられます。パス
        oパスは".clj"で終わります
    *libは"ns"形式で始まり、
        o名前を共有するClojure名前空間を作成し、
        o Javaクラス、Clojureのコア機能、および/または他のlibへの依存関係を宣言します

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を使用することです。これは、これらすべてのフォルダーを単純化するのに役立ちます。libを「含める」には、次のようにrequireを使用します。

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

ドキュメントが正しく、プロジェクトがクラスパスに相対的である限り、すべてが正常に読み込まれるはずです。それがあなたの質問に答えることを願っています。:D

于 2009-07-16T03:04:06.030 に答える
6

すでに提案されているように名前空間ライブラリを使用することに加えて、おそらくあなたの一般的な「生成」関数はマルチメソッドの候補ですか?http://clojure.org/multimethods

これは、関数名の衝突を回避し、「形状」に共通の抽象化を追加するのに役立ちます。適切なディスパッチ関数が見つかるかどうかによって異なります。

于 2009-07-16T04:55:47.523 に答える