104359176
发表于 2016-07-23 12:05
真是学习了,不过我发现用 apply 来传递参数有很大隐患:
apply 会把函数需要的参数传递进去,如果不够,就用nil 代替,但如果传递的列表的参数多于函数的参数,就会出现不可意料的后果。
(apply accept-two-args-func @three-args-array)
==
(accept-two-args-func (apply accept-two-args-func (0 2 @three-args-array)) (last @three-args-array))
所以如果用apply来传递参数,要检查参数的长度,而我提出的解决方案就不存在这个问题,多余的参数会被舍弃。
所以apply 通常用来作为累加或累乘。
104359176
发表于 2016-07-23 12:10
关于lisp的括号多,我有一个看法,虽然括号多了,但其他的符号少了。
perl:if (a > b) { say "a > b"};ruby:if a > b then puts "a > b" endPython 则需要缩进。
所以lisp用括号将其他的大括号,中括号,逗号,分号,关键字都取代了,不但简化了编程模型,而且还容易扩展。
104359176
发表于 2016-07-23 12:15
关于宏,所有语言的宏实现都是一个原理,就是延迟参数的求值。
所有lisp的方言,有一个共同的特点,就是有还没有求值的中间状态的符号。并且有操作符来人为控制它何时求值。
所以,在lisp中,表达式和列表是可以显式的转换。而通常的lisp的所谓专家却刻意模糊表达式和列表的区别。
OwnWaterloo
发表于 2016-07-25 22:52
回复 11# 104359176
比如 cons :
> (list (cons) (cons 1) (cons 1 2) (cons 1 2 3))
(() (1) (1 2) (1 2))
不像+接受任意多个参数, cons最多只接受2个, 多的会忽略。
如果用apply而不是直接传递:
> (apply cons '())
()
> (apply cons '(1))
(1)
> (apply cons '(1 2))
(1 2)
> (apply cons '(1 2 3))
(1 2)
一样的啊。。。 不可意料的结果是啥。。。
关于array。
如果确实是想将array而不是list当作的参数传递给函数, 用array-list转换成list:
> (apply cons (array-list (array 3 '(1 2 3))))
(1 2)
关于@。
这个是想表达个啥意思。。。 "@x" 不是将"x"转换成list或者array或者进行别的什么魔法操作, "@x"是一个symbol哦。。。
> (length "@array-list") ; 这个字符串长度是11, 方便后面对比
11
> (read-expr "@array-list") ; 读取一个expression
@array-list
> $count ; 可以看到整个字符串是被消耗完了的, 一个不剩
11
> (symbol? (read-expr "@array-list")) ; 整个字符串被读取为一个symbol
true
> @array-list ; 默认是没有绑定的
nil
"@three-args-array" 同上:
> (length "@three-args-array")
17
> (read-expr "@three-args-array")
@three-args-array
> $count
17
> (symbol? (read-expr "@three-args-array"))
true
> @three-args-array
nil
不可意料的结果是因为对@理解有误吧。。。?
OwnWaterloo
发表于 2016-07-25 23:17
本帖最后由 OwnWaterloo 于 2016-07-26 19:25 编辑
回复 12# 104359176
这个我自己是同意的。。。
最近。。。 被一个问题问懵逼过。。。
"python 里面 v for h 是什么意思"。。。 纳尼???
https://static.mengniang.org/common/thumb/4/41/Nicky.jpg/250px-Nicky.jpg
最终, 发现代码是这个样子: "d = { k : v for h,v in zip(seq1, seq2) }"
lisp里很少会出现这种“断句”出错的情况。。。
语法就symbol, pair, string, number, ... 可能还会再出现一些, 但不会特别多。。。
语法上没什么magic的地方。。。
然而。。。 这并没有什么卵用。。。 不管是讲道理、 安利、 无脑吹。。。 大多数人看到lisp就是这个样子:
而看到某个语言宣称"我们借鉴C语法"就是这个样子:
OwnWaterloo
发表于 2016-07-25 23:29
104359176 发表于 2016-07-23 12:15 static/image/common/back.gif
关于宏,所有语言的宏实现都是一个原理,就是延迟参数的求值。
关于这个。。。因为涉及到newlisp。。。所以不太好解释。。。
"宏"(macro)这个词在各种lisp里会有一些区别。。。
比如在scheme, common lisp, emacs lisp, clojure里, scheme就和后3者区别很大。
在后3者里面继续细分, clojure又和前两者有所区别。
但是把newlisp放到里面进行对比的话, 首先就是newlisp和其他lisp的区别最显著而会被分出去。。。
比如。。。 你用newlisp写一个if-not宏吧。。。 接受固定的3个表达式, 功能与if相反。
OwnWaterloo
发表于 2016-07-25 23:58
本帖最后由 OwnWaterloo 于 2016-07-26 19:31 编辑
删。。。
104359176
发表于 2016-07-26 01:15
经过测试, apply 确实会将多余的参数自动舍弃, 改变了我顽固看法.不知道是何时有这个错误的看法,也许是某个方言吧.这么看来, 这里还是有很多值得学习的人.
确实学习一个语言越久, 就越来越深的受其影响,只有重新学习另外一门语言的时候,才会发觉.这种改变十分痛苦.我厌恶不同的方言,厌恶不同的语言.
虽然无奈,但还是想改变这种情况,我的理想就是写出一门自己的语言,用自己的语言写代码,解决问题.
OwnWaterloo
发表于 2016-07-26 01:25
回复 26# 104359176
快写个if-not啊。。。 写了就会知道自己受newlisp影响多深:luya:
send_linux
发表于 2016-07-26 09:04
OwnWaterloo 发表于 2016-07-26 01:25 static/image/common/back.gif
回复 26# 104359176
快写个if-not啊。。。 写了就会知道自己受newlisp影响多深
帮你恢复了,但是不确认哪些恢复的帖子已经不需要了,你方便的话,请自己删除一下吧:(