我已经完全是 recurse 的形状了, 有老哥 Clojure 玩的比较六的么?

2022-07-08 02:19:11 +08:00
 ca1123

希望能有偿咨询一下, 虽然这是我写的最顺的语言, 但还是有很多问题. 希望找人交流一下.

2941 次点击
所在节点    程序员
26 条回复
rpman
2022-07-08 02:34:10 +08:00
写 ClojureScript 的给你顶一下 🐶
wdv2ly
2022-07-08 07:47:23 +08:00
来我司入职吧🐶后端唯一指定开发语言
ymmud
2022-07-08 08:15:04 +08:00
感觉 clojure 的热度大不如前
HENQIGUAI
2022-07-08 09:08:24 +08:00
我记得 Leancloud 好像挺喜欢 Clojure 的
ca1123
2022-07-08 09:17:59 +08:00
@rpman 我是搞不定前端, burn-out 的太快了.
ca1123
2022-07-08 09:18:30 +08:00
@HENQIGUAI 有所耳闻
ca1123
2022-07-08 09:22:21 +08:00
@ymmud lisp 这种描述操作过程的, 和现在流行的统计学习这一套确实不搭. 不过手写 AST 可以最大限度同态于自己的思维, 以前写 java, js, python, wolframe, matlab, 写着写着就不知道自己在干什么了. clojure 也会晕, 但是看看结构 8 成能想起来当时在干什么. 只要习惯了迭代, 还是很爽的.
ca1123
2022-07-08 09:23:14 +08:00
@wdv2ly 贵司是搞 FinTech 的?
FaiChou
2022-07-08 09:41:32 +08:00
```
(defn interpereter [expr env]
(if (list? expr)
(let [[p1 p2 p3 p4] expr]
(match [p1 p2 p3 p4]

['if pred true-branch false-branch ]
(if (interpereter pred env)
(interpereter true-branch env)
(interpereter false-branch env))

['* arg1 arg2 nil]
(* (interpereter arg1 env) (interpereter arg2 env))

['dec arg nil nil]
(dec (interpereter arg env) )

['zero? param nil nil]
(zero? (interpereter param env))

[func params nil nil]
((interpereter func env) (interpereter params env))

['fn [x] body nil]
(fn [arg]
(interpereter body (fn [y]
(if (= x y)
arg
(env y)))))

:else (assert false (str "未能捕获 list:" expr))))
(match [expr]
[(n :guard symbol?)] (env n)
[(n :guard number?)] n
:else (assert false (str "未能捕获元素:" expr)))))

(interpereter '(((fn [!]
(fn [n]
((! !) n)))
(fn [!]
(fn [n]
(if (zero? n)
1
(* n ((! !) (dec n)))))))
5)
(fn [e] (assert false (str "no such element.." e) )))
```
FaiChou
2022-07-08 09:42:57 +08:00
ymmud
2022-07-08 10:03:55 +08:00
@ca1123 玩过,在公司没法用
zhuangzhuang1988
2022-07-08 10:16:15 +08:00
太动态了 ide 不友好
直接学 F#好还有 Fable 写前端.
ca1123
2022-07-08 10:21:27 +08:00
@FaiChou 写各种求值器是很爽, 我看 Y 组合子的时候, 虽然匿名 recur 起来, 这个能接受, 但是最终的 arg 怎么送进去的, 还是有点蒙古. 感觉你可以整个更吊的, 把 if 也换成丘奇定义 IFTHENELSE := λp.λa.λb.p a b

另外, 我正好问你个问题, 宏展开的时候, 怎么把作为参数的 s-exp 组合到宏的模板里面, 然后再一股脑求值. 而不是把 s-exp 用~解了 syntax quote 以后就不管了.
比如

```
(defmacro println-test [form]
`(println ~form))

(let [form `(+ 3 1)]
(println-test form))

```
我不要
```
(clojure.core/+ 3 1)
=> nil
```

我想要
```
4
=> nil
```

有不用 eval 的办法么, 套两层 defmacro 行么?
ca1123
2022-07-08 10:22:51 +08:00
@zhuangzhuang1988 是的, 已经感觉到了. 但是我觉得我写 java 写着写着就迷失了, 就是因为 ide 指挥我怎么写代码
ca1123
2022-07-08 10:24:58 +08:00
@ymmud 我是野路子出身, 本身是学应用数学的, 对 C 文化有点接受不能.
wdv2ly
2022-07-08 11:59:31 +08:00
@ca1123 游戏公司
Dregs2
2022-07-08 12:21:49 +08:00
@wdv2ly 贵司在哪里呀ʕ•ٹ•ʔ
Dregs2
2022-07-08 12:27:59 +08:00
我之前也研究了好久,好像如果不用 eval 编译评估的话就要手动评估,宏应该只是在编译期生效,对于动态传入的 list 好像没法做到这种效果。
ca1123
2022-07-08 15:04:14 +08:00
@wdv2ly 我本科学物理的
ca1123
2022-07-08 15:14:16 +08:00
@Dregs2 你说的对, 出现在 macro 定义里面的函数当场就求值了, 不会等到运行时. 在 runtime 里面, unquote 的时候, 这个部分处理过了, runtime 就去看别的地方了, 不会关注处理出来的值是不是还要求值, 就不会再处理了, 就相当于一个 quote. 我想要的是先 unquote, 和模板拼好, 然后再求值, 所以应该用 macroexpand-1 和参数上的 unquote 让 runtime 先拼模板, 模板拼好了, 一股脑丢给 eval 就行了. 主要是看别人说 eval 不好, 少用, 但是 eval 能用的特殊情况中其中一个用法就是 runtime 才知道参数内容.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/864802

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX