Shakto 发表于 2022-7-5 22:18:26

在mapcar lamb中调用函数

你好
 
我有个问题,我做了9个函数(g1 g2 g3 m1 m2 m3 p1 p2 p3)
我想在mapcar函数中调用它们中的每一个,这9个函数都在我函数的arg中的一个列表中:
 
让我们看看g1的例子
(defun g1 (l) (if (eq (car l) 1) NIL (cons 1(cdr l))))
 
我的函数列表:(g1 g2 g3 m1 m2 m3 p1 p2 p3)
 
当我想调用他们获取该函数中的值时,它不起作用,请有人帮我?)
 
(defun newopen (felem lop) (mapcar (lambda (y) (y felem)) lop))
(newopen '(1 2 3) '(g1 g2 g3 m1 m2 m3 p1 p2 p3))

hanhphuc 发表于 2022-7-5 22:25:42

 
嗨,沙子,欢迎来到论坛,阅读第一篇
http://www.cadtutor.net/forum/showthread.php?9184-代码发布指南
 
可能是打字错误?
lambda报价缺失?
'(lambda...)

 
而且

if list=
'(g1 g2 g3 m1 m2 m3 p1 p2 p3) ;
you need, ((eval y) felem)

or just
(list g1 g2 g3 m1 m2 m3 p1 p2 p3)

我们不知道其余部分如何工作g2 g3 m2。。。etc正在工作或有bug?

Shakto 发表于 2022-7-5 22:30:01

不知道eval函数,仍然无法使用newopen函数:
(defun newopen (felem lop) (mapcar '(lambda (y) ((eval y) felem)) lop))
 
我有一个错误:FUNCALL:参数(lambda y)((eval y)felem))不是函数
 
其他功能g1 g2 g3等。。。正在工作:
(defun g1 (l) (if (eq (car l) 1) NIL (cons 1(cdr l))))
(defun g2 (l) (if (eq (car l) 2) NIL (cons 2(cdr l))))
(defun g3 (l) (if (eq (car l) 3) NIL (cons 3(cdr l))))
(defun m1 (l) (if (eq (car l) 1) NIL (if (eq (cadr l) 1) NIL (if(eq (car l) (cadr l)) NIL (cons (car l) (cons 1 (cddr l)))))))
(defun m2 (l) (if (eq (car l) 2) NIL (if (eq (cadr l) 2) NIL (if(eq (car l) (cadr l)) NIL (cons (car l) (cons 2 (cddr l)))))))
(defun m3 (l) (if (eq (car l) 3) NIL (if (eq (cadr l) 3) NIL (if(eq (car l) (cadr l)) NIL (cons (car l) (cons 3 (cddr l)))))))
(defun p1 (l) (if (eq (car l) 1) NIL (if (eq (caddr l) 1) NIL (if (eq (car l) (caddr l)) NIL (if (eq (cadr l) (caddr l)) NIL (append (list(car l)) (list(cadr l)) (cons 1 ())))))))
(defun p2 (l) (if (eq (car l) 2) NIL (if (eq (caddr l) 2) NIL (if (eq (car l) (caddr l)) NIL (if (eq (cadr l) (caddr l)) NIL (append (list(car l)) (list(cadr l)) (cons 2 ())))))))
(defun p3 (l) (if (eq (car l) 3) NIL (if (eq (caddr l) 3) NIL (if (eq (car l) (caddr l)) NIL (if (eq (cadr l) (caddr l)) NIL (append (list(car l)) (list(cadr l)) (cons 3 ())))))))

hanhphuc 发表于 2022-7-5 22:39:55

无评估

(defun newopen1 (felem lop) (mapcar '(lambda (y) (y felem)) lop))
(newopen1 '(1 2 3) (list g1 g2 g3 m1 m2 m3 p1 p2 p3))

 
带eval:

(defun newopen2 (felem lop) (mapcar '(lambda (y) ((eval y) felem)) lop))
(newopen2 '(1 2 3) '(g1 g2 g3 m1 m2 m3 p1 p2 p3))

这可以解释:报价
 
这是你的回报值?

;(nil (2 2 3) (3 2 3) nil nil (1 3 3) nil (1 2 2) nil)

Shakto 发表于 2022-7-5 22:43:17

是的,这是我的返回值。
 
我对你的两个函数都有错误:
 
newopen1=>错误:变量G1未绑定。
newopen2=>apply/funcall的参数不是函数:(LAMBDA(Y)((EVAL Y)FELEM))。

hanhphuc 发表于 2022-7-5 22:51:11

 
也许在2007版之后,lambda需要优化,尽管没有编译??

(defun newopen2 (felem lop) (mapcar (function(lambda (y) ((eval y) felem))) lop))

(newopen2 '(3 2 1) '(g1 g2 g3 m1 m2 m3 p1 p2 p3))
;((1 2 1) (2 2 1) nil (3 1 1) nil nil nil (3 2 2) nil)

Shakto 发表于 2022-7-5 22:51:25

不知道
 
已经试过了,它告诉我:(eval y)必须是LAMBDA表达式

Lee Mac 发表于 2022-7-5 23:00:45

正如hanhphuc所建议的那样,以下内容是正确的:
(defun newopen ( felem lop ) (mapcar '(lambda ( y ) ((eval y) felem)) lop))
在我的测试中:
_$ (newopen '(1 2 3) '(g1 g2 g3 m1 m2 m3 p1 p2 p3))
(nil (2 2 3) (3 2 3) nil nil (1 3 3) nil (1 2 2) nil)
 
您使用什么软件/方法来评估代码?
您是在AutoCAD 2014命令行还是在VLIDE控制台中输入代码?

Shakto 发表于 2022-7-5 23:04:20

我在windows>上使用的是CLISP 2.49。

Shakto 发表于 2022-7-5 23:16:44

该死,我想在AutoCAD之前在CLISP上试试我的程序
页: [1]
查看完整版本: 在mapcar lamb中调用函数