明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1345|回复: 11

[基础] 如何使用.Net 创建一个可以将lisp函数作为参数的lisp函数?

[复制链接]
发表于 2025-9-16 22:36:19 | 显示全部楼层 |阅读模式

标题说得有点绕,详细说明如下:
(mapcar function list1 ... listn)


lisp系统函数 marcar可以将 list1 到 listn 当做 function 的参数, 并返回其结果。


不过mapcar 的第二个及后面参数的类型必须为list。

如果我想要对选择集做类似的操作,mapcar就派不上用场了。于是想到能否使用.net新建一个lisp函数(如 mapcar2),能达到像mapcar类似的效果



<LispFunction("mapcar2")> _
Public Shared Function mapcar2(ByVal Input As ResultBuffer) As Object

End Function


(mapcar2  function  选择集)

请大神指导一下,如何实现此函数。

回复

使用道具 举报

发表于 2025-9-16 23:19:29 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2025-9-17 13:53 编辑

你应该遍历ResultBuffer啊...
======================================
问题更改为:
acad.net定义lisp函数,模拟mapcar函数的调用,
[LispFunction("mapcar2")]
Lisp调用: (mapcar2 '1+ (ssget))
但出现小撇就会导致出错,
出错是Lisp运行时而不是net运行时出现报错,
报错信息是: "错误:无效的数据类型或数据溢出: 1+"
请问这个如何解决?

楼主跟我说:
压根没有进入.net函数,看来不是原本函数定义的问题.
而是某种调用约定失效,例如这个特性不支持,或者 ResultBuffer不支持.
是这个小撇'的问题,小撇是quote函数的语法糖.
楼主也不打算用字符串作为参数,而是想模拟原生,防止独立命名空间编译引发错误.

请求edata支援,收到请回答,over~
回复 支持 反对

使用道具 举报

发表于 2025-9-16 23:05:07 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2025-9-17 11:02 编辑
guohq 发表于 2025-9-16 23:00
是的,首先明确一点就是,使用.net 定义一个新的lisp函数
_
Public Shared Function mapcar2(ByVal Inpu ...

ResultBuffer本身就是一个包裹结构,简而言之你拆开它就是函数名了.
类似lisp这样调用: (mapcar2 ('myFunc ...))
然后net怎么调用呢?
要SendLisp()也在这个链接.

拆开和定义此链接:
https://www.cnblogs.com/JJBox/p/11532752.html

感觉绕了两次...主要是你想net里面调用lisp函数,实际上尽可能别调用,毕竟发生了两次FFI
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-9-16 23:15:07 | 显示全部楼层
本帖最后由 guohq 于 2025-9-16 23:18 编辑
  1.         <LispFunction("mapcar2")> _
  2.         Public Shared Function mapcar2(ByVal Input As ResultBuffer) As Object
  3.                      mapcar2 = New TypedValue(LispDataType.Text, "OK")
  4.         End Function


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 反对

使用道具 举报

发表于 2025-9-16 22:44:45 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-9-16 22:54:44 | 显示全部楼层
你有种再说一遍 发表于 2025-9-16 22:44
https://www.cnblogs.com/JJBox/p/12426728.html

谢谢
/// <summary>
/// 仿lisp的mapcar函数
/// </summary>
public static IEnumerable<TR> Mapcar<T1, T2, TR>(IEnumerable<T1> lst1, IEnumerable<T2> lst2, Func<T1, T2, TR> func)

这是C#里用的,我需要定义一个lisp函数
回复 支持 反对

使用道具 举报

发表于 2025-9-16 22:58:00 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2025-9-16 22:59 编辑
guohq 发表于 2025-9-16 22:54
谢谢
///
/// 仿lisp的mapcar函数

是想.net函数的参数是lisp函数名吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-9-16 23:00:01 | 显示全部楼层
是的,首先明确一点就是,使用.net 定义一个新的lisp函数
<LispFunction("mapcar2")> _
Public Shared Function mapcar2(ByVal Input As ResultBuffer) As Object

End Function
新的lisp函数 可以将  lisp函数作为参数
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-9-16 23:25:38 | 显示全部楼层
你有种再说一遍 发表于 2025-9-16 23:19
你写得很莫名啊,你应该遍历ResultBuffer啊...

只是一个示例,以我的写法,函数根本塞不进ResultBuffer中,根本不给启遍历ResultBuffer的机会
回复 支持 反对

使用道具 举报

发表于 2025-9-17 08:43:06 | 显示全部楼层
你有种再说一遍 发表于 2025-9-16 23:19
你应该遍历ResultBuffer啊...
======================================
楼主跟我说:

可能lispfunction本身就不支持这种类型定义。ResultBuffer没有这种数据类型吧。包括vla-object,没有这种类型。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-10 04:08 , Processed in 0.127980 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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