Lisp

Lisp是一个语言家族,曾今有很多方言,没有办法,Lisp实在是过于强大,以至于创造一门方言实在不是什么难事。目前主流的Lisp方言是Common Lisp(也就是常说的CLisp)和Scheme。Racket是在基于Scheme发展起来的,当然也是Lisp的一种方言。

在CLisp和Racket中间,我最终选择了Racket。一个原因是Racket更新更活跃。打开两者的官网,CLisp最近一次更新还是在2010年,而Racket最近一次更新是在今年2月份。另一个原因是Racket官网上文档更详细,对于初学者来说,一个好的官网太重要了。最后还有一点是LeetCode是支持Racket刷题的。就像林正英在《败家仔》中所说,“八仙桌是练咏春短桥的摧打手”,LeetCode其实也是练习语法的好地方。

安装

安装Racket是我见过最方便的。首先去官网下载安装包,安装完即可。而且这玩意儿是自带IDE的!安装完成以后你会得到两个东西,一个是Racket,另一个是DrRacket,前者是命令行工具,后者是图形编辑器。

DrRacket

关于DrRacket的使用,Racket官网也有详细的文档。

DrRacket也带一个解释器,我把它调成了左右模式。鼠标放到符号上能自动高亮用到的地方,如果是关键字会高亮显示导入的包。右边可以执行任意Racket表达式,也可以执行左边的代码,甚至你都不需要保存。

DrRacket默认是英文,可以点击帮助→使用简体中文切换到中文模式。

格式化代码:ctrl+i

打开自动完成:ctrl+/

有了这两个快捷键还是挺舒服的。不过遗憾的是没有自动补全括号,不知道是否有这样的插件(真是懒到家了)。

DrRacket查看帮助也是十分方便的,只需要将光标移到某个单词上,然后按F1,DrRacket就会在浏览器中打开帮助文档。

入门

Racket的表达式必须()包裹,(后紧跟的是关键字或函数,基本结构为(表达式),例如:

#lang racket
(+ 1 1)

#lang racket指定使用Racket语言。注意,Racket中的函数都是前缀函数。因此我们不能写1+1,而必须写成(+ 1 1)

如果你知道抽象语法树的话,一定会内心狂喜。Racket的语法就是抽象语法树的前序遍历,为了前序遍历可以唯一表示一棵树,因此必须用()进行分界标识。

在Haskell中中缀函数可以放在()中变成前缀函数,比如(+) 1 1。同样,前缀函数也可以放在``中变成中缀函数,比如:

1 `elem` [1,2,3]

定义变量

Racket使用define关键字定义变量和函数,对于函数式语言来说函数和变量并无本质区别。

定义变量的语法为(define 变量名 表达式)

#lang racket
(define a 1)
(define b (+ 1 2 3))

Racket并不是严格的纯函数式语言,它的绑定是可以修改的,因为我们也用了“变量”这个词。

#lang racket(define a 1)
(set! a 2)

此时a的值是2。

定义函数

定义函数和定义变量的语法类似,函数名和参数放在括号中以空格分隔,紧接着的是函数体,函数体是多个表达式,最后一个表达式的值是整个函数的值。语法为(define (函数名 参数...) (表达式)...)

函数也可以没有参数,但是函数名两边的括号还是不能省略的。

#lang racket
(define a 1)(define (add-a) (set! a (+ a 1)))
(define (add-a-x x) (set! a (+ a x)))

变量定义并不一定要在使用之前,你可以以任意顺序书写代码。

注释

Racket有3种注释,两种是给人看的,一种是给编译器看的。

第一种是单行注释,以;开始,有时为了强调也会用;;开始。

#lang racket
;单行注释
;;还是单行注释

第二种是多行注释,用#|...|#包裹。

#lang racket
#|
这是多行注释#|并且可以嵌套|#
|#

第三种是代码注释,以#;开始,它会让编译器忽略掉其后的一个表达式。

#lang racket(+ 1 1 (* 2 4)) ;10
(+ 1 1 #;(* 2 4)) ;2
(+ 1 #;1 (* 2 4)) ;9

仔细观察上面的代码与结果,#;后面的表达式是不被编译的。

猜数游戏

最后我们以一个猜数游戏结束本章。这个游戏是让计算机来猜你心里想的数,其实就是一个经典的二分查找算法。

我们一共定义3个函数,guss用来猜一个数,smaller用来告诉程序猜的数太大了,应该再小点,bigger正好相反,它告诉程序应该往大了猜,start函数用来启动游戏。

#lang racket(define lower 1)
(define upper 100)(define (start m n)(set! lower (min m n))(set! upper (max m n))(guss))(define (guss)(quotient (+ lower upper) 2)) ;quotient函数用来求商(define (smaller)(set! upper (max lower (sub1 (guss)))) ;sub1函数将参数减去1(guss))(define (bigger)(set! lower (min upper (add1 (guss)))) ;add1函数将参数加上1(guss))

使用时输入(start 1 100)启动游戏,然后输入(smaller)(bigger)告诉程序是应该往小还是往大了猜。

【Racket】安装与入门相关推荐

  1. Python:Scrapy的安装和入门案例

    Scrapy的安装介绍 Scrapy框架官方网址:http://doc.scrapy.org/en/latest Scrapy中文维护站点:http://scrapy-chs.readthedocs. ...

  2. windows下nodejs express安装及入门网站,视频资料,开源项目介绍

    windows下nodejs express安装及入门网站,视频资料,开源项目介绍,pm2,supervisor,npm,Pomelo,Grunt安装使用注意事项等总结 第一步:下载安装文件 下载地址 ...

  3. TensorFlow 安装及入门

    安装 入门 TensorFlow简介 基本操作 loading lazy 安装 上TensorFlow官网按照教程安装. 入门 以下学习内容follow这篇博客 TensorFlow简介 Tensor ...

  4. Ubuntu 18.04 安装 redis入门使用

    Ubuntu 18.04 安装 redis入门使用 1.安装 sudo apt-get install redis-server 2.查看redis运行状态 ps -ef | grep redis 3 ...

  5. IDE之EcliPse:EcliPse软件的简介、安装、入门、使用方法之详细攻略

    IDE之EcliPse:EcliPse软件的简介.安装.入门.使用方法之详细攻略 目录 EcliPse软件的简介 Eclipse特点 EcliPse软件的安装 EcliPse软件的入门 1.快捷键集合

  6. Python:Python多种集成开发环境(IDE,编译器)的简介、安装、入门、使用方法之详细攻略

    Python:Python多种集成开发环境(IDE,编译器)的简介.安装.入门.使用方法之详细攻略 目录 Python多种编译器的简介.安装.入门.使用方法 1.Anaconda 2.ipython ...

  7. Postman:Postman简介、安装、入门使用方法详细攻略

    Postman:Postman简介.安装.入门使用方法详细攻略 目录 Postman简介 Postman安装 Postman入门 1.图文教程 1.1.get案例 1.2.post案例 1.3.get ...

  8. Ansible 安装和入门

    Ansible 安装和入门 Ansible安装 ansible的安装方法有多种 EPEL源的rpm包安装: [root@ansible ~]#yum install ansible 编译安装 yum ...

  9. [Python爬虫] scrapy爬虫系列 一.安装及入门介绍

    前面介绍了很多Selenium基于自动测试的Python爬虫程序,主要利用它的xpath语句,通过分析网页DOM树结构进行爬取内容,同时可以结合Phantomjs模拟浏览器进行鼠标或键盘操作.但是,更 ...

  10. Git、TortoiseGit、GitHub、Gitee、GitLab 安装与入门使用

    Git.TortoiseGit.GitHub.Gitee.GitLab 安装与入门使用 Git.TortoiseGit.GitHub.Gitee.GitLab 简介 Git TortoiseGit G ...

最新文章

  1. 介绍一下你对浏览器内核的理解?
  2. 2018年【计算机视觉机器学习人工智能】国际重要会议汇总
  3. Flink-on-yarn
  4. 使用QUIC协议实现实时视频直播0卡顿
  5. 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)码农网
  6. git 代码回滚_能提交到远程的Git回滚
  7. 【Flink】Flink Checkpoint 问题排查实用指南
  8. 怎么把mxf转换成mp4?
  9. 解决小牛电动自行车电池不能输出电压
  10. 【阅读分享】《暗时间》——放弃学习,寸步难行
  11. Offcie 安装出现1706的错误
  12. 初学Spring Cloud踩得坑之Caused by: org.springframework.context.ApplicationContextException
  13. 艾默生首席执行官范大为退休;液化空气将新建生产装置为京东方供应气体 | 美通企业日报...
  14. 什么是抓包 为什么要抓包
  15. Powershell 过火绒免杀上线
  16. 关于python语言和人工智能以下哪个说法不正确_以下关于机器学习说法正确的是?_学小易找答案...
  17. 极海APM微控制器基于IAR开发环境搭建与工程调试配置方法
  18. matlap实现肺实质区域初始分割,去除肺部气管及背景
  19. Lightroom 与 Lightroom Classic 的区别,有什么不同之处
  20. 【2023注册测绘师考试综合能力考试攻略】 ——大地测量的考点试题汇编及参考答案

热门文章

  1. ( 教程 ) 微信公众号做淘宝优惠券自动查券返利机器人怎么设置?
  2. 云服务器网站logo,云服务器 logo
  3. 愚人节里的巧合与必然:BAT等亮出的AI招牌故事
  4. 计算机无法删除tf卡的内容,内存卡的文件删不掉怎么办?
  5. 笔记本CPU处理器HQ,H,U,M,型号之间的区别
  6. gitlab无法推送
  7. html表格左边锁定,表头锁定
  8. xp启用计算机共享打印机,xp系统和win7系统怎么共享打印机_xp如何连接 win7共享打印机...
  9. CISCO路由器license激活图解教程
  10. 计算机基础表格制作教学设计,word中表格制作教学设计精选