- 论坛徽章:
- 0
|
管理问题?
就跟以前一样啊
我都发了十来篇了
不至于突然失忆,不会发了吧
文章内容也很普通,就是我看scheme的一些感受而已啊
内容如下
- scheme初体验
- 刚刚接触scheme,说说我的感受,可能不太准确,欢迎大虾们批评指正啊:)
- 如果习惯了c的语法,会觉得scheme的有一点诡异^O^
- scheme中的表达事和我们日常接触的有很大区别,称为前缀表达式(波兰式?),就是算符写在操作数的前面,例如3+2在scheme中会表达为(+ 3 2)。前缀式的一个好处是,一个算符可以带多个操作数,如(+ 3 2 6 9),尽管往下加吧,没有任何问题!
- 还有,scheme中的一些操作符的用法和上面的算符差相仿佛,不过操作数好像是有限制的,define就是其中之一。感觉define的功能好强大,可以定义变量,函数等等。
- 用define定义变量就跟c的定义并赋值差不多,例如用a来代表3,可以这样写
- (define a 3)
- 注意不能用=,在scheme中=是用来判断是否相等的,类似于c中的==。如,交互环境下输入(= 2 9)会打印出false,输入(= 3 3)会打印ture。
- 其实用define来定义,a不仅可以表示数字,还可以是字符串,符号(symbol),图形(image)等,后面的是c语言所不支持的。
- scheme也支持数据的封装,类似于c中的struct,但又有些面向对象的影子,如c++中的class,为什么这么说呢? 往下看了就知道 :)
- 在c语言中,定义一个结构,声明并初始化一个结构类型的变量以及获取该结构一个成员的值可以这样写:
- /* 定义结构 */
- struct a{
- int x;
- int y;
- int z;
- };
- /* 声明并初始话结构类型的变量 */
- struct a v = {2, 4, 6};
- /* 访问结构的一个成员 */
- a.x;
- 而在scheme中,整个过程如下:
- ;;定义结构
- (define-struct a (x y z))
- ;;声明并初始话结构类型的变量
- (define v (make-a 2 4 6))
- ;;访问结构的一个成员
- (a-x v)
- 一开始还真不习惯这样的语法,毕竟用了这么久的c了,怎么看怎么都觉得别扭。不过没关系,慢慢会习惯的:)
- 还是仔细分析一下流程吧。
- 首先定义一个结构和定义一个变量其实也差不多,只不过不是用define而是换成了define-struct了,然后跟两个参数,第一个是结构的名称,另一个是由所有结构成员组成的一个表。
- 随后,我们定义了结构a类型的一个变量。看那个make-a,就是构造一个a的对象然后赋给struct-a变量,是不是有点c++的构造函数的意味?这种用法其实也很简单,就是make-后加上结构的名字。
- 而结构成员的访问就有点怪异了,如果直译为c语言,相当与
- a.x v
- 让人丈二和尚摸不着头脑。
- 再仔细一看,感觉和函数调用有点相似(就我看到现在的体会是:scheme中语句和函数的区别好像不是很大,都是一个表,函数看起来象语句,语句看起来象函数,而函数的定义想c的宏,执行象宏替换)。
- 嗯,暂时就说这么多吧,有什么想法以后再补充吧。
- 顺便把我花了几十分钟才做出的一个练习帖出来:)就是那个交通灯的题目。
- ;; dimensions of traffic light
- (define WIDTH 50)
- (define HEIGHT 160)
- (define BULB-RADIUS 20)
- (define BULB-DISTANCE 10)
- ;; the positions of the bulbs
- (define X-BULBS (quotient WIDTH 2))
- (define Y-RED (+ BULB-DISTANCE BULB-RADIUS))
- (define Y-YELLOW (+ Y-RED BULB-DISTANCE (* 2 BULB-RADIUS)))
- (define Y-GREEN (+ Y-YELLOW BULB-DISTANCE (* 2 BULB-RADIUS)))
- (define (switch-bulb ccolor);;takes current color as parameter
- (cond
- [(symbol=? ccolor 'red)
- (and (and (clear-solid-disk (make-posn X-BULBS Y-RED) BULB-RADIUS)
- (draw-circle (make-posn X-BULBS Y-RED) BULB-RADIUS 'red))
- (draw-solid-disk (make-posn X-BULBS Y-YELLOW) BULB-RADIUS 'yellow))]
- [(symbol=? ccolor 'yellow)
- (and (and (clear-solid-disk (make-posn X-BULBS Y-YELLOW) BULB-RADIUS)
- (draw-circle (make-posn X-BULBS Y-YELLOW) BULB-RADIUS 'yellow))
- (draw-solid-disk (make-posn X-BULBS Y-GREEN) BULB-RADIUS 'green))]
- [(symbol=? ccolor 'green)
- (and (and (clear-solid-disk (make-posn X-BULBS Y-GREEN) BULB-RADIUS)
- (draw-circle (make-posn X-BULBS Y-GREEN) BULB-RADIUS 'green))
- (draw-solid-disk (make-posn X-BULBS Y-RED) BULB-RADIUS 'red))]))
- 本函数只有一个参数,就是当前灯的颜色。原始状态是红色的灯,如果传参数'red,则灯会变为黄色;传参数'yellow,则灯变为绿色;传参数'green,又变为红色。过几天有空把截图帖出来吧:D
复制代码
我发了n次了,一直不能成功 |
|