C语言编程变量类型或者输出的一个问题

大家好,感谢邀请,今天来为大家分享一下编程语言为什么有变量类型这个概念的问题,以及和lisp中不建议用变量的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!

本文目录

  1. Autolisp如何使用键盘
  2. 赋值变量可以是函数名吗
  3. 编程语言为什么有变量类型这个概念
  4. lisp 词法分析

Autolisp如何使用键盘

在AutoLISP中,您可以使用`(getkword)`函数来读取用户在键盘上输入的关键字。此函数将暂停程序执行,直到用户输入一个合法的关键字。

您可以按照以下步骤使用键盘:

1.使用`(getkword)`函数获取用户的关键字输入。例如,`(setquser-input(getkword"请输入一个关键字:"))`将等待用户输入一个关键字,并将其存储在变量`user-input`中。

2.根据用户的输入执行相应的操作。您可以使用`if`或`cond`语句来根据用户的输入做出不同的响应。例如:

```

(if(equaluser-input"A")

(progn

(setqx1)

(setqy2)

(command"line"xy)

)

(if(equaluser-input"B")

(progn

(setqradius5)

(command"circle"radius)

)

(princ"无效的输入")

)

)

```

在上面的例子中,如果用户输入"A",则创建一条从点(1,2)开始的直线;如果用户输入"B",则创建一个半径为5的圆;否则,打印出"无效的输入"。

这样,您就可以根据用户在键盘上输入的关键字执行相应的操作。请记住,AutoLISP是用于自动化AutoCAD的编程语言,因此与键盘交互通常用于接收用户的命令和输入,并执行相应的CAD操作。

赋值变量可以是函数名吗

不能,你赋给变量的最终只是函数指针,而形式上,写的是函数的名字,好像LISP这样的语言可以给变量赋给真正的函数。C++中函数可以接受函数类型,但是不能返回函数类型(通过typedef可以声明这种类型),其实质,都是函数指针,就是一个4字节无符号整型。

编程语言为什么有变量类型这个概念

▇首先,我们需要搞清楚类型的由来。

编程语言中所谓的类型,具体指的是数据(包括对象)的类型。数据类型的产生有概念和物理两个方面因素:

概念因素:数据因其本身内容在中我们脑子里对应的数学概念不同而进行的分类,常见类型有:数字(正整数、整数、小数、复数)、布尔、字符、符号、空、以及各种数据结构(字符串、数组、向量、列表、字典、集合、函数、...),这些类型是在我们长期的数学应用中就形成的,是对外部概念的抽象;物理因素:我们在计算机语言中所定义的数据,最终需要实现在物理机器上,而非仅仅是大脑中的数学概念,这就要求,知道数据的大小、编码格式、等这样的物理信息,根据这些信息就可以将数据分类,例如:C语言中,同样是整数却因大小不同而分为:char,short,long,longlong,这些类型是因为物理实现而产生的;

若,将所有计算机语言,按照接近程度,从机器到数学排成一列,则越靠近机器这边的语言,其数据类型越受物理因素影响,例如:汇编、C/C++,反之,越接近数学的语言的数据类型越会围绕数学概念进行设计,例如:Lisp、R、JavaScript。

▇接着,我们来看变量与数据类型的关系。

在所有计算机语言中,大体有两种看待变量的方式:

变量是保存数据的容器;变量是访问数据的入口;

●采用第一种方式的计算机语言:

因为变量需要保存数据,所以变量受其保存的数据的类型制约。

将数据保存到同类型变量的过程,称为赋值。

在我们声明变量时,计算机要给这个变量分配内存,这时,计算机至少需要知道这个变量将来的赋值数据的物理大小,于是,计算机语言,不得不要求,声明变量时,必须指出其赋值数据的类型(包含物理大小信息)。另一方面,根据数据类型对变量被分配的内存将伴随它的整个生命周期,同时,在访问变量中数据时还会使用数据类型,这就意味着,声明时指定的那个本意是赋值数据的类型变成了该变量的类型,这就是所谓的变量类型。

这种,变量有类型的语言,称为强类型语言。

●采用第二种方式的计算机语言:

其变量仅仅保存,数据在对象池中的,入口地址,而不保存数据。将数据入口地址保存到变量的过程,称为绑定。我们在声明变量时,计算机只需要分配一个保存绑定地址的内存块就可以了,无需知道将要绑定的什么数据,于是变量也就没有了类型。

这种,变量没有类型的语言,称为弱类型语言。

▇最后,我们来比较一下强弱两种类型的语言。

早期,强类型语言,都是编译(静态)语言,例如:C/C++,Fortran,Pascal等,这类语言,没有强大的运行时来支持对象池,因此只能采用第一种方式。而早期,弱类型语言,都是解释(动态)语言,例如:Lisp,Scheme等,它们有强大的解释器,其中包括对象池,因此可以采用第二种方式。

强类型语言,有一个非常大的优势,那就是:编译器知道变量的类型,可以提前检查赋值错误,再加上,编译语言的运行性能优势,这使得,强类型语言,在上世纪中叶很快成了主流。但是,强类型的优势也是缺陷,这就是:由于变量带有类型,所以代码和类型强关联,很难写出同时适用于多种类型的代码,为了修补这个缺陷,几乎同时出现了两种解决方案:

从宏(模板)发展出来的泛型;面向对象(OOP);

泛型使得,类型可以成为某个代码块的参数,在使用该代码块时被具体制定。

面向对象,利用继承让子类对象复用父类对象的代码块。

在经过,泛型和OOP改造后,强类型语言在千禧年前后,到达了顶峰,以至于这时,出现的Java和C#这样的动态编译语言,也采用强类型。

但是,弱类型语言并非一无是处:没有变量类型是天然的泛型、OOP也可以引入、适用于脚本代码,因此,才有JavaScript和Python这样的弱类型语言,随着计算机性能的飞速发生使得强类型语言的性能优势慢慢削弱,而弱类型语言的简单灵活慢慢凸显,这使得,如今的它们也正是如日中天。

计算机源于数学,早在第一台计算机出现之前,数学家就对可行性计算问题进行了深入的研究,先后出来了:递归函数、λ-演算、图灵机,之后图灵机称为了计算机体系结构的数学原理,而λ-演算正是函数式编程的本质。因此,我们可以从数学角度来稍微看一下变量(常量)类型。

在数学中,变量是有类型的,常见应用场景有:

场景一:对于任意x∈?,...,例如:对于任意a,b,c,d∈?,都有(a2+b2)(c2+d2)≥(ac+bc)2;场景式二:令x=1,...,例如:令K={(1),(1,2)(3,4),(1,3)(2,4),(1,4)(2,3)},则S?有正规群列{e}?K?A??S?;

因此,强类型更符合数学,如场景一那样,于是有些的新兴强类型语言,会进一步吸收数学的特点,这些语言允许程序员不指定变量类型,它是通过上下文来推算出变量的类型,如场景二那样。

变量是否有类型,仅仅是计算机语言的类型系统的一部分,即便是同为,强或弱类型语言,其类型系统也差距较大,以下是一些类型系统具有代表性的语言:

C语言,代表命令式编程,其类型系统以过程为核心进行设计;C++语言,代表传统多继承面向对象,其类型系统多继承类-对象为核心;Java语言,代表传统单继承面向对象,其类型系统单继承类-对象为核心,以接口弥补单继承的不足;JavaScript语言,代表原型链单继承面向对象,其类型系统构造函数-原型链为核心;Scala语言,代表加入特性的面向对象,特性的加入弥补的单继承的不足;Lisp语言,代表传统函数式编程,其类型系统以符号表达式为核心;Haskell语言,代表加入范畴的函数式编程,数学中的类型,就本质而言,就是基于集合(或者比集合更大的类)之上的各种数学系统,目前最大的代数系统是范畴,Haskell采用的就是以范畴为核心的类型系统;

当然,类型系统,还包括宏和泛型,Scheme的卫生宏、C#的泛型,都是典型代表。

另外,除了类型系统外,计算机语言设计的另外一个重点,就是代码流程控制,例如:面向侧面、懒惰模式、后继体、等,按照控制流也可以对计算机语言进行分类。

lisp 词法分析

1.作为动态语言,提供了命令行交互和脚本执行两种运行方式。现在在写lua和C/C++的接口。(这是一个运行在虚拟机上的伪虚拟机)

2.变量类型:number、string、list、boolean、function。list其实就是lua的table,去掉了hash表部分,只保留数组部分。

3.语法上对lisp的cda、cdr进行了模拟…提供了’作为quote的语法糖

4.对于转义字符全部用%实现了,比如%n%t%a等

5.作用域:可定义全局globe或者局部变量local,lua对此非常好实现。

6.if条件分支、for遍历列表、while循环:是的,由于lua对递归次数有限制,我们不能够像普通的函数式语言那样用递归来代替循环,因此提供了面向过程的范式

7.函数的定义、调用,由于是函数式语言,所以函数可以作为函数参数,可以被函数返回,是第一类变量

8.对lua5.3中的几个标准库:math、os、io、table、string进行了封装,部分函数进行了修改。因此可以进行数学运算、时间操作、文件文件夹操作、输入输出及其重定向、列表的删增减改、字符串的查找删除正则表达式等。

9.提供了一个小小的标准库,定义了一些个人觉得常用的操作。

10.实现了python的高阶函数:map、filter、reduce、sort、偏函数等。将函数作为参数传入

11.模块扩展:你可以支持动态的导入.lisp文件,意味着可以按照模块的方法来组织程序。

12.可以像C/C++支持lua那样,利用lua甚至C/C++来为lisp提供库。

13.可以有注释

编程语言为什么有变量类型这个概念的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于lisp中不建议用变量、编程语言为什么有变量类型这个概念的信息别忘了在本站进行查找哦。

编程语言类型浅谈比较