3

clojureのリスト、クラス、変数に関していくつか質問があります。

  1. これはかなりばかげているように見えるかもしれませんが、リスト内の要素にアクセスするにはどうすればよいですか?

私はあなたが電話帳を操作できるようにするプログラムをコーディングしています。エントリを追加したり、削除したり、情報を印刷したりできます。これは私に2つの質問につながります:

  1. 「name」「adress」「phonenumber」変数を含むクラス「entry」を作成する方法はありますか?または、clojure(および一般的な関数型プログラミング)では不可能ですか?その情報を含むオブジェクトのリストを取得できない場合、このタスクをどのように実行しますか?

  2. ユーザーの入力を読み取ってユーザーが何をしたいのか(エントリの追加、エントリの削除、情報の印刷)を知り、適切な関数を呼び出して、実行時に最初の関数を呼び出す関数を作成することを考えていました。各関数へのエントリのリストをパラメータとして渡すのは正しいことですか?

4

4 に答える 4

7

これはかなりばかげているように見えるかもしれませんが、リスト内の要素にアクセスするにはどうすればよいですか?

(nth coll index)

例えば:

(nth [1 2 3 4] 2) ; -> 3 (since it uses zero-based indexing)

「name」「adress」「phonenumber」変数を含むクラス「entry」を作成する方法はありますか?または、clojure(および一般的な関数型プログラミング)では不可能ですか?その情報を含むオブジェクトのリストを取得できない場合、このタスクをどのように実行しますか?

Clojureで可能ですが、一義的です。Clojureでは、データエンティティの基本的な抽象化はクラスではなくマップです(Javaフレームワークとの直接の相互運用が必要な一部のコーナーケースを除く)。したがって、マップを使用するだけです。

(def entry {:name "x" :address "y" :phone-number "z"})

アイテムの名前にアクセスするには、次のいずれかを使用します

(:name entry)

また

(get entry :name)

前者はマップのキーがキーワードである場合にのみ機能し、後者はすべてのタイプのキーで機能します。

したがって、あなたの例では、データモデル(電話帳)はそのようなマップのシーケンス(たとえば、リストまたはベクトル)になります。

ユーザーの入力を読み取ってユーザーが何をしたいのか(エントリの追加、エントリの削除、情報の印刷)を知り、適切な関数を呼び出して、実行時に最初の関数を呼び出す関数を作成することを考えていました。各関数へのエントリのリストをパラメータとして渡すのは正しいことですか?

モデルは1つの主要なデータ構造(電話帳seq)のみで構成されているため、それをargとして渡すことは、関数を設計するための適切な方法です。より多くの種類のトップレベルコンテナがあると予想される場合(つまり、より現実的なアプリケーションの場合)、最初は少し威圧的に見えるアプリケーションコンテキストパターンを調べることをお勧めします(少なくとも私にとってはそうでしたが、 Clojure固有の専門用語がたくさん含まれていますが、学ぶ価値は十分にあります。

于 2009-07-13T05:09:50.707 に答える
5

プログラミングClojureの本を購入することを検討しましたか?PDF版はたったの21ドルです。私の意見ではお金の価値は十分にあります。

于 2009-07-12T20:15:47.497 に答える
2
(entry :name)

マップにアクセスするときにも機能します。したがって、キーワードを使用してマップの要素にアクセスするには、次の3つの方法があります。

(entry :name)

また

(:name entry)

また

(get entry :name)

どこ

(def entry {:name "x" :address "y" :phone-number "z"})

Rayneが述べたように、2番目の形式は、キーがキーワードである場合にのみ可能です。他のタイプのキーで他の「短い」形式を使用できます。

user=>(def my-map {"a" "b" "c" "d"})
user=>(my-map "c")
"d"
user=>(get my-map "a")
"b"
于 2009-07-13T14:13:04.117 に答える
1

質問のパート1で、(nth ...)を使用してリスト内のアイテムにアクセスする場合は、ベクトルの使用を検討できます。ベクトルは他の言語の配列とは異なります。たとえば、数値のインデックス付けに加えて、それらを切り刻んで最後に新しい要素を追加することも効率的です。内部的には、配列は実際にはマップと非常によく似ています。

すべての配列の中で最も優れているのは、インデックスの関数です。

(def a [1 2 3 4])
 (a 2)==> 3

パート2と3については、pmfの回答がそれらを非常にうまくカバーしています。

于 2009-07-15T00:22:34.020 に答える