2.2简单定义和表达式
文档说明 表示0个或者多个 +表示一个或者多个 {}表示括号内的东西当做一个元素处理
2.2.1定义
(define
(define (
函数本质上也是一种值,只不过打印出来的是简略形式。number,string是完整的形式。
2.2.2代码缩进
换行和缩进对racket来说并没有意义,但是大部分racket程序员用标准的代码风格来是程序更具有可读性。比如,方法体经常在定义的下一行并且缩进。标识符直接写在开括号的后面,没有额外的空格,闭括号不写在当前行。
当你在DrRacket里面的程序或者repl表达式里输入回车,DrRacket都会自动缩进代码到标准格式。比如,当你输入(define (greet name)然后敲击回车,DrRacket自动为下一行插入了两个空格。如果你移动了代码区域,输入tab将会重新缩进代码。像Emacs这样的编辑器,也提供了racket或者scheme模式来支持相似的缩进功能。
缩进不只是让代码更容易阅读,通过你代码的缩进方式还可以提供额外的反馈表明括号匹配。比如,你在参数定义的最后遗漏了闭括号。那么自动缩进在第一个参数的下方,正确的时候应该在define关键字下方。
在这种情况下,缩进可以帮助我们发现错误。
2.2.3标识符
除了( ) [ ] { } " , ' ` ;
# | \ 和数字之外的所有字符都可以作为标识符。
2.2.4 函数调用
racket 有很多预定义的内部函数
substring 提取子串
string-append 连接字符串
string-length 获得字符串长度
string? 判断是否字符串
sqrt 平方根
number?判断是否数字
equal? 比较是否相等
2.2.5条件if and or cond
(if
第一个
if可以内嵌其它的表达式,但是可读性比较差,涉及到多个条件的时候,可以使用and或者or。
and or 都是短路表单式。
cond 表达式 (cond { [?expr??expr?]} )
方括号的含义和括号一样,只是为了可读性
2.2.6 函数调用
(
第一个表达式是一个
2.2.7匿名函数lambda
(lambda (?id?*) ?expr?+)
当我们处理只使用一次的函数时,可以使用匿名函数。lambda函数的另外一个作用是作为函数的返回值。racket是词法作用域的语言,函数创建时的变量将被函数记录。(闭包特性)。以下两个函数等价。
(define (louder s) (string-append s "!"))
(define louder (lambda (s) (string-append s "!")))
2.2.8 局部绑定 define let let*
(define(?id??id?) ?definition? ?expr?+)
(lambda(?id?) ?definition? ?expr?+)
局部定义在函数体之前。
(let ( {[ ?id? ?expr? ]}* ) ?expr?+)
每一个绑定的表达式都被方括号围绕。而且绑定表达式之后的语句是let的方法体。在每一个绑定表达式里,id都与expr的结果绑定,并在方法体力使用。
【2.2简单定义和表达式】let的作用范围只在方法体之内,所以绑定子句没发无相引用。但是使用let*就可以。
推荐阅读
- vue|vue项目你一定会用到的性能优化!
- iOS开发自定义页脚和页眉技巧详解
- 自定义TextView适配不同设备下的字体大小(Android)
- UITextView|UITextView 光标定位定位
- 刷机技术贴|安卓机型app的编译与反编译 apk文件的简单说明与解析
- 面试|Android studio连接MySQL并完成简单的登录注册功能
- 投稿|苹果或将上调iphone14定价,消费者还会买单吗?
- 记一次简单的生产环境Mysql调优
- 11.10
- Python|OpenCV简单应用(三、边缘检测及轮廓检测)