以前にalength
が働いていたと断言することもできましたが、今何を間違っているのかよくわかりません。
user=> (alength '(1 2 3))
IllegalArgumentException No matching method found: alength clojure.lang.Reflector.invokeMatchingMethod (Reflector.Java:79)
user=> (alength [1 2 3])
IllegalArgumentException No matching method found: alength clojure.lang.Reflector.invokeMatchingMethod (Reflector.Java:79)
user=> (doc alength)
-------------------------
clojure.core/alength
([array])
Returns the length of the Java array. Works on arrays of all
types.
nil
Clojureでリスト/配列の長さを取得するにはどうすればよいですか?
Docstringが言うように、alength
はJava配列(String[]
またはInteger[]
など)で動作します。これは間違いなく、使用したいClojureリストまたはベクターと互換性のない型です count
:
user=> (def x '(1 2 3))
#'user/x
user=> (def xa (to-array x))
#'user/xa
user=> (class x)
clojure.lang.PersistentList
user=> (class xa)
[Ljava.lang.Object;
user=> (alength xa)
3
user=> (alength x)
Java.lang.IllegalArgumentException: No matching method found: alength (NO_SOURCE_FILE:0)
user=> (count x)
3
[Ljava.lang.Object;
は、toString
が 定義済み ネイティブObject
配列の出力に対する奇妙な方法です。
count
を使用してみてください:
(count '(1 2 3))
=> 3
(count [1 2 3])
=> 3
count
でなければなりません。
user=> (count '(1 2 3))
3
これはやり過ぎかもしれませんが、次のようなCommon LISPの長さ関数を模倣できます。
(def length
(fn [lst]
(loop [i lst cnt 0]
(cond (empty? i) cnt
:t (recur (rest i)(inc cnt))))))
あなたは再帰的な方法を使用してそれを行うことができます:
(defn length
[list]
(if (empty? list) 0
(+ 1 (length (rest list)))))
それが役に立てば幸い!