明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2288|回复: 12

[已解答] 怎样将函数作为参数

[复制链接]
发表于 2015-5-7 22:27:44 | 显示全部楼层 |阅读模式
本帖最后由 lostbalance 于 2015-5-8 21:19 编辑

att,大致想实现将 fun 作为 fun1 的一个参数,但 fun 本身又带了参数 a。
(defun fun ( a )     ( 1+  a) )
(defun fun1 ( fun )    ( 1+   ( fun ) )  )
求教,需要怎么修改才能实现?
===============================================
发现用了VL-CATCH-ALL-APPLY好像就可以解决上述问题了?不知道有没有其他的思路,另外,用下面这条代码
(defun fun2 (fun lst )(VL-CATCH-ALL-APPLY fun lst))
然后(fun2 'fun '(1))
会返回,提示错误fun,但把该条代码中的参数fun改成其他的名字就正常了,这边参数名与函数名不能相同吗?
我编程序的时候,习惯参数名和上级函数的变量名字取一样,这样会有什么影响吗?
===============================================
可能我没表达清楚,上面的几个函数只是举例,fun的参数数量不一定,也不一定要实现1+的功能,主要是想写一个通用函数,它能选择调用一个带参数的函数。


"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2015-5-8 07:11:57 | 显示全部楼层
(
                            (setq blk-scl-fun
                                (lambda ( value )
                                    (if (= "1" value)
                                        (progn
                                            (mode_tile  "blk-scl" 1)
                                            (mode_tile  "scl-pop" 0)
                                            (mode_image "scl-pik" 1)
                                            (set_tile "blk-scl" (setq blk-scl (cdr (assoc scl-pop ScaleVars))))
                                        )
                                        (progn
                                            (mode_tile  "blk-scl" 0)
                                            (mode_tile  "scl-pop" 1)
                                            (mode_image "scl-pik" 0)
                                        )
                                    )
                                )
                            )
                            scl-var
                        )
                        (action_tile "scl-var" "(blk-scl-fun (setq scl-var $value))")



不知道有没有帮助。摘自LEE MAC的NUMINC.LSP
发表于 2015-5-8 07:16:44 | 显示全部楼层
(setq fun (lambda (a) (1+ a)))
(defun fun1 (var) (1+ (fun var))
不知道行不行,可以试试。我也就这水平了。
发表于 2015-5-8 08:26:17 | 显示全部楼层
(defun fun ( a )  ( 1+  a) )
(defun fun1 (lst)  ( 1+  (eval lst)))
;调用(fun1 (list fun a))
发表于 2015-5-8 09:53:18 | 显示全部楼层
(defun fun (a) (1+  a) )
(defun fun1 (a b ) (+ b (* 2 a)) )
(setq a  (fun1 (fun 2) 3))
   
命令: (setq a  (fun1 (fun 2) 3))
9
子函数返回值。

要么就是把所以子函数重新编写进主函数中。
发表于 2015-5-8 11:49:18 | 显示全部楼层
本帖最后由 wzg356 于 2015-5-8 11:54 编辑

;+1 再+1
(defun fun ( a )     ( 1+  a) )
(defun fun1 ( fun )    ( 1+   (eval fun ) )  )

;;;(fun1 (list fun 2))====4




;;平方+5
(defun xx (a) (* a a))
(defun xx+5 (func)
        (+ 5 (eval func))
)
(xx+5 '(xx 3));;;(xx+5 (list xx 3))=====14
 楼主| 发表于 2015-5-8 21:07:50 | 显示全部楼层
dbqtju 发表于 2015-5-8 07:16
(setq fun (lambda (a) (1+ a)))
(defun fun1 (var) (1+ (fun var))
不知道行不行,可以试试。我也就这水 ...

这个只能实现var的控制,不能将fun作为fun1的一个参数
 楼主| 发表于 2015-5-8 21:12:48 | 显示全部楼层
ZZXXQQ 发表于 2015-5-8 08:26
(defun fun ( a )  ( 1+  a) )
(defun fun1 (lst)  ( 1+  (eval lst)))
;调用(fun1 (list fun a))

我打算做一个通用的函数,所以fun1引用的fun函数,参数可能有多个,按上面这个调用可能就实现不了了。
VL-CATCH-ALL-APPLY倒是可以解决这个问题,但不知道为啥,参数名和调用函数名相同时,就会报错。

点评

定义的fun1函数的参数是表,有多少个变量都没关系。(fun1 (list fun a b c d ...))  发表于 2015-5-9 08:19
发表于 2015-5-9 02:17:34 | 显示全部楼层
lostbalance 发表于 2015-5-8 21:12
我打算做一个通用的函数,所以fun1引用的fun函数,参数可能有多个,按上面这个调用可能就实现不了了。
V ...

函数名也作为变量名保存,同名了就识别不了
发表于 2015-5-9 09:31:25 | 显示全部楼层
lostbalance 发表于 2015-5-8 21:07
这个只能实现var的控制,不能将fun作为fun1的一个参数

http://www.lee-mac.com/lisp/html/AddObjectsToBlockV1-1.html
可以看看其中的SELECTIF函数,其内有一个参数就是函数。
不知是否是你需要的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-21 22:04 , Processed in 0.189443 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表