Clojurescript第一步解决疑问和问题

如何解决Clojurescript第一步解决疑问和问题

我刚开始使用clojurescript,但我有很多疑问,我想做的只是使用clojurescript解决基本问题,目前与网络无关。

如果我取消了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 program.cljs

  2. 它完全是面向网络的,因此一直在浏览器中打开并显示与该主题相关的内容,这与我的情况无关。

  3. 我想知道如何执行我的代码,以便确保可以为clojurescript而不是clojure(如果它们不同)进行编译

  4. 有必要创建一个暴露页面的复杂项目树,否则我可以通过一种简单的方法将其放在文件夹中。 (这就是我使用clojure的方式)?

  5. 我要编译的代码是下面的代码,它很简单,我只读了stdin并按需要的方式处理了信息

(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

与我在stdin中输入的信息完全相同,也就是说,它没有执行我的代码所规定的内容,应该提供以下信息:

((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))

解决方法

Clojure是在Java虚拟机上运行的一种语言。 ClojureScript在外观和功能上是类似的语言,但已编译为 JavaScript ,并将在JavaScript运行时(例如NodeJS或Web浏览器中的JS引擎)上运行。由于它们针对不同的运行时,因此存在差异,请在此处进行说明:https://www.clojurescript.org/about/differences

ClojureScript中不提供诸如readline之类的某些函数,您需要使用JS interop编写自己的事件处理程序,以创建自己的事件处理程序。您可以使用core.async库之类的代码为Node编写阻止和等待输入的代码,但是它已经超出了初学者的水平。

您的代码实际上看起来可以在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
,

听起来您真的想为此项目使用普通Clojure而不是ClojureScript。

除了上面的好答案,您可能对这两个可以帮助您入门的模板项目感兴趣:


更新

您要在CLJS中解决的“基本问题”是什么? 您可以添加更多详细信息吗?

ClojureScript作为一种语言几乎可以完成Clojure可以做的任何事情。最大的区别在于将JVM与浏览器中运行的JavaScript进行比较:

  • JVM可以处理上千个线程。 JS只有1个线程(尽管您可以使用clojure / core.async和/或回调来伪造多个线程)。

  • CLJ具有真实的动态变量(即Clojure var)。 CLJS变量在运行时是静态的。

  • JVM上的I / O不受限制。浏览器和JS并不是用来做磁盘I / O的,而仅限于网络I / O。

  • 请参见clojurescript.org

    中的详细差异列表

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-