
MyLisp项目
文章平均质量分 90
栖林_
一个励志于做全栈工程师的平平无奇大学生,希望在这里留下自己学习的记录
展开
-
MyLisp项目日志:函数
直接使用Lambda定义函数蛮不错的,但是语法略显笨拙,需要涉及很多括号和符号,我们可以舱室用一些更简单的语法来编写一个定义函数的函数从本质上来讲很简单,我们想要的是一个可以同时执行两个步骤的功能首先第一步是他应该能创建一个函数,然后将其定义为名称,这一步我们直接用def就可以做到第二步是我们需要人用户提供一个列表,就是args作为形式参数,body作为函数主体lambda应该是这样的然后用def定义一下。原创 2024-03-29 17:53:04 · 672 阅读 · 1 评论 -
MyLisp项目日志:变量与环境
我们之前已经实现了相当多的功能,例如波兰表达式的处理与计算,S表达式,Q表达式,我们甚至可以吧代码本身放到列表里,现在我们需要为MyLisp添加变量的功能了到目前位置,我们所添加的变量是不可变的,只是暂时我们还没有添加这个功能罢了当我们在计算一个表达式的时候,他的基本逻辑是删除先前的事物(表达式),返回新的事物(结果)所以我们的变量其实只是命名值的一种方式,给值分配一个名称,然后在需要的时候获取该值的副本为了允许命名,我们需要创建一个结构体,存储命名中的所有内容的名称和值,我们称之为环境,当我们开始创建一个原创 2024-03-22 12:11:43 · 883 阅读 · 0 评论 -
MyLisp项目日志:Q表达式
从这以后我们可以发现,给这个编程语言添加某个特性都有一定的步骤这里我们会实现一个新的Lisp值类型,叫做Q表达式(Quoted Expression),与S表达式一样,也是Lisp表达式的一种,但他不受Lisp求值机制的作用也就是说,当受到函数作用时,Q表达式不会被求值因此我们可以使用Q表达式来存储和管理其他的Lisp值类型,例如数字,符号,S表达式在添加Q表达式之后,我们需要定义一些操作来管理,类似于之前的数学操作,这些操作定义了Q表达式的具体行为Q表达式与S表达式非常类似,不同的是Q表达式存在大括号内,原创 2024-03-20 10:42:38 · 999 阅读 · 0 评论 -
MyLisp项目日志:S表达式
这样的话,那我们的结构体也要重新设计了,除了之前的类型和数字,把错误直接改成了char*,可以存储具体的错误内容,符号也可以直接存储,最后的cell表示列表结构,使用count表示列表元素的数量。Lisp的程序代码也是数据形式的一种,这个结构被称之为S表达式,他存在一个Lisp列表中,我们需要用这个列表结构递归的表示出数字、操作符号和其他的列表,因此我们需要扩展。如果输入的是S表达式,遍历所有子节点,如果遇到错误,则报错,如果没有子节点,则直接返回他的内容即可。函数是用于计算的函数,与之前的计算函数类似。原创 2024-03-19 14:12:55 · 786 阅读 · 0 评论 -
MyLisp项目日志:波兰表达式计算与错误处理
如果直接使用栈将中缀转化为前缀,以字符串的方式逐个转化,会遇到空格无法正常转换的问题,而空格非常重要,例如1 2 和12就是两个数字和一个数字的区别,其次是负数的问题,例如 -1和 - 1的问题,既可以解释成负1也可以解释成减1。对于数学计算来说,有一些特殊的处理,例如除数不为0,模的数不为0,当我们直接输入就会出错,但是不同编译器的处理不同,甚至有的会直接崩溃。为例达到上面的目的,我们将类型(数字或者错误),具体的数值,具体的错误封装成一个结构体,命名为MLval,意为MyLisp val。原创 2024-03-17 12:08:00 · 663 阅读 · 0 评论 -
MyLisp项目日志:解析用户输入与波兰表达式
我们需要创建两个解析器,类型是,分别命名为Noun和Adjective,作为两个变量再使用mpc_or函数表示创建一个解析器,返回值是解析器,参数是解析的符号(单词),而这些单词之间是或的关系,只要出现一个即可,使用mpc_sym函数,他会将字符串转换为符号(语句)写成代码就是下面的样子// 建立名词解析器// 建立形容词解析器接下来我们就要使用名词解析器和形容词解析器来构造短语解析器同理我们直接使用mpc_and函数即可,然后我们再用和free指定各个语句的组织和删除方式,暂时先忽略他们。原创 2024-03-16 18:03:10 · 1036 阅读 · 0 评论 -
MyLisp项目日志:项目介绍和读取输入实现
这是一个超轻量级的C/C++项目,使用C/C++模拟实现一个简单的Lisp(一种函数式程序设计语言),会使用一些外部的库进行初始化工作,例如mpc、editline等我们会使用类Python的REPL模式,使用Lisp程序,并不直接提供系统的编译运行环境,整个代码量大概在1000行左右主要难点我将会在这里逐步实现这个小项目并记录实现过程中出现的问题以及解决方案会先使用C语言实现,再考虑使用C++补充和优化。原创 2024-03-15 09:47:11 · 422 阅读 · 0 评论