Lisp需要有不固定参数的自定义函数吗?
本帖最后由 飞诗(fsxm) 于 2014-11-10 21:13 编辑像lisp系统函数很有这个功能:比如
(getint )
输入整数,msg 这个是可选参数
(- ...)
减法,如果多个参数,就是前面的依次减去后面的,如果只一个数字,就是返回负数
等等。。。。。
以前不死猫老师也做过这方法的尝试~
http://bbs.mjtd.com/forum.php?mo ... D110%26typeid%3D110
但是有没有个更简单方便的方法来实现这些功能呢?
比如我想定义一个函数 myGetint,
(myGetint )
其中,msg是提示信息,def是默认值
当用户空格或回车时,就返回这个默认值~
但是 lisp的自定义函数还真不好实现~
很多人都定义成这样
(myGetint (list ))
这的确是个好方法,只是书写麻烦了点每次都多了一层list+括号!
现在问题来了:飞诗编辑器可以实现这个功能,这个大家需要吗???
(实现方法原理就是加函数签名,跟c++ C#之类的同理)
比如用户定义了三个同名函数
(defun myGetint() ...)
(defun myGetint(msg ) ...)
(defun myGetint(msg def) ...)
编辑器检测到同名函数后,自动附加签名成为三个函数
myGetint_*0
myGetint_*1
myGetint_*2
但用户调用时,直接按同名调用
(myGetint "请输入整数" 10)
提示用户输入整数,如果不输入,就默认为10,,
当编辑器检测到myGetint时,分析后面带了两个参数
自动将myGetint,修改为带签名的调用
(myGetint_*2 "请输入整数" 10)
当然,这些用户是不用去理会的,
只当他是同一个函数,有三种调用方式!
当然,还要自定义apply。。等等
*
支持,就是不知道这个怎么去实现,是不是一定要用你的编辑器编译呢? 个人认为这样会使LISP代码丧失通用性,如果不使用专用的编辑器,会导致运行失败。
与其借着LISP的壳,不如另起炉灶,做一个自己的语言了。 vectra 发表于 2014-11-10 22:01 static/image/common/back.gif
个人认为这样会使LISP代码丧失通用性,如果不使用专用的编辑器,会导致运行失败。
与其借着LISP ...
不会啊,按我上面说的
你写的代码转换为标准的lisp代码,到哪台电脑都一样运行!
也不用另外的函数库!通用性不存在问题 没看懂。。。
似乎只是表象实现了多个不定参数。
实质仍然是多个函数定义。 没理解有什么意义,楼主的就像是编辑器的容错处理,定义了同名函数会自动变成加后缀的函数,如果只是这样,恕我愚钝,本人以为这是不好的容错,这种错误会助长坏习惯的养成,对以后的实际使用有害无益。
说实话,不死猫的帖子我也没看懂,到底要做什么?最后调用不还是(call_func lst)的形式么?现在的defun就可以。 ll_j 发表于 2014-11-11 09:07 static/image/common/back.gif
没理解有什么意义,楼主的就像是编辑器的容错处理,定义了同名函数会自动变成加后缀的函数,如果只是这样, ...
可能去了解下别的语言,比如C++,C#,java等等比较流行的语言,
都有这些功能的!不定参数函数是常见需求!
比如你要定义
(myGetint "你好请输入整数")
(myGetint "你好请输入整数" 10);用户不输入就默认10
因为参数不固定,现在的alisp是定义不了这样的~ 语言限制,Lisp 没有 函数重构 需要这个功能,一开始学lisp的时候就有这个困惑。
但是alisp毕竟不是商业语言,语法结构也非常不严格, 如果函数重定义在大型函数库中感觉有可能会出问题,但对于写小程序来说还是不错的。
不过个人感觉还是(list )这种写法跟贴近lisp的语法结构。 好吧,看来大多数人都不需要本功能!那就不做了~本帖over
页:
[1]
2