【Racket】安装与入门
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】安装与入门相关推荐
- Python:Scrapy的安装和入门案例
Scrapy的安装介绍 Scrapy框架官方网址:http://doc.scrapy.org/en/latest Scrapy中文维护站点:http://scrapy-chs.readthedocs. ...
- windows下nodejs express安装及入门网站,视频资料,开源项目介绍
windows下nodejs express安装及入门网站,视频资料,开源项目介绍,pm2,supervisor,npm,Pomelo,Grunt安装使用注意事项等总结 第一步:下载安装文件 下载地址 ...
- TensorFlow 安装及入门
安装 入门 TensorFlow简介 基本操作 loading lazy 安装 上TensorFlow官网按照教程安装. 入门 以下学习内容follow这篇博客 TensorFlow简介 Tensor ...
- Ubuntu 18.04 安装 redis入门使用
Ubuntu 18.04 安装 redis入门使用 1.安装 sudo apt-get install redis-server 2.查看redis运行状态 ps -ef | grep redis 3 ...
- IDE之EcliPse:EcliPse软件的简介、安装、入门、使用方法之详细攻略
IDE之EcliPse:EcliPse软件的简介.安装.入门.使用方法之详细攻略 目录 EcliPse软件的简介 Eclipse特点 EcliPse软件的安装 EcliPse软件的入门 1.快捷键集合
- Python:Python多种集成开发环境(IDE,编译器)的简介、安装、入门、使用方法之详细攻略
Python:Python多种集成开发环境(IDE,编译器)的简介.安装.入门.使用方法之详细攻略 目录 Python多种编译器的简介.安装.入门.使用方法 1.Anaconda 2.ipython ...
- Postman:Postman简介、安装、入门使用方法详细攻略
Postman:Postman简介.安装.入门使用方法详细攻略 目录 Postman简介 Postman安装 Postman入门 1.图文教程 1.1.get案例 1.2.post案例 1.3.get ...
- Ansible 安装和入门
Ansible 安装和入门 Ansible安装 ansible的安装方法有多种 EPEL源的rpm包安装: [root@ansible ~]#yum install ansible 编译安装 yum ...
- [Python爬虫] scrapy爬虫系列 一.安装及入门介绍
前面介绍了很多Selenium基于自动测试的Python爬虫程序,主要利用它的xpath语句,通过分析网页DOM树结构进行爬取内容,同时可以结合Phantomjs模拟浏览器进行鼠标或键盘操作.但是,更 ...
- Git、TortoiseGit、GitHub、Gitee、GitLab 安装与入门使用
Git.TortoiseGit.GitHub.Gitee.GitLab 安装与入门使用 Git.TortoiseGit.GitHub.Gitee.GitLab 简介 Git TortoiseGit G ...
最新文章
- 介绍一下你对浏览器内核的理解?
- 2018年【计算机视觉机器学习人工智能】国际重要会议汇总
- Flink-on-yarn
- 使用QUIC协议实现实时视频直播0卡顿
- 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)码农网
- git 代码回滚_能提交到远程的Git回滚
- 【Flink】Flink Checkpoint 问题排查实用指南
- 怎么把mxf转换成mp4?
- 解决小牛电动自行车电池不能输出电压
- 【阅读分享】《暗时间》——放弃学习,寸步难行
- Offcie 安装出现1706的错误
- 初学Spring Cloud踩得坑之Caused by: org.springframework.context.ApplicationContextException
- 艾默生首席执行官范大为退休;液化空气将新建生产装置为京东方供应气体 | 美通企业日报...
- 什么是抓包 为什么要抓包
- Powershell 过火绒免杀上线
- 关于python语言和人工智能以下哪个说法不正确_以下关于机器学习说法正确的是?_学小易找答案...
- 极海APM微控制器基于IAR开发环境搭建与工程调试配置方法
- matlap实现肺实质区域初始分割,去除肺部气管及背景
- Lightroom 与 Lightroom Classic 的区别,有什么不同之处
- 【2023注册测绘师考试综合能力考试攻略】 ——大地测量的考点试题汇编及参考答案
热门文章
- ( 教程 ) 微信公众号做淘宝优惠券自动查券返利机器人怎么设置?
- 云服务器网站logo,云服务器 logo
- 愚人节里的巧合与必然:BAT等亮出的AI招牌故事
- 计算机无法删除tf卡的内容,内存卡的文件删不掉怎么办?
- 笔记本CPU处理器HQ,H,U,M,型号之间的区别
- gitlab无法推送
- html表格左边锁定,表头锁定
- xp启用计算机共享打印机,xp系统和win7系统怎么共享打印机_xp如何连接 win7共享打印机...
- CISCO路由器license激活图解教程
- 计算机基础表格制作教学设计,word中表格制作教学设计精选