标题说得有点绕,详细说明如下:
(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-17 13:53 编辑
guohq 发表于 2025-9-16 23:15

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

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

请求edata支援,收到请回答,over~

网友答: 本帖最后由 你有种再说一遍 于 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

网友答: 本帖最后由 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




网友答: https://www.cnblogs.com/JJBox/p/12426728.html

网友答:
你有种再说一遍 发表于 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:59 编辑
guohq 发表于 2025-9-16 22:54
谢谢
///
/// 仿lisp的mapcar函数

是想.net函数的参数是lisp函数名吗?

网友答: 是的,首先明确一点就是,使用.net 定义一个新的lisp函数
<LispFunction("mapcar2")> _
Public Shared Function mapcar2(ByVal Input As ResultBuffer) As Object

End Function
新的lisp函数 可以将  lisp函数作为参数


网友答:
你有种再说一遍 发表于 2025-9-16 23:19
你写得很莫名啊,你应该遍历ResultBuffer啊...

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

网友答:
你有种再说一遍 发表于 2025-9-16 23:19
你应该遍历ResultBuffer啊...
======================================
楼主跟我说:

可能lispfunction本身就不支持这种类型定义。ResultBuffer没有这种数据类型吧。包括vla-object,没有这种类型。
  • 上一篇:快速填充插件
  • 下一篇:没有了