免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 104359176
打印 上一主题 下一主题

希望开通新的语言板块 [复制链接]

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
11 [报告]
发表于 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 通常用来作为累加或累乘。

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
12 [报告]
发表于 2016-07-23 12:10 |只看该作者
关于lisp的括号多,我有一个看法,虽然括号多了,但其他的符号少了。

perl:
  1. if (a > b) { say "a > b"};
复制代码
ruby:
  1. if a > b then puts "a > b" end
复制代码
Python 则需要缩进。

所以lisp用括号将其他的大括号,中括号,逗号,分号,关键字都取代了,不但简化了编程模型,而且还容易扩展。

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
13 [报告]
发表于 2016-07-23 12:15 |只看该作者
关于宏,所有语言的宏实现都是一个原理,就是延迟参数的求值。

所有lisp的方言,有一个共同的特点,就是有还没有求值的中间状态的符号。并且有操作符来人为控制它何时求值。

所以,在lisp中,表达式和列表是可以显式的转换。而通常的lisp的所谓专家却刻意模糊表达式和列表的区别。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
14 [报告]
发表于 2016-07-25 22:52 |只看该作者
回复 11# 104359176

比如 cons :

  1. > (list (cons) (cons 1) (cons 1 2) (cons 1 2 3))
  2. (() (1) (1 2) (1 2))
复制代码
不像+接受任意多个参数, cons最多只接受2个, 多的会忽略。

如果用apply而不是直接传递:

  1. > (apply cons '())
  2. ()
  3. > (apply cons '(1))
  4. (1)
  5. > (apply cons '(1 2))
  6. (1 2)
  7. > (apply cons '(1 2 3))
  8. (1 2)
复制代码
一样的啊。。。   不可意料的结果是啥。。。


关于array。
如果确实是想将array而不是list当作的参数传递给函数, 用array-list转换成list:

  1. > (apply cons (array-list (array 3 '(1 2 3))))
  2. (1 2)
复制代码
关于@。
这个是想表达个啥意思。。。 "@x" 不是将"x"转换成list或者array或者进行别的什么魔法操作, "@x"是一个symbol哦。。。

  1. > (length "@array-list") ; 这个字符串长度是11, 方便后面对比
  2. 11
  3. > (read-expr "@array-list") ; 读取一个expression
  4. @array-list
  5. > $count ; 可以看到整个字符串是被消耗完了的, 一个不剩
  6. 11
  7. > (symbol? (read-expr "@array-list")) ; 整个字符串被读取为一个symbol
  8. true
  9. > @array-list ; 默认是没有绑定的
  10. nil
复制代码
"@three-args-array" 同上:

  1. > (length "@three-args-array")
  2. 17
  3. > (read-expr "@three-args-array")
  4. @three-args-array
  5. > $count
  6. 17
  7. > (symbol? (read-expr "@three-args-array"))
  8. true
  9. > @three-args-array
  10. nil
复制代码
不可意料的结果是因为对@理解有误吧。。。?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
15 [报告]
发表于 2016-07-25 23:17 |只看该作者
本帖最后由 OwnWaterloo 于 2016-07-26 19:25 编辑

回复 12# 104359176

这个我自己是同意的。。。

最近。。。 被一个问题问懵逼过。。。
"python 里面 v for h 是什么意思"。。。 纳尼???

最终, 发现代码是这个样子: "d = { k : v for h,v in zip(seq1, seq2) }"

lisp里很少会出现这种“断句”出错的情况。。。
语法就symbol, pair, string, number, ... 可能还会再出现一些, 但不会特别多。。。
语法上没什么magic的地方。。。


然而。。。 这并没有什么卵用。。。 不管是讲道理、 安利、 无脑吹。。。 大多数人看到lisp就是这个样子:


而看到某个语言宣称"我们借鉴C语法"就是这个样子:

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
16 [报告]
发表于 2016-07-25 23:29 |只看该作者
104359176 发表于 2016-07-23 12:15
关于宏,所有语言的宏实现都是一个原理,就是延迟参数的求值。


关于这个。。。  因为涉及到newlisp。。。  所以不太好解释。。。
"宏"(macro)这个词在各种lisp里会有一些区别。。。

比如在scheme, common lisp, emacs lisp, clojure里, scheme就和后3者区别很大。
在后3者里面继续细分, clojure又和前两者有所区别。

但是把newlisp放到里面进行对比的话, 首先就是newlisp和其他lisp的区别最显著而会被分出去。。。


比如。。。 你用newlisp写一个if-not宏吧。。。 接受固定的3个表达式, 功能与if相反。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
17 [报告]
发表于 2016-07-25 23:58 |只看该作者
本帖最后由 OwnWaterloo 于 2016-07-26 19:31 编辑

删。。。

1.png (151.88 KB, 下载次数: 50)

四老外1

四老外1

2.png (132.9 KB, 下载次数: 51)

四老外2

四老外2

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
18 [报告]
发表于 2016-07-26 01:15 |只看该作者
经过测试, apply 确实会将多余的参数自动舍弃, 改变了我顽固看法.不知道是何时有这个错误的看法,也许是某个方言吧.这么看来, 这里还是有很多值得学习的人.

确实学习一个语言越久, 就越来越深的受其影响,只有重新学习另外一门语言的时候,才会发觉.这种改变十分痛苦.我厌恶不同的方言,厌恶不同的语言.

虽然无奈,但还是想改变这种情况,我的理想就是写出一门自己的语言,用自己的语言写代码,解决问题.

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
19 [报告]
发表于 2016-07-26 01:25 |只看该作者
回复 26# 104359176

快写个if-not啊。。。   写了就会知道自己受newlisp影响多深

论坛徽章:
49
15-16赛季CBA联赛之福建
日期:2016-06-22 16:22:002015年亚洲杯之中国
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36双鱼座
日期:2015-01-02 22:04:33午马
日期:2014-11-25 09:58:35辰龙
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龙
日期:2014-08-21 10:47:58
20 [报告]
发表于 2016-07-26 09:04 |只看该作者
OwnWaterloo 发表于 2016-07-26 01:25
回复 26# 104359176

快写个if-not啊。。。   写了就会知道自己受newlisp影响多深


帮你恢复了,但是不确认哪些恢复的帖子已经不需要了,你方便的话,请自己删除一下吧:(
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP