数字测图原理与应用——Lisp语言的学习和使用
基于Lisp的人工智能编程技术探讨及应用
基于Lisp的人工智能编程技术探讨及应用人工智能(Artificial Intelligence,AI)作为当今科技领域的热门话题之一,已经在各个领域展现出了巨大的潜力和应用前景。
而在人工智能的编程技术中,Lisp语言因其功能强大、灵活性高等特点而备受关注。
本文将围绕基于Lisp的人工智能编程技术展开探讨,分析其优势和应用场景,带领读者深入了解这一领域的前沿技术。
1. Lisp语言简介Lisp(List Processing)是一种基于符号表达的函数式编程语言,由John McCarthy于1958年创造。
Lisp以其简洁、灵活和强大的元编程能力而闻名,被广泛应用于人工智能、自然语言处理、机器学习等领域。
Lisp语言的核心数据结构是列表(list),代码和数据在Lisp中具有统一的表示形式,这种特性使得Lisp成为人工智能编程的理想选择。
2. Lisp在人工智能中的应用2.1 专家系统专家系统是一种基于知识库和推理机制实现智能决策的系统,常用于模拟人类专家在特定领域内的决策过程。
Lisp语言由于其优秀的符号处理能力和逻辑推理机制,在专家系统的开发中得到了广泛应用。
通过Lisp语言编写专家系统,可以高效地表示知识库、实现推理规则,并支持动态修改和扩展知识库的功能。
2.2 自然语言处理自然语言处理(Natural Language Processing,NLP)是人工智能领域中一个重要的研究方向,旨在使计算机能够理解、分析和生成自然语言文本。
Lisp语言提供了丰富的符号处理和模式匹配功能,非常适合用于自然语言处理任务的实现。
研究人员可以利用Lisp编写文法规则、语义分析算法等模块,构建强大的自然语言处理系统。
2.3 机器学习机器学习作为人工智能的重要支柱之一,通过训练模型从数据中学习规律并做出预测。
Lisp语言提供了丰富的函数式编程特性和元编程能力,为机器学习算法的实现提供了良好的支持。
研究人员可以利用Lisp编写各种机器学习算法,并结合函数式编程思想构建灵活、可扩展的机器学习系统。
Lisp程序语言的具体实现和运用浅析
Lisp程序语言的具体实现和运用浅析一、引言:随着工业技术和生活水平的提高,室外管线的种类越来越多,对室外管线设计的要求就越来越高。
室外管网不仅仅需要在平面上按照相关的规范规程进行综合排布,还需要在竖向高度上进行精心安排,才能在有限的空间合理组织各种管线的布置。
而这种需求必然要求设计师拥有比较强大的软件来进行室外管线设计的工作。
然而目前国内许多设计机构在管线综合方面主要靠手工综合,而且竖向标高的碰撞上面基本不进行设计,都是靠施工单位在施工现场根据实际情况自行避让。
这样导致室外管网排布的混乱,既不规范,甚至带来安全隐患等因素。
往往发生拆了又建,建了又拆,很难统筹管理,后期维护困难等问题。
上面的情况一再发生,无论是地方政府还是设计单位、业主等都越来越意识到室外管网合理规划,统一综合设计的重要性和必要性。
而且手工进行综合设计已经难以胜任这样的工作,迫切需要强大的软件进行辅助设计。
目前能进行室外管网综合的软件主要有一些国产软件和AutoDesk公司的Revit系列软件,但是一些国产软件使用繁琐复杂,难以满足设计师的需求,而Revit这样的BIM软件虽然在管线碰撞等方面很有优势,但是对硬件要求高,需要专门培训,使用起来也比较复杂。
因此,开发出真正适合管网综合的程序就显得很有必要。
二、LISP和BIM的简介:LISP(LISt Processor,即列表处理语言),由约翰·麦卡锡在1960年左右创造的一种基于λ演算的函数式编程语言。
可以说Lisp语言抽象复杂却又大道至简,它的主要的特点:1代码量小,2功能全,3易扩展。
AutoLISP是由Autodesk公司开发的一种LISP程序语言,嵌入在AutoCAD 内部,具有智能的特点的编程语言。
通过AutoLISP编程,可以节省工程师很多时间。
AutoLISP程序语言在室外管网综合方面得天独厚的优势。
近几年BIM技术的方兴未艾,室外管网综合的性质决定了它比较适合采用BIM技术。
LISP语言教程
LISP语言教程作者:牛魔王—上次修改时间: 2007-03-22 13:13Scheme 语言是LISP语言的一个方言(或说成变种),它诞生于1975年的MIT,对于这个有近三十年历史的编程语言来说,它并没有象C++,java,C#那样受到商业领域的青睐,在国内更是显为人知。
但它在国外的计算机教育领域内却是有着广泛应用的,有很多人学的第一门计算机语言就是Scheme语言。
Scheme 语言概要Author: 宋国伟吉林省德惠市信息中心Date: 2003 年 12 月 01 日Scheme 语言是LISP语言的一个方言(或说成变种),它诞生于1975年的MIT,对于这个有近三十年历史的编程语言来说,它并没有象C++,java,C#那样受到商业领域的青睐,在国内更是显为人知。
但它在国外的计算机教育领域内却是有着广泛应用的,有很多人学的第一门计算机语言就是Scheme语言。
作为Lisp 变体,Scheme 是一门非常简洁的计算语言,使用它的编程人员可以摆脱语言本身的复杂性,把注意力集中到更重要的问题上,从而使语言真正成为解决问题的工具。
本文分为上、下两部分来介绍 scheme 语言。
一.Scheme语言的特点Scheme 语言是LISP语言的一个方言(或说成变种),它诞生于1975年的MIT,对于这个有近三十年历史的编程语言来说,它并没有象C++,java,C#那样受到商业领域的青睐,在国内更是显为人知。
但它在国外的计算机教育领域内却是有着广泛应用的,有很多人学的第一门计算机语言就是Scheme语言。
它是一个小巧而又强大的语言,作为一个多用途的编程语言,它可以作为脚本语言使用,也可以作为应用软件的扩展语言来使用,它具有元语言特性,还有很多独到的特色,以致于它被称为编程语言中的"皇后"。
下面是洪峰对Scheme语言的编程特色的归纳:∙词法定界(Lexical Scoping)∙动态类型(Dynamic Typing)∙良好的可扩展性∙尾递归(Tail Recursive)∙函数可以作为值返回∙支持一流的计算连续∙传值调用(passing-by-value)∙算术运算相对独立本文的目的是让有编程基础(那怕是一点点)的朋友能尽快的掌握Scheme语言的语法规则,如果您在读完本文后,发现自己已经会用Scheme语言了,那么我的目的就达到了。
lisp语言
正如欧几里德的几何世界中有五个公理一样,我们在这里给出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)看到这里大家可能会问,为什么没有取表中除开头外其它某个位置上的元素的操作符,别急,等我们讲到地球人都知道的函数和递归你就知道该怎么办了,也许你现在已经想得差不多了?接下来要介绍给大家的是构成程序逻辑的一个基本功能……条件分支,在Lisp 中,它是由cond操作符完成的,cond是七个公理中最后一个也是形式最复杂的一个(欧几里德的最后一个公理也如是):(cond (p1 e1) (p2 e2)...(pn en))p1到pn为条件,e1到en为结果,cond操作符依次对p1到pn求值,直到找到第一个值为原子t(还记得吗?)的p,此时把对应的e作为整个表达式的值返回,例如:> (cond ((eq ’a ’b) ’first)((atom ’a) ’second))second好了,至此我们已经有了Lisp世界的所有基本公理,我们可以开始构建整个世界的规则了。
基于Lisp的自然语言处理机器学习算法研究与应用
基于Lisp的自然语言处理机器学习算法研究与应用自然语言处理(Natural Language Processing,简称NLP)是人工智能领域中的一个重要分支,旨在使计算机能够理解、解释和生成人类语言。
随着人工智能技术的不断发展,NLP在各个领域都有着广泛的应用,如智能客服、智能翻译、舆情分析等。
而机器学习算法则是NLP中的核心,通过对大量文本数据的学习和训练,使计算机能够自动识别文本中的语义和情感,从而实现更加智能化的文本处理。
Lisp语言简介Lisp(List Processing)是一种基于符号表达的函数式编程语言,由John McCarthy于1958年创造。
Lisp以其简洁优雅的语法和强大的元编程能力而闻名,被广泛应用于人工智能领域。
在NLP领域,Lisp语言也有着独特的优势,其函数式编程范式与NLP任务中对递归和高阶函数的需求高度契合。
Lisp在自然语言处理中的应用文本预处理在NLP任务中,文本预处理是至关重要的一步。
通过使用Lisp 编写的函数,可以轻松地实现文本的分词、去除停用词、词干提取等操作。
Lisp语言中丰富的字符串处理函数和列表操作函数为文本预处理提供了便利。
词袋模型词袋模型(Bag of Words,简称BoW)是NLP中常用的表示方法之一,将文本表示为词汇表中单词的出现频率。
利用Lisp编写机器学习算法,可以高效地构建词袋模型,并进行文本特征提取和向量化。
朴素贝叶斯分类朴素贝叶斯分类器是一种简单而有效的分类算法,在文本分类任务中有着广泛的应用。
利用Lisp编写朴素贝叶斯分类器,可以实现对文本进行情感分析、主题分类等任务。
词嵌入词嵌入(Word Embedding)是将单词映射到连续向量空间中的表示方法,在NLP任务中有着重要作用。
通过使用Lisp编写神经网络模型,可以实现Word2Vec、GloVe等流行的词嵌入算法,并将其应用于文本相似度计算、命名实体识别等任务。
LISP连线程序在数字化测图中的应用
LISP连线程序在数字化测图中的应用摘要:在我们的数字化测图中会遇到大量的线状或者面状地物,这些地物往往又会以交叉的形式存在,,通过CASS自带的命令我们很难准确快速的完成地形图的内业编绘工作,本文旨在介绍如何通过在CASS软件中加载LISP程序实现对野外采集的线状地物的快速绘制。
关键字:LISP程序设计数字化测图展点号1 引言南方CASS软件作为在CAD下开发的测绘软件,因其简单易学、界面直观、操作方便等优点受到广大测绘工作者的喜爱。
但是在我们的数字化测图的实际工作中,每天的外野数据采集工作会采集大量的碎部点,然而在内业数据的编绘中,线状或者面状地物是通过将外野采集的某些碎部点按照其实际形状按照一定的顺序连接起来形成。
然而在内业编绘过程中通过CASS自身命令很难判断出哪些碎部点属于同一线状地物,只能通过人工去判断,因此在内业处理上会花上大量的时间还容易出错。
这个时候我们可以通过LISP 这个CAD二次开发工具来量身订做我们需要的特殊功能,从而实现快速准确的内业数据编绘。
2 LISP程序简介LISP是List Processor(表处理程序)的缩写,主要用于人工智能(AI)领域。
AutoLISP是人工智能语言CommonLISP的简化版本,作为通用LISP语言的一个小子集,AutoLISP严格遵循其语法和惯例,但又添加了许多针对AutoCAD的功能。
Autodesk公司在AutoCAD 2.1版引入AutoCAD作为应用程序编程接口(API),用于扩展和自定义AutoCAD功能。
借助AutoLISP,用户可以用适合编写图形应用程序的强大的高级语言来编写宏程序和函数,并开发各种软件包。
AutoLISP易于使用,并且非常灵活,多年来一直是自定义AutoCAD的标准。
从AutoCAD R14开始,Visual LISP 被引入到AutoCAD中,它增强并扩展了AutoLISP语言,可以通过 Microsoft ActiveX Automation接口与对象交互,并扩展了AutoLISP响应事件的能力。
lisp教程
一.Lisp基础知识二.对话框基础一.基本知识第1节--------------------------------------------------------------------------------基本知识AutoLISP是一种针对扩充及自订AutoCAD函数机能而产生,以LISP为基础的程序设计语言.LISP本身于50年代末期出现,是一种擅于处理串行文字(List of Processing),属第四代「人工智能(Artificial Intelligence)」的计算机语言.目的是令使用者充份利用AutoCAD进行开发,直接增加及修改AutoCAD指令.AutoLisp语言建基于普通的LISP语言上,并扩充了许多适用于CAD的特殊功能而形成.是一种能以直译方式(不须先行编译)亦可于AutoCAD内部执行的直译性程序语言.程序容易学习及撰写,程序即使出错亦不会对操作系统(如DOS,WINDOWS)有不良影响.数据及程序均统一以串行 (List)结构表示.可直接调用几乎全部的AutoCAD命令.既具备一般高级语言的基本结构和功能,亦有一般高级语言没有的强大图形处理能力.内建于AutoCAD应用程序,不须另行购买;亦不须使用特定的编辑器或开发环境.可配合AutoCAD提供的PDB,建立DCL(Dialog Control Language)文件创建对话框.缺点 : 执行速度较ObjectArx(旧称ARX,以C或C++程序开发,取代以前的ADS)程序慢;原程序不易保护;对低阶的硬件数据不易存取.第2节--------------------------------------------------------------------------------函数 (Function)在AutoLISP程序语言中所有的成份都是以函数的形式出现,AutoLISP程序就是顺序执行连串的函数.函数的运行过程就是对函数的求值(结果)过程;函数的基本语法如下:(函数名称参数1 参数2....)e.g. (PRINC "AutoLISP Programming")每一个完整的函数必须包在一对小括号( )内,左边为开括号,右边为关括号;如有若干数量的开括号,则一定有同等数量的关括号对应.左边开括号后紧随函数名称.函数名称与参数之间,或参数与参数之间须最少留一个空格.第3节--------------------------------------------------------------------------------数据型态 (Data Type)整数 (INT)没有小数字的数值,32位有号数,范围从+2,147,483,647到-2,147,483,648实数 (REAL)带小数字的数值,以倍精度浮点格式储存(最少14位小数) e.g. 12.5当数值在1与-1之间时,必须加上前导零 e.g. 0.05可以科学记号表示 : 在E或e后加上次方值 e.g. 4.1e-6字符串 (STR)一般文字,其前后必须加上双引号" e.g. "AutoCAD"控制字符或脱逸码必须为小写,且须在字符前加上反斜线 \ e.g. "\AutoCAD"像素名称 (ENAME)是指定给图文件内对象的指针(Pointer,为16进位的数字卷标)e.g. <Entity name:14e5180>像素名称在图文件内是唯一的,不会重复对象的像素名称只在目前作业中有效,再开启图档时,会指定新的像素名称予该对象档案 (FILE)以OPEN函数所开启档案的指针,作为其它函数(读写该档案)的自变量选集 (PICKSET)用SSGET等函数建立的一个或多个对象的集合或群组转化 (V ARIANT)可将像素名称转换为可与ActiveX配搭使用的VLA-Object对象符号 (SYM)用以储存静态数据的名称;例如内建或使用者定义的函数符号名称不分大小写,可由任意长度的可打印字符组成;但下列的字符除外:左括号( 右括号 ) 句点 . 单引号' 双引号 " 分号 ;表 (LIST)亦称为串行,是放在一对小括号 ( ) 内,一个或多个元素的有序集合e.g. (1.0 "Lisp" ( ) (5.6 7))元素可以是字符串,符号,整数或实数;也可以是另一个表元素与元素之间要用空格隔开,但元素与小括号之间则可以不隔空格为便于存取表内各元素,每个元素均有其序号;从表的左边开始,第一个元素序号为0,依此类推表的大小即为其顶层元素的数量(内层嵌套式的表,视为单一元素)点对(Dotted Pair)亦是表的一种;表内有2个元素,中间以一圆点分隔,且元素与圆点之间亦须以空格分开若表内没有任何元素,称为空串行或空表;以 ( ) 或 (NIL) 表示第4节--------------------------------------------------------------------------------变数 (Variable)为程序执行中动态储存数据的符号名称;主要分为2类:变量名称与符号的限制相同,使用时宜采用有意义及易于辨别的名称变量在赋值或使用前无须先行设定相同的变量可以储存不同型态的数据(但同一时间内只可储存一种型态)在指定新的数据之前,变量储存的内容会保持不变赋值将数据给予指定的变量储存以内建函数SETQ进行(可用于绘图模式的指令行或AutoLISP程序),其语法如下:(SETQ 变量名称1 资料1 [变量名称2 资料2 ....] )e.g. (SETQ NAME "David" AGE 37 WEIGHT 72.5 POINT (LIST 10 20))在函数名称之后,各参数以两个一组,每组左边为变量名称,右边为存入变量的数据亦可将变量名称赋以空值(NIL) :e.g. (SETQ OCCUPATION NIL)要显示变量所储存的数据,可以使用内建函数PRINC(可用于绘图模式的指令行或AutoLISP程序),其语法如下 : (PRINC 变量名称 )e.g. COMMAND : (PRINC NAME) Result : David"David"在绘图模式中,亦可于指令行中使用感叹号 ! 来显示变量内容,或作为指令选项的输入值;语法如下 : !变量名称e.g. COMMAND : !NAME Result : "David"在Visual LISP的主控台窗口中,于提示符号 _$ 后键入要显示的变量名称_$变量名称e.g. _$NAME要检查变量所储存的数据型态,可使用内建函数TYPE;语法如下:(TYPE 变量名称)e.g. COMMAND : (TYPE NAME) Result : STR若检查的变量没有储存数据,则会传回NIL第5节--------------------------------------------------------------------------------练习 (Exercises)将四个坐标分别存入四个变量中,并以LINE或PLINE指令,配合四个坐标变量,画出正四边形.COMMAND : (SETQ POINT1 (LIST 0 0) POINT2 (LIST 0 10) POINT3 (LIST 10 10) POINT4 (LIST 10 0)) COMMAND : LINE ;直线段指令COMMAND : !POINT1 ;第一点(左下角起点)COMMAND : !POINT2 ;第二点(左上角)COMMAND : !POINT3 ;第三点(右上角)COMMAND : !POINT4 ;第四点(右下角)COMMAND : C ;自动联机至起点以关闭四边形画圆 : 将圆心坐标及半径长度分别存入两个变量中(变量名称及数据型态自订)COMMAND : (SETQ CEN (LIST 0 0) RAD 20) ;将圆心点设为坐标0,0;半径为20COMMAND : CIRCLE ;执行划圆指令Specify center.... : !CEN ;在提示后以变量CEN响应输入Specify radius.... : !RAD ;在提示后以变量RAD响应输入将不同型态的数据,分多次存入相同的变数内;每次均以PRINC及TYPE函数显示变量内容及其数据型态COMMAND : (SETQ TEMP 1.2) ;将实数1.2存入变数TEMPCOMMAND : !TEMP Result : 1.2COMMAND : (TYPE TEMP) Result : REALCOMMAND : (TYPE TEMP) Result : STR二数值资料第1节--------------------------------------------------------------------------------基本运算加函数(+ [数值参数1 数值参数2 ....] )e.g. (+ 2.5 4 6) Result : 12.5函数的结果为各参数之总和若仅提供一个参数,则以0加上此参数的结果为返回值若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数减函数(- [数值参数1 数值参数2 ....] )e.g. (- 10 2 3) Result : 5结果为第一个(最左边)参数减去其右边各参数的总和若只提供一个参数,返回值为0减去该参数的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数乘函数(* [数值参数1 数值参数2 ....] )e.g. (* 2 3 4) Result : 24结果为所有参数的乘积若只提供一个参数,则返回值为该参数乘以1的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数除函数(/ [数值参数1 数值参数2 ....] )e.g. (/ 24 2 3) Result : 4结果为第一个(最左边)参数除以其右边各参数的乘积若仅提供一个参数,则返回值为该参数除以1的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数注意 : 在本篇教程中,各函数的数值参数,均可以变量(储存值只可以是整数或实数,且不可以是空值 nil)取代第2节--------------------------------------------------------------------------------练习 (Exercises)计算式 (2+4)*3COMMAND : (* 3 (+ 2 4)) Result : 18计算式 (50-8*5)/4COMMAND : (/ (- 50 (* 8 5)) 4) Result : 2注意 : 上式的正确答案应是2.5,因为函数中的各参数均为整数,所以传回的结果亦为整数递增及递减递增(1+ 数值参数 )e.g. (1+ 2) Result : 3递减三角函数 (Trinagular Function)正弦值(SIN 弧度参数)e.g. (SIN 1) Result : 0.841471余弦值(COS 弧度参数)e.g. (COS 1) Result : 0.540302反正切值(ATAN 弧度参数)e.g. (ATAN 1) Result : 0.785398第3节--------------------------------------------------------------------------------其它数值处理次方值(EXPT 数值参数次方值 )e.g. (EXPT 2 4) Result : 16若参数及次方值两个均为整数,返回值亦是整数;若其中一个为实数,结果为实数开方根(SQRT 数值参数 )e.g. (SQRT 30) Result : 5.47723绝对值(ABS 数值参数 )e.g. (ABS -123) Result : 123余数(REM [数值参数1 数值参数2 ....] )e.g. (REM 50 26 5) = (REM (REM 50 26) 5) Result : 4将参数1整除参数2的余数若参数多于2个时,则会将余数再整除下一个参数,再得出余数;依此类推若其中一个参数为实数时,则结果为实数;否则为整数最大公约数(GCD 数值参数1 数值参数2 )e.g. (GCD 81 57) Result : 3两个参数均必须为整数值型态自然对数(LOG 数值参数 )e.g. (LOG 3.5) Result : 1.25276是EXP函数的反函数;传回值为实数型态自然反对数(EXP 数值参数 )e.g. (EXP 1.25276) Result : 3.49999是LOG函数的反函数;传回值为实数型态第4节--------------------------------------------------------------------------------数值资料转型实数转整数只会截去小数部份(小数字不会4舍5入)整数转实数(FLOAT 数值参数 )e.g. (FLOAT 12) Result : 12.0整数转字符串(ITOA 数值参数 )e.g. (ITOA -17) Result : "-17"数值转字符串(RTOS 数值参数[模式[小数字] ] )e.g. (RTOS 17.23333 2 3) Result : 12.266若不设定模式,则依系统变量 LUNITS 的设定值转换数值为字符串若不设定小数字,则依系统变量 LUPREC 的设定值转换模式设定值可以是下列数值之一 :1 = 科学记号2 = 十进制3 = 英呎及十进制英吋4 = 英呎及分数位英吋5 = 分数当选用的模式为3,4或5,则传回的字符串受系统变量UNITMODE影响弪度转字符串(ANGTOS 角度参数[模式[小数字] ] )e.g. (ANGTOS 0.785398 0) Result : "45"e.g. (ANGTOS 0.785398 4) Result : "N 45d E"若不设定模式,则依系统变量AUNITS的设定值转换数值为字符串若不设定小数字,则依系统变量AUPREC的设定值转换模式设定值可以是下列数值之一 :0 = 度1 = 度/分/秒2 = 分度量3 = 弪度4 = 土地测量单位当选用的模式为4,则传回的字符串受系统变量UNITMODE影响反函数为ANGTOF;参阅第5篇教程第5节--------------------------------------------------------------------------------数值资料检查数值(NUMBERP 数值参数 )e.g. (NUMBERP -3.45) Result : Te.g. (NUMBERP "AutoLISP") Result : nil注意 : 在范例的传回值中,T表示函数的结果为真(成立),nil表示结果为假(不成立) 负数值(MINUSP 数值参数 )e.g. (MINUSP -3.45) Result : Te.g. (MINUSP 0) Result : nile.g. (MINUSP 3.45) Result : nil零值e.g. (ZEROP 3.45) Result : nil其它应用最大值(MAX [数值参数1 数值参数2 ....] )e.g. (MAX -88 5 2) Result : 5若没有提供任何参数,则传回值为0最小值(MIN [数值参数1 数值参数2 ....] )e.g. (MIN -88 5 2) Result : -88若没有提供任何参数,则传回值为0第6节--------------------------------------------------------------------------------练习 (Exercises)计算下列算式 :(+ 1234567890 1234567890) Result : -1825831516上式中两个数值参数均为整数,而结果值大于整数型态所能容许之范围;固导致发生溢位问题,产生无效的结果.修正算式如下 : 只要将其中一个参数改为实数型态即可.(+ 1234567890.0 1234567890) Result : 2.46914e+009计算下列算式 :(+ 9876543210 1234567890) Result : 1.11111e+010上式中两个数值参数均为整数,但其中一个(第一个)参数巳大于整数型态所能容许之范围;系统会自动将此参数先行转为实数型态才计算.计算下列算式 :(FIX (SQRT (+ 1 (MAX 20 10 40 30)))) Result : 6---- 最先执行的是最内层的算式(MAX 20 10 40 30) ,求出最大值为40---- 其次执行加函数,将MAX函数所得的最大值加1,结果为41---- 再利函数SQRT,将41开方根,结果为6.4031---- 最后使用FIX函数,截去其小数字,得到最后的结果为6三程序设计第1节--------------------------------------------------------------------------------使用者定义函数是将一群表示式组合成一个函数或指令可应用于绘图模式的指令行提示,Visual LISP主控台,或供其它自定义函数内的表示式呼叫使用AutoLISP原始程序代码均以纯文字格式存盘,扩展名为LSP(2000版可编译成扩展名为FAS的档案可以一般文字编辑器进行开发,如DOS的EDIT,WINDOWS的WORD或WORDPAD等一个自定函数内最少要有一个表达式在原程序文件(LSP)里,自定义函数以DEFUN函数开始;其语法如下 :(DEFUN [C:] 函数名称 ( [自变量串行 ...] [/ 局部变数串行 ...] ) 表达式 ...)在呼叫带有自变量的自定函数时,必须同时提供与定义函数时,同等数量的参数,使各参数传入自定函数的各自变量中自变量被视为一种特殊类型的局部变量,无法用于该自定函数以外的其它函数若自定函数中无须设定任何自变量,亦必须以空串行 ( )加在函数名称之后若有提供局部变量,必须以斜线 / 加在局部变量的开头(即使前面没有自变量串行)各自变量,斜线,局部变量之间要以空格分隔;但与左右小括号之间则不须以空格分开若自变量串行中有相同名称的自变量出现,则会忽略第一个以后的相同自变量;变数亦是一样若在函数名称前没有加上C:,在指令行提示下,必须将函数名称包在一对小括号中才可执行不可以在执行一自定函数时,以通透方式执行另一自定函数第2节--------------------------------------------------------------------------------加载程序自定函数在使用前,都要将其所在的程序文件(扩展名为LSP)加载才可执行ACAD.LSP程序文件(预设在SUPPORT子目录内)会在启动AutoCAD时自动加载(LOAD "程序文件名称" [加载失败] )e.g. (LOAD "TEST")若程序文件之文件名为LSP,则在程序文件名称之后,可以不加上扩展名若有需要,系统会顺序尝试其它的扩展名 : VLX FAS LSP若程序文件不在系统的支持目录下,则需在文件名前加上目录路径注意 : 必须以正斜线 / 或两个反斜线 \\ 作为目录的分隔符可以在加载失败的参数中提供字符串,以供加载失败时显示;亦可提供有效的自定函数,该函数在加载程序文件失败时会被执行e.g. (LOAD "TEST" "Load Fail") 或 (LOAD "TEST" (DOERROR))注意 :在程序文件加载后,在提示行显示的返回值,一般是该程序文件中,最后被定义的函数名称或是在程序文件内没有包含在自定函数中,最后一个表达式的执行结果第3节--------------------------------------------------------------------------------练习 (Exercises)启动文字编辑器,编写一AutoLISP程序作两个同心圆(第1个圆半径为50,第2个圆半径为80),程序代码如下所示 : (DEFUN C: 2CIRCLE () (SETQ CEN (LIST 0 0) RAD 50)(COMMAND CIRCLE CEN RAD)(COMMAND CIRCLE CEN (+ RAD 30)))---- 输入后以纯文字格式存盘(C:\TEST.LSP)---- 在AutoCAD绘图模式的指令行提示后,用LOAD函数将程序文件加载COMMAND : (LOAD "C:/TEST")---- 在指令行提示后,输入程序(函数)名称执行COMMAND : 2CIRCLE程序说明1 使用DEFUN建立自定函数的名称,并用SETQ函数将中心点(LIST 0 0)存入变数CEN,半径(50)存入变数RAD中2 使用COMMAND函数执行AutoCAD内建指令CIRCLE,并以变量CEN(圆的中心点)及变数RAD(圆的半径)回应3 与第2行大致相同,但在指定其半径时,先将储存半径的变量加30,使划出半径为80的圆;注意最右边的关括号,与第1行DEFUN左边的开括号是一对的启动文字编辑器,开启TEST.LSP程序文件,复制2CIRCLE至新程序2C,并改为传入自变量方式执行;程序代码如下 : (DEFUN 2C (CEN RAD) (COMMAND CIRCLE CEN RAD)(COMMAND CIRCLE CEN (+ RAD 30)))---- 输入后以纯文字格式存盘---- 在AutoCAD绘图模式的指令行提示后,用LOAD函数将程序文件重新加载---- 在指令行提示后,输入程序(函数)名称执行COMMAND : (2C (LIST 0 0) 50)第4节--------------------------------------------------------------------------------表示在分号右边(同一行)的字符均为批注,程序执行时会将其忽略多行批注;| |;表示在两个批注符号中间所有字符皆为批注,即使字符跨越多行关系运算在各个关系运算中,都会传回一逻辑值;若关系成立,传回 T,否则会传回 nil各参数可以是字符串,整数或实数型态;若以字符串进行比较,则会以字符串的ASCII码为准若函数中只有一个参数,传回值恒为 T等于函数(= 参数1 [参数2 ....] )会将参数1与其后各个参数比较,若全部相等则传回 T,否则传回 nil e.g. (= 2 2.0) Result : Te.g. (= "A" CHR(65)) Result : T不等于函数(/= 参数1 [参数2 ....] )若参数1不等于其后任何一个参数,即传回T e.g. (/= 1 2.0) Result : Te.g. (/= "a" CHR(65)) Result : Te.g. (/= 10 30 40 10 20) Result : T小于函数(< 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均小于右边的参数,即传回 Te.g. (< 1 2) Result : Te.g. (< "a" CHR(65)) Result : T大于函数(> 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均大于右边的参数,即传回 Te.g. (> 1 2) Result : nile.g. (> "a" CHR(65)) Result : nil小于或等于函数(<= 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均小于或等于右边的参数,即传回 Te.g. (<= 1 2) Result : Te.g. (<= 2 2) Result : Te.g. (<= "a" CHR(65)) Result : T大于或等于函数(>= 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均大于或等于右边的参数,即传回 Te.g. (>= 1 2) Result : nile.g. (>= 2 2) Result : Te.g. (>= "a" CHR(65)) Result : nil第5节--------------------------------------------------------------------------------逻辑运算且运算(AND [表达式 ....] )若各表达式的传回值均为 T,函数即返回 T 值;若其中一个传回值为 nil,函数传回 nil(OR [表达式 ....] )若各表达式的传回值均为 nil,函数即返回 nil 值;若其中一个传回值为 T,函数传回 Te.g. (OR (> 1 2) (> 8 5)) Result : T否定运算(NOT 表达式 )若表达式的传回值为 T,函数即返回 nil 值;相反若表达式传回值为 nil,函数传回 T可用于检查传回值是否为 nil另有一NULL函数与NOT函数功能相似e.g. (NOT (< 1 2)) Result : nil练习 (Exercises)试求出50减25,与625的开方根值是否相等COMMAND : (= (- 50 25) (SQRT 625)) Result : T设计一简单程序(名称为AIR),在呼叫程序时,检查传入的数值自变量(为空气污染指数)是否大于200(即严重空气污染)---- 启动文字编辑器,开启TEST.LSP程序文件,输入下列程序代码 :(DEFUN AIR (NUM) (> NUM 200))---- 输入后存盘(纯文字格式)---- 在AutoCAD绘图模式的指令行提示符号后,使用LOAD函数重新加载程序文件COMMAND : (LOAD "C:/TEST")---- 在AutoCAD绘图模式的指令行提示符号后,输入自定函数名称及参数执行COMMAND : (AIR 175) Result : nilCOMMAND : (AIR 215) Result : T四流程控制第1节--------------------------------------------------------------------------------条件判断是利用条件函数,配合关系及逻辑运算所设定的一些准则,令程序自行分析,因应情况作出适当行动.单一条件(IF 条件表达式是表达式[否表达式] )函数先检查条件表达式,若其传回值为 T,便会执行其后的是表达式若有提供否表达式,且条件表达式的传回值为 nil,函数将不会执行(跳过)是表达式而执行否表达式若没有提供否表达式,且条件表达式的传回值为 nil时,函数将不作任何事情IF函数可以巢状方式嵌套,即在是或否的表达式中加入另一个IF函数练习 (Exercises)判断空气污染指数 : 大于100 = Very High, 51至100 = High, 26至50 = Medium, 25或以下 = Low---- 启动编辑器,开启C:/TEST.LSP程序文件;新增AIR-1自定函数,程序代码如下 :(DEFUN AIR-1 (NUM) (IF (> NUM 100) (PRINC "Very High"))(IF (AND (> NUM 50) (<= NUM 100)) (PRINC "High"))(IF (AND (> NUM 25) (<= NUM 50)) (PRINC "Medium"))(IF (<= NUM 25)) (PRINC "Low"))程序说明1 设定函数名称,并将数据存入自变量NUM内;用IF函数判断变量NUM是否大于100;若是则显示字符串Very High 响应2 用IF函数判断变量NUM是否大于50且(AND)小于或等于100;若是则显示High响应3 用IF函数判断变量NUM是否大于25且(AND)小于或等于50;若是则显示Medium4 用IF函数判断变量NUM是否小于或等于25;若是则显示Low5 是一个没有提供任何自变量的PRINC函数;用以抑制显示答案时尾部符加的 nil 或重复的传回值;而最右一个关括号,是用以对应第1行最左边的开括号IF函数的巢状练习 : 修改上一课的程序练习,将多个IF函数合并成巢状嵌套---- 启动文字编辑器,开启C:/TEST.LSP程序文件---- 新增程序AIR-2,其程序代码如下 :(DEFUN AIR-2 (NUM) (IF (> NUM 50) (PRINC (IF (> NUM 100) "Very high" "High"))(PRINC (IF (> NUM 25) "Medium" "Low")))(PRINC))程序说明1 设定函数名称,并将数据存入自变量NUM内;用IF函数判断变量NUM是否大于50;若条件成立(变量NUM大于50)时,再用另一个IF函数判断变量是否大于100;若条件成立(变量NUM大于100)时,使用PRINC函数显示字符串Very High,否则显示High2 若在第1个IF函数判断中,条件不成立(变量NUM不大于50)时;再用另一个IF函数判断变量是否大于25;若条件成立(NUM大于25)时,显示字符串Medium,否则显示字符串Low3 是一个没有提供任何自变量的PRINC函数;用以抑制显示答案时尾部符加的 nil 或重复的传回值;而最右一个关括号,是用以对应第1行最左边的开括号注意 :第1行最后一个关括号是对应前面的PRINC函数,尾2的关括号则是对应IF函数(判断NUM是否大于100) 第2行最后一个关括号是对应第1行的IF函数(判断NUM是否大于50),尾2的关括号则是对应PRINC函数,尾3的关括号则是对应IF函数(判断NUM是否大于25)最右边的关括号是对应第1行最左边的开括号PROGN 函数在以上各范例中,执行的表达式均为单一的函数运算;若要在表达式中顺序执行一连串的函数,便要将各函数包含在一个PROGN函数内;函数的传回值会是该PROGN函数中,最后一个表达式的运算结果---- 修改TEST.LSP程序文件的AIR-1程序,第1个IF函数如下,其余的IF函数请自行修改e.g. (IF (> NUM 100) (PROGN (SETQ DISP "Very High") (PRINC DISP)))注意 : 最后一个关括号是对应前面的IF函数(判断变量NUM是否大于100)尾2的关括号是对应PROGN函数(用以包含SETQ及PRINC函数)尾3的关括号是对应PRINC函数的第2节--------------------------------------------------------------------------------条件判断多重条件(COND [ (条件表达式是表达式) ....] )函数会顺序检查各条件表达式;直到其中一个条件成立(传回 T),即执行该条件式所对应的是表达式每个条件表达式只对应一个是表达式,而没有否表达式若条件式成立且执行对应的是表达式后,则不会再对余下的其它条件表达式进行检查若只有条件表达式而没有对应之是表达式,则只会传回条件表达式的逻辑值若没有提供任何条件表达式及是表达式,函数传回值恒为 nil练习 (Exercises)新增程序AIR-3,以改善上一课AIR-1程序;用一个COND函数判断多个条件表达式DEFUN AIR-3 (NUM) (COND((> NUM 200) (PRINC "Severe"))((> NUM 100) (PRINC "Very High"))((> NUM 50) (PRINC "High"))((> NUM 25) (PRINC "Medium"))((> NUM 0) (PRINC "Low"))(T (PRINC "Cannot Check")))(PRINC))程序说明1 设定函数名称,并将数据存入自变量NUM内;用COND函数进行多重判断2 判断变量NUM是否大于200,若条件成立,则显示 Severe 讯息;第3至6行依此类推7 注意条件式为一个 T 字母,表示条件式恒为真(成立),显示讯息 Cannot Check作用是当以上各条件式均不成立时(变量小于或等于0),即执行此一表达式第3节--------------------------------------------------------------------------------循环 (Loop)配合条件判断,关系及逻辑运算,令程序不断重复一些动作,以提高效率及减少重复动作时的人为错误可以多个循环形成巢状(嵌套式)循环,即在一个循环内嵌套另一个(或多个)循环指定的重复次数必须为正整数,亦可以是储存正整数的变量名称重复指定次数(REPEAT 重复次数[表达式 ....] )e.g. (REPEAT 10 (PRINC "David")) ;重复显示David字符串10次重复(WHILE 条件表达式[是表达式 ....] )若条件表达式的传回值为 T,即会顺序执行函数内各表达式各表达式顺序执行完后,程序会返回函数的开头,重新检查条件表达式的传回值若条件表达式的传回值为 nil,函数内各表达式将不会被执行e.g. (SETQ COUNT 1) ;将1存入变数COUNT(WHILE (<= COUNT 10) ;WHILE函数并检查变量COUNT是否<=10(PRINC "David") ;若条件成立则以PRINC函数显示David字符串(SETQ COUNT (1+ COUNT))) ;变量COUNT递增1,并将新值重新存入变量COUNT中取代原值注意 : 第4行最右边的关括号,是对应第2行WHILE函数的开括号无限循环又称为死循环,即循环的条件判断式传回值恒为 T,令循环不断重复而无法结束;在上例中 :---- 若WHILE函数的条件表达式设定为 (T) ;即条件永远成立---- 不作SETQ函数,或不将变量COUNT递增;变量COUNT储存值恒久不变,导致条件式永远成立第4节--------------------------------------------------------------------------------练习 (Exercises)编写一程序SUM并将自变量存在NUM变量内,计算1+2+3+4 ....至变数NUM的总和(DEFUN SUM (NUM) (SETQ COUNT 1 TOTAL 0)(WHILE (<= COUNT NUM)(SETQ TOTAL (+ TOTAL COUNT)COUNT (1+ COUNT)))(PRINC TOTAL) (PRINC))程序说明1 设定函数SUM并将自变量存入变量NUM,设定变量COUNT以将数目由1开始递增,变量TOTAL(储存总和)初始值为02 WHILE循环函数,并设定进入循环的条件式(变量COUNT小于或等于变量NUM)3 若条件成立即进入循环内部,先将变量TOTAL加上变量COUNT,再用SETQ函数存回变量TOTAL中,覆盖原值4 将变量COUNT递增1,存回变数COUNT并覆盖原值5 关括号与第2行的WHILE函数左边的开括号对应6 循环结束后,用PRINC函数显示变量TOTAL(总和)的内容程序流程假设执行程序时传入变量NUM的数值为10---- 变数初始值 COUNT = 1 TOTAL = 0---- 判断变量COUNT是否<=变量NUM COUNT = 1 TOTAL = 0---- 变量COUNT(现值1)小于NUM,进入循环;将TOTAL(现值0)加上COUNT,存回变数TOTAL COUNT = 1 TOTAL = 1---- 变数COUNT(现值1)递增1变为2,存回变数COUNT COUNT = 2 TOTAL = 1---- 返回WHILE函数的开头,重新判断条件式---- 变量COUNT(现值2)小于NUM,进入循环;将TOTAL(现值1)加上COUNT,存回变数TOTAL COUNT = 2 TOTAL = 3---- 变数COUNT(现值2)递增1变为3,存回变数COUNT COUNT = 3 TOTAL = 3---- 返回WHILE函数的开头,重新判断条件式---- 变量COUNT(现值3)小于NUM,进入循环;将TOTAL(现值3)加上COUNT,存回变数TOTAL COUNT = 3 TOTAL = 6部份过程省略---- 返回WHILE函数的开头,重新判断条件式---- 变量COUNT(现值10)仍等于NUM,进入循环;将TOTAL(现值45)加上COUNT,存回变数TOTAL COUNT = 10 TOTAL = 55---- 变数COUNT(现值10)递增1变为11,存回变数COUNT COUNT = 11 TOTAL = 55---- 返回WHILE函数的开头,重新判断条件式---- 变量COUNT(现值11)巳大于NUM(本范例假设为10),条件判断不成立,循环结束 COUNT = 11 TOTAL = 55---- 显示变量TOTAL的现存值,程序结束尝试用IF函数检查输入的自变量是否小于或等于0;若条件成立则不执行余下的程序(DEFUN SUM (NUM) (IF (<= NIM 0) (PRINC "Input Error")(PROGN略过 WHILE 及 PRINC 函数))(PRINC))程序说明。
LISP编程语言在CAD绘图中的应用
LISP编程语言在CAD绘图中的应用江明明【摘要】CAD因为其完善的功能和简便的操作已经在被广泛的应用,做为一种二次开发工具,LISP依据其语法简单,编写程序便捷、灵活、数据类型丰富等特点也得到了许多技术人员的学习和研究.它也可以在应用程序中使用对话框语言、控制菜单,还能够提示用户输入、直接访问内置AutoCAD命令,以及修改或创建图形数据库中的对象,向AutoCAD添加专用命令等.【期刊名称】《北京测绘》【年(卷),期】2016(000)001【总页数】3页(P113-115)【关键词】LISP;编程;CAD【作者】江明明【作者单位】天津市勘察院,天津300191【正文语种】中文【中图分类】P2081 引言AutoCAD的主要二次开发语言有Auto LISP、VBA和Object ARX。
在这三种开发工具中,Object ARX拥有对AutoCAD最深入的控制能力,能够提供最多类型的窗体。
使用ARX可以像AutoCAD注册自己的命令,用户运行拟的程序时无需了解关于AutoCAD更多的知识。
这种便利的代价就是编制ARX程序比VBA和LISP程序需要花费更多的时间,因此用来编制简单的绘图工具有点浪费了。
VBA,这种工具对初学者来说非常友好,Visual Basic的代码阅读起来非常容易,很多初学者仅读了函数的名称就能理解一个问题。
无论如何创建或者执行LISP命令来扩充拟的访问手段,这种开发工具没有ARX和LISP那么多对AutoCAD访问的方式。
但是对VBA来说,最大的遗憾就是不能向AutoCAD注册命令,必须先用各种加载应用程序的方法将其对应的dvb文件加载,然后通过“工具/宏/宏“菜单执行。
LISP,首先简单描述一下Auto LISP。
Auto LISP兼备快速开发工具的特点和COBOL语言的灵活性,LISP是快速编写应用程序的最初的开发工具,大量的LISP程序库存在于世界各地。
结合我们平时的工作,如果是做些大型的二次开发,或者对窗口,对话框的要求比较高的话,那么前两种方法是必选。
Lisp语言的基本语法与应用
Lisp语言的基本语法与应用Lisp(List Processing)是一种函数式编程语言,它以列表为基础数据结构并使用S表达式(S-expression)进行编程。
本文将介绍Lisp语言的基本语法和应用。
一、基本语法1. 原子(Atom):Lisp的基本数据单位,可以是数字、字符串或符号。
例如,数字1、字符串"Hello, World!"和符号'hello都是Lisp的原子。
2. 列表(List):Lisp的核心数据结构,由左括号、元素列表和右括号组成。
列表中的元素可以是原子,也可以是嵌套的列表。
例如,(12 3)和('a ('b 'c))都是合法的Lisp列表。
3. 函数调用:Lisp通过括号表示函数调用,函数名位于第一个元素位置,后跟参数列表。
例如,(+ 1 2)表示调用加法函数,将1和2相加。
4. 定义变量:Lisp使用defvar或setq关键字用于定义变量。
defvar用于定义全局变量,setq用于定义局部变量。
例如,(defvar *pi* 3.14)定义了一个全局变量*pi*,(setq x 10)定义了一个局部变量x并赋值为10。
二、基本应用1. 计算器:Lisp提供了基本的数学运算函数,例如加法(+),减法(-),乘法(*)和除法(/)等。
可以通过使用这些函数进行算术计算。
2. 条件判断:Lisp中的条件判断使用if函数,语法形式为(if condition then else)。
当condition为真时,执行then部分的代码,否则执行else部分的代码。
例如,(if (> x 0) (print "x is positive") (print "x is negative"))根据变量x的值输出不同的结果。
3. 循环:Lisp的循环结构通过使用循环宏(loop macro)实现。
从Lisp语言了解编程语言的解释与执行
从Lisp语言了解编程语言的解释与执行作者:唐诗来源:《计算机应用文摘》2022年第24期关键词:Lisp函数;过程;程序执行1过程与数据抽象对任何程序语言的学习,最终都主要集中在三个方面:基本元素,基本元素的组合功能,对组合后复合对象的抽象功能。
Lisp中的基本元素是表达式。
其组成和现在流行的程序语言并没有太大差别,如数字运算符+/,判定谓词eq?等,Lisp作为一个语族,不同的方言(如rocket)会有不同的规定,但大体功能上和C或者Java等相比并没有什么本质的区别。
在Lisp中表达式的组织形式是采用括号来构成各项求值表达式,且过程对于参数的调用采用的是前缀式。
这在现在的程序语言中比较少见,但这合理有效且不会造成歧义。
我们可以从离散数学中采用前缀式来标识二元关系的案例,以找到类似的痕迹。
在Lisp中,将基本元素组合构成复合对象或复合表达式。
本质上,这要求语言提供一种类似于“胶水”的东西,能将两个或者更多的对象黏在一起。
从最简单的开始,将两个对象组合在一起构成一个对象,可以通过某种操作,从这个对象中提取出原本的两个对象。
用同样的方式,将这个组合后的对象和新的对象再用之前的组合方式构成一个新的对象,如此反复,就可以构成任意数量的元素,且我们可以有一定的方式将构成的元素从其中取出。
这种愿望思维构成的合理推导,最终将问题规约为两个元素的组合,并能通过一定的方式将其从中取出。
Lisp 在这里提供的工具叫做序对(pair),具体的表现形式如下。
( define x(cons 1 2));定义出x( car x);结果为1( cdr x);结果为2其中,cons就是这个语言中的胶水工具,我们放入其中的元素有顺序之分,且可以通过car与cdr的方式按照顺序取出。
有了这个基本的工具,我们就可以在此基础上进一步构造复合对象。
这就是上文中提到的语言的第三个重要部分——将复合对象作为一个整体,将其像基本元素一样,进一步进行组合操作。
实现CAD绘图与LISP编程的自动化技巧
实现CAD绘图与LISP编程的自动化技巧CAD(计算机辅助设计)是一种广泛应用于工程和建筑行业的软件工具,而LISP(LISt Processing)则是一种编程语言,经常用于CAD 软件中进行自动化任务和定制。
在CAD绘图中,使用LISP编程可以极大提高工作效率,加快绘图速度并减少出错概率。
下面,我们将介绍一些实现CAD绘图与LISP编程的自动化技巧。
1. 使用LISP编写简单命令LISP语言在CAD软件中被广泛应用,因其简洁、灵活和强大的功能而备受赞誉。
可以利用LISP编写一些简单的命令,以自动完成一些常见的绘图任务。
例如,我们可以编写一段LISP代码,用于创建一个特定大小和形状的矩形或圆形,并将其放置在指定位置。
2. 利用LISP实现参数化绘图参数化绘图是CAD绘图中常见的需求,它可以根据一组参数值自动生成特定形状和尺寸的图形。
利用LISP编程可以方便地实现参数化绘图。
通过定义参数,并使用LISP代码控制参数值,可以在绘图过程中灵活地调整形状和尺寸,提高工作效率。
3. 利用LISP编写循环和逻辑语句LISP编程强大之处在于其循环和逻辑语句的灵活性。
通过编写循环和逻辑语句,可以实现复杂的绘图任务,如图形的重复、数组的生成等。
例如,我们可以使用循环语句自动生成一系列具有相同属性但位置不同的图形。
4. 利用LISP批处理CAD命令CAD软件中的批处理命令可以用于自动执行一系列CAD操作,如创建图层、更改对象属性等。
利用LISP编程可以轻松地实现批处理CAD命令。
通过编写LISP代码,将多个CAD命令组合在一起,可以以一次性的方式自动执行这些命令,从而减少人为干预。
5. 利用LISP创建自定义CAD函数和命令除了使用CAD软件中已有的命令,我们还可以通过LISP编程自定义CAD函数和命令,以满足特定的需求。
通过编写LISP代码,可以根据自己的需要定义函数和命令,从而实现更高级和复杂的CAD绘图操作。
Lisp入门
Lisp⼊门Lisp ⼊门LISP 是 LISt Processor 的缩写,是“列表处理语⾔”意思。
Lisp语⾔最初是由美国的 John McCarthy 在 1958 年提出来的,是最早的计算机语⾔之⼀。
然⽽,半个多世纪后的今天,Lisp 语⾔仍然在使⽤,并且还会继续被使⽤,这和它独特的结构是分不开的。
Lisp的基本框架可以容下任何修订或扩充。
⽽且 LISP 语⾔在符号处理⽅⾯的优势,LISP 最初使⽤于⼈⼯智能处理。
(早期有部分⼈⼯智能的研究者认为:“符号演算系统可以衍⽣出智能。
”)《⿊客与画家》的作者 Paul Graham 就对 Lisp 语⾔赞誉有加,认为⼤部分的现代语⾔都在向 Lisp 靠近。
安装 Mac 环境在已安装 HomeBrew 前提下在 Terminal 键⼊brew install sbcl开始Terminal 中键⼊sbcl会有This is SBCL 1.4.6, an implementation of ANSI Common Lisp.More information about SBCL is available at </>.SBCL is free software, provided as is, with absolutely no warranty.It is mostly in the public domain; some portions are provided underBSD-style licenses. See the CREDITS and COPYING files in thedistribution for more information.*这个就是 Lisp 的解释器,在这⾥我们⾸先要知道退出是 (quit)。
解译器的功能就是对⼀个输⼊的表达式求值的东西。
函数在 Python 中1+21 + 2⽽在 Lisp 中1+2(+ 12)在Python中 + 是运算符,⽽在 Lisp 中 + 是运算符,同时也是函数,但它是前缀表达。
LISP语言在测绘作业中的应用
3 程序 开发 的基 础 和 设 计
3
它嵌 入到菜单 中 , 样定 制你 的系统 会 取 得更 高 的效 这
如 图 1 图 2所示 , 1 宗地 图 , 2为相对应 的 、 图 为 图 本 宗地 的界址 调查 表 。由于城镇 地籍 调查所 涉 及 的宗
No .1
中图 分 类 号 :2 9 P 0
文 献 标 识 码 : B
LS IP语 言 在测 绘 作 业 中 的 应 用
任航 科
( 建 省 八 闽 测 绘 院 , 建 厦 福 福 32 0 ) 60 0
摘
要 :A S作 为 在 C D 下 开发 的 测 绘 软 件 , CS A 因其 易 学 , 面友 好 , 作 方 便 等 特 点 受 到 广 大 测绘 工作 者 的 喜 爱 。 而 界 操
并非所有你 需要的命令都在其 中, 这个 时候就需要借 助 LS IP这个 C D二次开发工具来量身定做 所需要的特殊 功能。 A
有 的 时候 灵 活的 运 用 LS 序 进 行 二 次开 发 , 于 节 省人 力 , 力 , 力有 着 立 竿 见 影 的 效 果 , 地 籍 测 量 后 期 资 料 IP程 对 物 财 如
业方 法 是 前 期 的 地 籍 图 以 及 街 坊 图 的 制 作 都 是 在
C S . 软件下 完 成的 , 期 的建库 数 据再 以这 些 图 A S7 1 后 件 为基础 来 进 行 提 取 。城 镇 地 籍 调 查 形 成 的 图件 很 多 , 街 坊 图 、 地 利 用 现 状 图 、 地 图 、 址 调 查 表 如 土 宗 界 等 。其 中最 多 的 图件算 是 宗 地 图 和 界址 渊 查表 了 , 因
2 1 年 2月 01
LISP语言在计算机科学中的应用研究
LISP语言在计算机科学中的应用研究在计算机科学领域中,各种不同的编程语言被用于开发和构建各类软件和系统,其中LISP语言也是一种非常重要的语言。
LISP语言是一种特殊的编程语言,它的设计原则被广泛应用于许多现代编程语言中。
通过对LISP语言在计算机科学领域中的应用研究,我们可以深入了解该语言的独特之处以及它为我们所带来的好处。
LISP语言的历史LISP语言是由约翰·麦卡锡(John McCarthy)在20世纪50年代初期首次开发的。
LISP是“LISt Processor”(列表处理器)的缩写,它最初的设计是为了能够处理复杂的符号运算。
该语言本质上是基于Lambda演算(Lambda calculus)的,它具有一些非常有趣的特性,例如多态性和动态类型等。
LISP语言的特点LISP语言的一个重要特点是它具有高度的表达能力和灵活性。
它可以很容易地表达复杂的数学公式和算法。
而且,LISP代码非常容易调试和修改,这使得它在计算机科学领域中非常受欢迎。
此外,LISP语言还具有丰富的数据结构和内建函数,这些功能使得它可以被用于各种不同的应用场景。
LISP语言的应用领域LISP语言可以被用于各种不同的应用领域,例如:人工智能、自然语言处理、算法设计等。
在人工智能领域中,LISP语言被广泛应用于开发专家系统、规则引擎和机器学习算法等方面。
此外,LISP语言也被用于开发其他类型的程序,例如:文本编辑器、数据库和操作系统等。
LISP语言的优势LISP语言有许多优点,这些优点使得它在计算机科学领域中被广泛使用。
LISP语言具有高级别的抽象性,这使得程序员可以在理论水平上思考和设计问题,而不是只关注具体的细节。
此外,LISP语言还具有强大的元编程能力,这意味着程序员可以用LISP语言去编写其他编程语言。
最后,LISP语言具有动态类型,这也就意味着更容易编写灵活的代码。
总结LISP语言虽然在项目中并未像其他流行语言那样常用,但它无疑是计算机科学中最重要的语言之一。
数字测图原理与应用——Lisp语言的学习和使用
数字测图原理与应用——Lisp语言的学习和使用主要内容AutoLisp语言介绍AutoLisp语言的基本知识赋值与数值计算函数自定义函数程序分支与循环函数逻辑运算函数字符串与类型转换函数表处理函数交互数据输入函数及相关的计算函数与文件有关的函数实体和设备访问类函数其它函数一、AutoLisp语言介绍LISP(List Processing)是一种计算机的表处理语言。
LISP语言是人工智能领域中广泛应用的一种程序语言。
AutoLISP语言是一种运行在AutoCAD环境下的LISP编程语言,或称为AutoCAD的一种嵌入式语言。
它采用了与CommandLISP(一种通用的LISP语言版本)相近的语法及习惯约定,并吸收了LISP语言的主要函数,同时增加了针对AutoCAD特点的许多功能,如:可以把AutoLISP和AutoCAD的绘图命令透明地结合起来,使设计和绘图完全融为一体。
利用AutoLISP语言编程可以实现对AutoCAD当前图形数据库进行直接访问和修改。
在LISP语言中,最基本的数据类型是符号表达式。
LISP语言的特点是程序和数据都采用符号表达式的形式,即一个LISP程序可以把另一个LISP程序作为它的数据进行处理。
因此使用LISP语言编程十分灵活,看起来是一个一个的函数调用。
支持递归定义也是Auto LISP语言的重要特性。
AutoLISP语言是提供给用户的主要二次开发工具之一。
用AutoLISP语言编写应用程序,可以为AutoCAD增加新的命令或修改AutoCAD,以适应用户的特殊需要。
AutoCAD软件的开发者——AutoDesk公司许诺,将保证今后AutoCAD 软件对AutoLISP语言的支持。
掌握使用和编制AutoLISP应用程序的方法和技术将大大提高用户的工作效率和二次开发水平,增强AutoCAD的灵活性,并将得到长期、稳定的技术支持。
二、AutoLISP语言的基本知识2.1 AutoLISP语言的特性AutoLISP语言是一种解释型语言,它的特点如下:1.解释型语言编程语言有两种基本类型:解释型和编译型。
Lisp使用说明
1.TXGX-修正单行文字、多行文字或块属性的小数位。
2. (defun rtos2 (number mode n / st gst sn ln cn dn )函数:RTOS函数的增强版,将指定的数字字符串转换为指定小数位的数字字符串;st为要处理的字符串,n为要保留的小数位数。
3. 2PLI--显示二维多段线上各顶点的坐标值。
4. 3PLI--显示三维多段线上各顶点的三维坐标值。
5.AAPL--该程序主要用于绘制横断面图时计算填挖方面积。
6. (defun aa4p (x1 y1 x2 y2 x3 y3 x4 y4 /)函数:给定四点计四点确定两直线之间的填挖方面积。
7. PLTR--将二维多段线顶点按相反顺序排列.8. BBG-标注标高9.SY2-拾取一个标高文本和一个点来设置坐标系.10. MBG-制作标高块BG.11.MBX-制作标高块BX.12.MBXY-制作标高块BXY13.GX-更新坐标标注.14.M2T-多行文本转换为单行文本。
15. SY-拾取已标注好的标高块来设置坐标系.16. BBX-标宽度17. BXY—标坐标18. SXY—根据标注好的坐标块设置坐标值。
19. RDTX2--拾取单行文本,多行文本的文本值。
20. GMT--规范化多行文字(command "-style" "chbz" "isocp.shx,hhztxt.shx" "0" "0.7" "0" "N" "N")21.GMT2--增强版的规范化文字22. BR1 ---指定一点将所穿越的实体截断23. BBR----指定两点将所穿越的实体截断.24. BZWB----根据标注文字位置坐标,文字方向及标注文本字符串来进行文本标注25. DMTR----将横断面图中的断面线转换为平面图中的三维点线。
Lisp语言在数字化测绘方面的运用探讨
中经常碰 到的许多 问题 , 如块 的替换 、 诸 图层管理 、 坐标 系之
间 的 转 换 以及 不 同软 件 版 本 之 间 或 同一 版 本 不 同 用 图之 间
(ec x O (o s 2 g l7 ) ; s tl x c n c ) 构造 新 列 表 1
(ec x la s c 2 e t ) s tl x (s o n )
维普资讯
La d& s u c sHe ad n Re o r e r l
经 验 荟 摹
肖祥红
雷宇斌
( 湖南省 第二 测绘 院
摘 要: 利用 L 语 言编程来解决数字化测绘生产 过程 ip s
湖南
长沙
4 O1) 1 19
(ec n m (s a e d n e ) s tl a e s nm d id x ) (ec e te t e a e ) s tl n (n g tn m )
(e u :m 0 dfnCjd (c g)
T x (3 .0 ) et) 7 ) 。它分 别表 示 高 程 点注 记 的 图元 名 、 型 、 线 块名、 标、 坐 宽度 、 度 、 体 等 属 性 。利 用 (se “ "搜 集 不 高 字 sgtx)
(o a d 一 a e … S J D - ) 打 开 居 民点层 cm n ly r M -; (o a d 一 a e o f } cm n ly r f …
层
同的选择 集 , 出每一 个元素 自身 的特 性代码 , 找 再按要 求提
出预 定 义 对 象 代 码 、 表 、 换 、 新 、 新 生 成 图 形 数 据 库 , 列 替 更 重 就 能 达 到 其 所 需 要 的 目 的 。 下 面 是 一 个 将 埋 石 图 根 点 块 “ C 1 ’专 为 非埋 石 图根 点 ‘C 1 ” 程 序 。我 们 发 现 巧 G 16, 换 车 G17的
从Lisp语言了解编程语言的解释与执行
从Lisp语言了解编程语言的解释与执行
唐诗
【期刊名称】《计算机应用文摘》
【年(卷),期】2022(38)24
【摘要】Lisp语言,命名是list与process的缩写,从某种意义上而言,这也是这门语言各种特点与功能的核心。
以此为工具,文章将逐步探讨过程与数据的本质,并在实际的使用中逐渐对抽象、状态与环境有更深入的理解。
以结论而言,我们最终会看出所谓的过程与对象并没有本质的区别。
更进一步,在理解程序语言的执行过程本质的基础上,可以构建新的语言以应对不同的实际问题。
【总页数】4页(P48-51)
【作者】唐诗
【作者单位】上海游昆信息技术有限公司
【正文语种】中文
【中图分类】TP312
【相关文献】
1.Auto LISP编程语言在板材数控加工系统中的应用
2.编程语言的演变——从Fortran,Lisp,Smalltalk到Java的进化
3.LISP编程语言在CAD绘图中的应用
4.利用LISP编程语言开发AutoCAD
5.浅谈Lisp编程语言在立面测绘中的应用
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字测图原理与应用——Lisp语言的学习和使用主要内容AutoLisp语言介绍AutoLisp语言的基本知识赋值与数值计算函数自定义函数程序分支与循环函数逻辑运算函数字符串与类型转换函数表处理函数交互数据输入函数及相关的计算函数与文件有关的函数实体和设备访问类函数其它函数一、AutoLisp语言介绍LISP(List Processing)是一种计算机的表处理语言。
LISP语言是人工智能领域中广泛应用的一种程序语言。
AutoLISP语言是一种运行在AutoCAD环境下的LISP编程语言,或称为AutoCAD的一种嵌入式语言。
它采用了与CommandLISP(一种通用的LISP语言版本)相近的语法及习惯约定,并吸收了LISP语言的主要函数,同时增加了针对AutoCAD特点的许多功能,如:可以把AutoLISP和AutoCAD的绘图命令透明地结合起来,使设计和绘图完全融为一体。
利用AutoLISP语言编程可以实现对AutoCAD当前图形数据库进行直接访问和修改。
在LISP语言中,最基本的数据类型是符号表达式。
LISP语言的特点是程序和数据都采用符号表达式的形式,即一个LISP程序可以把另一个LISP程序作为它的数据进行处理。
因此使用LISP语言编程十分灵活,看起来是一个一个的函数调用。
支持递归定义也是Auto LISP语言的重要特性。
AutoLISP语言是提供给用户的主要二次开发工具之一。
用AutoLISP语言编写应用程序,可以为AutoCAD增加新的命令或修改AutoCAD,以适应用户的特殊需要。
AutoCAD软件的开发者——AutoDesk公司许诺,将保证今后AutoCAD 软件对AutoLISP语言的支持。
掌握使用和编制AutoLISP应用程序的方法和技术将大大提高用户的工作效率和二次开发水平,增强AutoCAD的灵活性,并将得到长期、稳定的技术支持。
二、AutoLISP语言的基本知识2.1 AutoLISP语言的特性AutoLISP语言是一种解释型语言,它的特点如下:1.解释型语言编程语言有两种基本类型:解释型和编译型。
AutoLISP属于解释型语言。
在解释型语言中,用户编写的源程序直接由解释器解释并执行。
而在编译型的语言中,源代码首先要编译为一种中间格式(目标文件),然后再与所需的库文件链接,生成机器码可执行文件。
AutoCAD本身是用编译型语言写成的。
解释型语言的主要优点是在执行这种语言编写的程序之前不需要中间步骤,用户可以交互、独立于其它部分来试验或验证程序段或程序语句,而不需像编译型语言那样,每当试验程序时,要全部地编译和链接整个程序。
2.平台和操作系统独立AutoLISP语言的另一个优点是可移植性。
AutoLISP程序可以在运行于多种支持平台(如Windows、DOS、UNIX和Macintosh等)上的AutoCAD中执行而与CPU或操作系统无关。
3.AutoCAD的版本独立AutoLISP程序除平台和操作系统独立外,AutoLISP的设计还考虑了向下的兼容。
这样,任一版本AutoCAD编写的AutoLISP程序一般不加修改就可以在以后版本的AutoCAD中运行。
4.AutoLISP与主流编程语言的比较AutoLISP与目前使用比较多的编程语言(如C/C++,BASIC等)之间有一些明显的差别。
具体可体现在下述几个方面:(1)AutoLISP与其它大多数语言之间最重要的差别是它用表(List)存放数据。
AutoLISP........没有数组、联合、结构及记录,所有复杂的数据集均由表来表...........................示和处理....。
(2)AutoLISP的变量没有明确的类型。
LISP变量的类型是在赋值时动态确定的。
(3)AutoLISP不需要预先声明变量或函数。
(4)与C/C++,BASIC等语言不一样,LISP没有语句、关键词及运算符。
它是函数定位的语言,其所有运算都是由函数调用完成。
2.2 AutoLISP语言中的数据类型AutoLISP支持下述10种数据类型:●整型数●实型数●字符串●符号●表●文件描述符●AutoCAD实体名●AutoCAD选择集●内部函数(AutoLISP子程序)●外部函数(ADS、ARX函数)整型数整型数是一种不带小数点的数字,它可由0,1,2……,9,+,-共12个字符组成,例如:123,-76,+322等。
实型数实型数是带有小数点的数,它可由0,1,2……,9,+,-,E,e共14个字符组成。
实数有两种表示方法,即十进制表示法和科学计数表示法。
例如:十进制表示法:12.3,-7.6,+3.22科学计数表示法:6.1E5(610000),-0.12E2(-12),-0.45E-2(-0.0045)字符串字符串(字符串常数)由一对双引号(”)括起来的字符序列组成。
这对双引号是字符串的定界符。
字符串常数最大长度为132个字符,但表示字符串的符号名所约束的值可以是任意长度,因而可以利用“STRCAT“(字符串拼接)函数无限制地增加其长度。
字符串中,同一字母的大小写认为是不同的字符,空格是一个有意义的字符。
字符串的长度是指字符串一对双引号之间的字符个数(不包括一对双引号)。
如果字符串的定界符之间无任何字符(即””)称为空串,其长度为零。
字符串中可以包含ASCII码中任一字符,通用的表示形式为“\nnn“,nnn 为八进制形式的ASCII码。
例如:“\101\102 \103”表示“ABC”,两者的作用完全相同。
由于反斜杠“\”已作为字符串中的前导转义符,因而当字符串中要使用反斜杠时,必须加转义符,即用双反斜杠“\\”表示字符串中一个反斜杠“\”,也可以用反斜杠的ASCII码表示(即“\114”)。
同样,由于双引号已作为字符串的定界符使用,因而字符串中的双引号可以用“\””或“\042”表示。
对于一些常用的控制字符,其ASCII代码见下表。
字符代码表例如:下面的表达式表示在显示提示内容前先进行换行,然后再显示字符串内容。
(prompt “\nEnter filename:”)或(prompt “\012Enter filename:”)二者效果完全相同。
符号AutoLISP中符号用于存储数据,因此“符号”和“变量”这两个词含义相同,可以互相交换使用。
符号名可以由除下列6个字符外的任何可以打印的长度不限的字符序列来组成:“(”、“)“、“,”、“’”、“””、“;”,当这6个字符中的任一字符在符号名中出现时,将终止符号名。
不允许使用数字符号作为第一个字符。
下列为合法的符号名:ABC,!A,&AB,A3下列为不合法的符号名:(A),A.B,3A在AutoLISP中符号名的大小写是等价的。
LISP中“约束”是指对一对符号和值,当把一个值赋给一个符号时,也即把这个符号约束为那个值。
例如:(setq a 6)“!a”将显示6,表示a是一个整数,其值为6。
(setq a 6.0)“!a”将显示6.0,表示a是一个实数,其值为6.0。
(setq a “6.0”)“!a”将显示6,表示a是一个字符串,其值为“6.0”。
表表是指在一对相匹配的左右圆括号之间的元素的有序集合。
表中的每一项称为表的元素,表中的元素可以是整数、实数、字符串和符号,也可以是另一个表。
为了处理图形中点的坐标,AutoLISP对二维和三维点的坐标按如下规则表示:二维点:以分别代表x,y坐标的两个实数所构成的表(x y)的形式表示,如:(3.21 7.58)三维点:以分别代表x,y,z坐标的三个实数所构成的表(x y z)的形式表示,如:(3.21 7.58 4.68)。
表的大小用其长度来度量。
长度是表中顶层元素的个数。
例如:(setq a 6) 表的长度为3(setq a (+ c (/ d 2) ) ) 表的长度为3表有两种基本类型:标准表和引用表。
标准表是从左括号开始到配对的右括号结束。
表中的第一个元素(0号元素)必须是一个合法的已存在的AutoLISP函数。
引用表是在左括号前加一撇号,表示不对此表作求值处理.........................。
文件描述符当AutoLISP打开一个文件时,系统将给该文件赋一个数字标号,在以后要访问该文件时(读或写文件),可利用该文件描述符对指定的文件进行操作。
例如:打开一个名为:“myfile.dat”的文件,把打开文件时的文件描述符赋给符号f,再把“This is a sample under AutoLISP.”写入该文件。
(setq f (open “c:\\myfile.dat” “w”) )(print “This is a sample under AutoLISP.” f)实体名实体名是AutoCAD系统在绘图过程中赋予所绘实体的一个数字标号。
实际是指向一个AutoCAD系统内部的数据文件的一个指针。
例如:(setq elast (entlast) )注:entlast 是获取数据库中最新图元的名称。
选择集选择集一个或多个实体的集合。
它类似AutoCAD的实体选择过程。
在AutoLISP程序中也可以构造一个选择集,并把它赋予一个符号供其它函数使用。
例如:(setq ss (ssget “p”))子程序和外部子程序由AutoLISP提供的函数称为子程序(内部函数),外部子程序是由ADSRX或ARX应用程序定义的子程序。
2.3 程序结构C,VC,VB等采用“中缀表示法”例如:X=3.4AutoLISP采用的是“前缀表示法“例如:(setq x 3.4)表达式X=(A+B)*C在AutoLISP中表示为:(setq X (* ( + A B) C) )(setq a 2.3 )(setq b 6.7)(+ a b )(defun C:ff(/)(setq a 2.3 )(setq b 6.7)(setq c (+ a b ) ))2.4 求值、表达式及变量求值每个LISP程序的核心是一个求值器。
求值器读入用户的输入行(一个符号表达式),对其进行计算,然后返回计算结果。
AutoLISP的求值过程如下:(1)整形数、实型数、字符串对、文件指针和子程序以它们本身的值作为结果。
(2)符号以它们当前的约束值作为计算结果。
(3)表根据其第一个元素的类型来进行求值。
表达式所有AutoLISP表达式均为下述形式:(function_name [arguments]……)左边以左括号“(”开始,其后由函数名和函数的参数组成,最后以右括号“)”结束。
每个表达式都有一个返回值。
表达式的参数可以是一个表达式,它的返回值将被外层表达式使用。
变量AutoLISP的变量有四种类型:整型数、实型数、字符串和表。