lostbalance 发表于 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+的功能,主要是想写一个通用函数,它能选择调用一个带参数的函数。


dbqtju 发表于 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

dbqtju 发表于 2015-5-8 07:16:44

(setq fun (lambda (a) (1+ a)))
(defun fun1 (var) (1+ (fun var))
不知道行不行,可以试试。我也就这水平了。

ZZXXQQ 发表于 2015-5-8 08:26:17

(defun fun ( a )( 1+a) )
(defun fun1 (lst)( 1+(eval lst)))
;调用(fun1 (list fun a))

fl202 发表于 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
子函数返回值。

要么就是把所以子函数重新编写进主函数中。

wzg356 发表于 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

lostbalance 发表于 2015-5-8 21:07:50

dbqtju 发表于 2015-5-8 07:16 static/image/common/back.gif
(setq fun (lambda (a) (1+ a)))
(defun fun1 (var) (1+ (fun var))
不知道行不行,可以试试。我也就这水 ...

这个只能实现var的控制,不能将fun作为fun1的一个参数

lostbalance 发表于 2015-5-8 21:12:48

ZZXXQQ 发表于 2015-5-8 08:26 static/image/common/back.gif
(defun fun ( a )( 1+a) )
(defun fun1 (lst)( 1+(eval lst)))
;调用(fun1 (list fun a))

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

wzg356 发表于 2015-5-9 02:17:34

lostbalance 发表于 2015-5-8 21:12 static/image/common/back.gif
我打算做一个通用的函数,所以fun1引用的fun函数,参数可能有多个,按上面这个调用可能就实现不了了。
V ...

函数名也作为变量名保存,同名了就识别不了

dbqtju 发表于 2015-5-9 09:31:25

lostbalance 发表于 2015-5-8 21:07 static/image/common/back.gif
这个只能实现var的控制,不能将fun作为fun1的一个参数

http://www.lee-mac.com/lisp/html/AddObjectsToBlockV1-1.html
可以看看其中的SELECTIF函数,其内有一个参数就是函数。
不知是否是你需要的
页: [1] 2
查看完整版本: 怎样将函数作为参数