lisp语言中如何判断一个输入是不是表

lisp语言中如何判断一个输入是不是表,第1张

我个人觉得一般表的话,你一眼就看得出的,

但是如果你实在要验证,我这里有一个方法,其他具体我没试,但是这个方法肯定可以:

LISP里面有个函数计算表的长度,格式是:

(vl-list-length list-or-cons-object)

其中list-or-cons-object表示表或点对的表

如果参数是个真正的表,则返回包含表的长度的整数,如果是表对表,则返回NIL

举例:

(vl-list-length nil)

0

(vl-list-length '(1 2))

2

(vl-list-length '(1 2 3))

nil

其实这个,你只要拿个需要以表作为参数的函数去验证,不就知道了吗?

我这只是一个抛砖引玉,希望你能发现更好的方法

LISP中有获取点坐标的函数

语法

(getpoint [pt] [prompt])

功能及参数

此函数将暂停以等待用户输入一点, pt 点为在目前UCS下的 2D 或 3D 基准点。Prompt 是一任意字符串, 用来提示用户输入一点。用户则可使用鼠标指定一点, 或由键盘输入目前单位格式的坐标, 来回答此点的位置。假如您设定了 pt这个参数, 则AutoCAD会从这个基准点拉一条橡皮筋到鼠标目前所在的位置。

范例

(setq p (getpoint))

(setq p (getpoint "Where "))

(setq p (getpoint '(15 20) "Second point:"))

此一返回值将表示成目前 UCS 坐标的 3D 点。

注意您不能在回应一个 getpoint 要求时, 再输入其他的 LISP表达式

相关函数:getcorner 与 initget 函数。

get-tile获得的是所选择的项在列表中的索引,是一个数字字符串,将其转化为整型(Atoi),然后用(nth 索引 list)就行了。

你前面加载数据项到下拉框中最好用串行Llst,后面取值就方便。

命令HB合并多段线

(defun c:hb (/ @myL @lpNum @etLst @@ent @ptLst)

  (setq @myL (ssget "i" '((0  "LINE,LWPOLYLINE"))))

;将创建已经选择的线(多段线或者直线)的选择集

  (setq @lpNum 0) ;为循环计数参数赋值

  (repeat (sslength @myL) ;选择集包含几个对象就循环几次

    (setq @etLst (append @etLst (list (ssname @myL @lpNum)))

;逐个提取选择集中的图元名并储存到表@etLst中

  @lpNum (1+ @lpNum) ;每循环一次循环计数参数+1

    )

  )

  (foreach @@lpet @etLst ;历遍表@etLst中每一个原子,以@@lpet代替原子

    (progn

      (setq @@ent (entget @@lpet)) ;将每个图元的详细列表赋值到@@ent中

      (foreach @@2lpe @@ent

(if (= (car @@2lpe) 10) ;如果子表中第一个原子为10

  (setq @ptLst (append @ptLst (list @@2lpe))) ;将子表列入@ptLst

)

      )

      (entdel @@lpet) ;删除已提取过点的对象

    )

  )

  (entmake (append (list ;通过点表创建新的多段线

     '(0  "LWPOLYLINE")

     '(100  "AcDbEntity")

     '(100  "AcDbPolyline")

     (cons 90 (length @ptLst))

   )

   @ptLst

   )

  )

  (princ)

)

=====分割线========================================

顺带一说。。。你为何不用CAD自带的pedit命令?

pedit(使用CAD原生的ACADPGP可简化为PE命令)→M→选择所有需要合并的线→(若有不含多段线的元素)按Y转换所有选择对象为多段线→J合并→空格或者回车或者ESC退出

块属性需要用entnext不断的往后取得到,下面给你一个例子

;;;把两个属性快的属性执行一致

(defun C:bpp() ;;;复制属性

(setq ent1 nil ent2 nil)

(while (= nil ent1)(setq ent1 (car (entsel "\n数据源块:")))) ;;;;;;;;;取其中 一个块

(while (= nil ent2)(setq ent2 (car (entsel "\n需要被一致的块:")))) ;;;;;;;;;取其中另一个块

(setq n

(length (vlax-safearray->list (vlax-variant-value

(vlax-invoke-method

(vlax-ename->vla-object ent1)

'GetAttributes)

)))

)

(repeat n

(setq ent1 (entnext ent1))

(setq ent2 (entnext ent2))

(setq entlist1 (entget ent1))

(setq entlist2 (entget ent2))

(setq entlist2 (subst (assoc 1 entlist1) (assoc 1 entlist2) entlist2))

(entMOD entlist2)

(entUPD ent2)

)

)

LISP(全名LISt Processor,即链表处理语言),由约翰·麦卡锡在1960年左右创造的一种基于λ演算的函数式编程语言。

LISP有很多种方言,各个实现中的语言不完全一样。各种LISP方言的长处在于 *** 作符号性的数据和复杂的数据结构。1980年代Guy L Steele编写了Common Lisp试图进行标准化,这个标准被大多数解释器和编译器所接受。在Unix/Linux系统中,还有一种和Emacs一起的Emacs Lisp(而Emacs正是用Lisp编写的)非常流行,并建立了自己的标准。

LISP的祖先是1950年代Carnegie-Mellon大学的Newell、Shaw、Simon开发的IPL语言。

LISP语言的主要现代版本包括Common Lisp和Scheme。

lisp拥有理论上最高的运算能力

1 基本介绍

Lisp的表达式是一个原子(atom)或表(list),原子(atom)是一个字母序列,如abc;表是由零个或多个表达式组成的序列,表达式之间用空格分隔开,放入一对括号中,如:

abc

()

(abc xyz)

(a b (c) d)

最后一个表是由四个元素构成的,其中第三个元素本身也是一个表。

正如算数表达式1+1有值2一样,Lisp中的表达式也有值,如果表达式e得出值v,我们说e返回v。如果一个表达式是一个表,那么我们把表中的第一个元素叫做 *** 作符,其余的元素叫做自变量。

Lisp的7个公理(基本 *** 作符):

(quote x)返回x,我们简记为'x

(atom x)当x是一个原子或者空表时返回原子t,否则返回空表()。在Lisp中我们习惯用原子t表示真,而用空表()表示假。

> (atom 'a)

t

> (atom '(a b c))

()

> (atom '())

t

现在我们有了第一个需要求出自变量值的 *** 作符,让我们来看看quote *** 作符的作用——通过引用(quote)一个表,我们避免它被求值。一个未被引用的表达式作为自变量,atom将其视为代码,例如:

> (atom (atom 'a))

t

反之一个被引用的表仅仅被视为表

> (atom '(atom 'a))

()

引用看上去有些奇怪,因为你很难在其它语言中找到类似的概念,但正是这一特征构成了Lisp最为与众不同的特点——代码和数据使用相同的结构来表示,而我们用quote来区分它们。 (eq x y)当x和y的值相同或者同为空表时返回t,否则返回空表()

> (eq 'a 'a)

t

> (eq 'a 'b)

()

> (eq '() '())

t

(car x)要求x是一个表,它返回x中的第一个元素,例如:

> (car '(a b))

a

(cdr x)同样要求x是一个表,它返回x中除第一个元素之外的所有元素组成的表,例如:

> (cdr '(a b c))

(b c)

(cons x y)要求y是一个表,它返回一个表,这个表的第一个元素是x,其后是y中的所有元素,例如:

> (cons 'a '(b c))

(a b c)

> (cons 'a (cons 'b (cons 'c ())))

(a b c)

2 Common LISP的Hello World程序

下面是一个在标准输出设备上输出Hello World的简单程序,这种程序通常作为开始学习编程语言时的第一个程序:

(format t "Hello, world!~%")

你这个命令没有变量,可以直接复制程序的部分代码就可以实现你想要的功能。复制代码(setq cen (list 0 0)) (command "circle" cen 5)到cad的输入行,回车即可。

以上就是关于lisp语言中如何判断一个输入是不是表全部的内容,包括:lisp语言中如何判断一个输入是不是表、LISP程序中如何输入点的三维坐标、autolisp驱动对话框的popup_list问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10122481.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存