2

私は clojurescript を使い始めたばかりで、多くの疑問があります。私がやりたいことは、基本的な問題を解決するためだけに clojurescript を使用することです。今のところ、Web とは関係ありません。

Web 開発の部分を削除すると、Clojure と ClojureScript でのコーディングに違いはありますか? それともまったく同じですか?

また、コマンドcat DATA.lst |を使用できるかどうか疑問に思っていました。clj program.cljsで clojurescript コードを実行するには? それともコンパイラが違うのですか?もしそうなら、どうすればclojurescriptコードをコンパイルできますか

公式ページに関しては、非常に限定された hello world ! が表示されます。次の行は、clojurescript をコンパイルするコマンドとしてページによって配信されます。

clj --main cljs.main --compile hello-world.core --repl

  1. --repl コマンドを使用した場合にのみ出力されます。これを削除すると、コンソールは結果の出力を停止します。問題は、出力されるものが非常に異なることです。 clojure cat DATA.lst のコマンド | clj プログラム.cljs

  2. それは完全に Web 指向であるため、常にブラウザーで開いて、そのトピックに関連する何かを表示していますが、これは私の場合とは関係ありません。

  3. コードを実行する方法を知りたいので、clojure ではなく clojurescript 用にコンパイルされていることを確認します (それらが異なる場合)。

  4. ページを公開する複雑なプロジェクト ツリーを作成する必要があります。または、単純な方法でフォルダーに残すことができます。(これは私がclojureで作業する方法です)?

  5. コンパイルしようとしているコードは以下のとおりです。簡単です。標準入力を読み取って、最後に必要な情報を処理するだけです

(defn get-data []
  (let [input-string (read-line)]
    (lazy-seq
      (if (seq input-string)
          (cons (clojure.string/split input-string #" ") (get-data))
          nil))))

(defn get-mod [data]
  (lazy-seq
    (if (seq data)
        (cons (map (fn [x] (rem (Integer. x) 12)) (first data))
          (get-mod (rest data)))
        nil)))

(defn main []
  (def data (rest (get-data)))
  (def module (get-mod data))
  (println module))

公式の clojure スクリプト ページを提供するコード行を使用すると、ターミナルで vscode が提供するものは次のとおりです。

WARNING: When invoking clojure.main, use -
ClojureScript 1.10.758
cljs.user=> 33
cljs.user=> 50
57
54
69
cljs.user=> 72
80
68
56
63
cljs.user=> 47
71
40
56
59
52
cljs.user=> 74
59
78
66
cljs.user=> 74
62
94
82
77
cljs.user=> 50
66
57
54
cljs.user=> 68
72
63
44
56
cljs.user=> 60
48
79
75
63
cljs.user=> 67
51
58
cljs.user=> 66
78
51
60
54
cljs.user=> 56
52
49
25
61
cljs.user=> 36
53
45
48
cljs.user=> 58
61
42
49
54
cljs.user=> 76
80
68
68
60
cljs.user=> 63
58
54
51
58
cljs.user=> 42
50
54
54
58
cljs.user=> 50
59
54
62
66
54
cljs.user=> 65
41
61
49
56
cljs.user=> 27
48
43
55
cljs.user=> 35
43
35
47
28
cljs.user=> 49
44
52
32
44
cljs.user=> 74
58
65
70
53
cljs.user=> 52
56
40
60
52
cljs.user=> 54
69
69
62
cljs.user=> 52
49
56
76
cljs.user=> 58
66
50
70
50
cljs.user=> 82
70
73
77
70
cljs.user=> 56
51
63
35
cljs.user=> 59
67
52
71
79
cljs.user=> 72
72
76
84
57
cljs.user=> 66
61
58
61
cljs.user=> 49
32
52
32
cljs.user=> 64
33
52
64
49

これは、標準入力に入力した情報とまったく同じです。つまり、コードが指示することは何もしませんでした。配信する必要があるのは次のとおりです。

((2 9 6 9) (0 8 8 8 3) (11 11 4 8 11 4) (2 11 6 6) (2 2 10 10 5) (2 6 9 6) (8 0 3 8 8) (0 0 7 3 3) (7 3 10) (6 6 3 0 6) (8 4 1 1 1) (0 5 9 0) (10 1 6 1 6) (4 8 8 8 0) (3 10 6 3 10) (6 2 6 6 10) (2 11 6 2 6 6) (5 5 1 1 8) (3 0 7 7) (11 7 11 11 4) (1 8 4 8 8) (2 10 5 10 5) (4 8 4 0 4) (6 9 9 2) (4 1 8 4) (10 6 2 10 2) (10 10 1 5 10) (8 3 3 11) (11 7 4 11 7) (0 0 4 0 9) (6 1 10 1) (1 8 4 8) (4 9 4 4 1))
4

2 に答える 2

1

Clojure は Java 仮想マシン上で動作する言語です。ClojureScript は外観と機能が類似した言語ですが、JavaScriptにコンパイルされており、NodeJS や Web ブラウザーの JS エンジンなどの JavaScript ランタイムで実行されます。これらは異なるランタイムを対象としているため、ここで説明されている違いがあります: https://www.clojurescript.org/about/differences

のような関数readlineは ClojureScript では使用できないため、JS 相互運用機能を使用して独自のイベント ハンドラーを作成する必要があります。core.async ライブラリなどを使用して、入力をブロックして待機するノードのコードを作成できますが、初心者レベルをはるかに超えています。

あなたのコードは実際にはClojureで動作するように見えるので、Nodeに固執してJVMを避ける何らかの理由がない限り、利用可能なすべてのリソースで言語を学ぶためにプレーンなClojureに固執します.

標準入力から入力された数値を合計する簡単なプロジェクトとプログラムの例を次に示します。

プロジェクトの構造は次のとおりです。

.
├── data.txt
└── src
    └── demo
        └── core.clj

メインプログラム:

(ns demo.core)

(defn -main [& args]
  (loop [total 0]                  ;; initialize a total sum to 0
    (if-let [line (read-line)]     ;; keep any input as `line`, otherwise else branch
      (let [n (read-string line)]  ;; parse `line` to number
        (recur (+ n total)))       ;; loop, 'updating' the total
      (println total))))           ;; else branch: no input, print the total so far

データファイルdata.txt:

11
22
33

...そして最後に実行例:

 cat data.txt | clj -m demo.core
WARNING: When invoking clojure.main, use -M
66
于 2020-10-11T02:09:33.037 に答える