Search


Meta

Creative


Support


Leesoft

Feed™

Recent Comments

Photos

May
13

ErLang快速入门:第一天,顺序编程

Posted by » developerly
133 hits

(本文主要翻译自http://www.erlang.org/course/course.html 建议有条件的同学可以直接看原文)

数字:

整数类型:
10
-234
16#AB10F
2#110111010
$A
浮点类型
17.368
-56.654
12.34E-10

  • B#Val是用来表示B进制的数据类型。2#101意思就是2进制数据101
  • $Char用来对后面的字符求ascii码。$A=65

原子类型(Atoms)

abcef
start_with_a_lower_case_letter
‘Blanks can be quoted’
‘Anything inside quotes \n\012′

  • 原子类型数据长度不定
  • 类似与Ruby中的Symbol数据类型,或者常量

可以用io:format方法直接打印元组(Tuples)

{123,bcd}
{123,def,abc}
{person,’Joe’,'Armstrong’}
{abc,{def,123},jkl}
{}

  • 用来储存固定数量的item
  • 可以定义为任意的类型
  • 不同于Scheme里面的tuple,scheme里面的tuple只能定义两个item

跳转后阅读ErLang快速入门:第一天,顺序编程的完整内容

Mar
16

Scheme 自学教程 3

Posted by » developerly
80 hits

条件语句

和所有的语言一样,Scheme也支持条件语句,最基本的用法是使用if:

(if test-expression

    then-branch

    else-branch)

和你所能想象的一样,如果test-expression执行结果是#t(即任何不是#f的值),就执行then语句中的分支,否则就执行else分支。当然,else分支是可选的。

(define p 80)(if (> p 70)

    'safe

    'unsafe)

=>  safe

(if (< p 90)

    ‘low-pressure) ;no “else” branch

=>  low-pressure

Scheme也通过我们在第8章将要介绍到的宏来实现了一些更加便利的方法。 跳转后阅读Scheme 自学教程 3的完整内容

Mar
16

Scheme自学教程 2

Posted by » developerly
59 hits

第三章 代码块(Forms)

读者也许注意到了,在前面那些Scheme的例子中列举了如此多的S表达式,其中 隐藏的事实是:程序就是数据。因此,#\c就是一个程序,或者我们可以称为代码块(Forms)。以后,我们会使用更加正式的词汇form来代替程序片段 这个说法。scheme执行form #\c从而得到一个值#\c,因为#\c是可以自我求值的。并不是所有的S表达式都是可以自我求值的,比如说,对于symbol的s表达式 xyz来说,其求值的是xyz本省或代表的变量。而列表s表达式(string->number “16″)求值结果是数字16。
并 不是所有的s表达是都是有效的程序。如果你写如下的代码(1 . 2),则不会通过编译。Scheme运行一个列表样式的form,首先检查第一个元素,或者说检查head,如果head被执行为一个过程 (procedure),那么剩下的则被认为是head元素的参数。这个过程就被应用(apply)于这些参数上

如果form的head是一个特殊的form,就会以一种特殊的方式来处理,这样的特殊的form,我们见过的包括begin,define和 set!,begin就意味着它的子form按顺序执行,整个form的返回值就是最后一个子form的返回值,define定义并给一个变量赋值, set!改变变量绑定的值。

译者废话:这段话翻译的真的是很费劲,你看懂了吗?我是大概理解了,如果不理解的话,欢迎与我联系

3.1 过程

We have seen quite a few primitive Scheme procedures, eg, cons, string->list, and the like. Users can create their own procedures using the special form lambda. For example, the following defines a procedure that adds 2 to its argument:

我们已经看到了好多Scheme内置的过程,包括cons,string->list等等。其实用户还可以通过著名的标志性的语句lambda自己来定义过程。比如说,下面这个例子就定义了一个自动 加2的过程:

(lambda (x) (+ x 2))

The first subform, (x), is the list of parameters. The remaining subform(s) constitute the procedure’s body. This procedure can be called on an argument, just like a primitive procedure:

第一个子语句 (x),定义了过程的参数。剩下的所有的子语句就是过程体了,定义完毕后,这个过程就可以像内置的过程那样被使用了。

((lambda (x) (+ x 2)) 5)
=>  7

当然,当然,如果我们要多次调用这个函数的话,不用这么麻烦的,记住:函数是第一公民,和整数,字符串一样,所以我们可以用一个变量来代表这个函数。

(define add2
  (lambda (x) (+ x 2)))

从此以后事情就变得简单了:

(add2 4) =>  6
(add2 9) =>  11

3.1.1 过程参数

lambda-过程的参数是在它的第一个子form中被定义的(就是符号lambda之后的第一个form),add2是一个只有一个参数——官方的说法叫做一元参数——的过程。所以他的参数列表是只有一个元素的列表 (x)还记得列表吗?这和我们熟悉的命令式语言基本一样,有一点,所有的变量x都是局部的。

同样我们可以定义两元或者多元参数的过程:

(define area
  (lambda (length breadth)
    (* length breadth)))

注意,这里我们其实可以有一个更加投机取巧的办法:

(define area *)

3.1.2 变参

学过JavaScript的,PHP的或者Python的同学一定对可变参数很熟悉了。学过Java或者C#的同学,我们很同情你们必学写很多重载来模拟这个过程。为了实现这一点。参数列表必学使用一个特殊的符号来标记(又是特殊符号,不过相对很多语言来说,Scheme里面的特殊符号或者所谓的语法糖已经很少了)这个特殊的符号就代表着将要被调用的参数。

一般来说,我们用(x …)来表示变参。一个符号,或者说一个点对类型的form (x … . z),在点对类型点前面的那部分在过程调用的时候与调用的参数进行匹配。点后面的变量,则把剩下的参数作为一个list存下来

说实话,这段话我也不太理解,主要是没有例子,附上原文,大家参考

In general, the lambda parameter list can be a list of the form (x …), a symbol, or a dotted pair of the form (x … . z). In the dotted-pair case, all the variables before the dot are bound to the corresponding arguments in the procedure call, with the single variable after the dot picking up all the remaining arguments as one list.

3.2 应用(apply)

Scheme通过使用过程 apply 来调用一个过程(第一个参数),并把这个过程应用到第二个参数的列表元素上(其实就是把第二个参数列表元素作为第一个参数过程的参数)

(define x '(1 2 3))

(apply + x)
=>  6

一般来说,apply后面跟一个参数作为所要调用的过程,在后面跟着数量不一的所要使用的其他参数。而最后一个必须是一个列表。其构造方法就是先应用过程和最后一个参数,计算出结果,然后结合其他的参数作为这个过程调用的新的参数。

(apply + 1 2 3 x)
=>  12
我理解其背后的机制应该是: (+ 1 2 3 (+ 1 2 3))

3.3 顺序

We used the begin special form to bunch together a group of subforms that need to be evaluated in sequence. Many Scheme forms have implicit begins. For example, let’s define a 3-argument procedure that displays its three arguments, with spaces between them. A possible definition is:

我们可以通过begin这个特殊的form来组织一系列的子form从而让他们可以按照一定的顺序来执行。许多Scheme的form都要求必须以begin来开始,比如如果我们要定义一个过程,按顺序

(define display3
  (lambda (arg1 arg2 arg3)
    (begin
      (display arg1)
      (display " ")
      (display arg2)
      (display " ")
      (display arg3)
      (newline)))

在Scheme中,lambda的函数中默认使用begins,所以在我们下面定义的display3中间并不需要显示的使用begin,当然使用了也没有什么坏处,不用只会让事情更简单。

(define display3
  (lambda (arg1 arg2 arg3)
    (display arg1)
    (display " ")
    (display arg2)
    (display " ")
    (display arg3)
    (newline)))

跳转后阅读Scheme自学教程 2的完整内容

Mar
16

Scheme 自学教程 1

Posted by » developerly
83 hits

http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme.html

前言

这是一篇对Scheme编程语言的介绍。其目标是作为一个快速开始的指南。也就是在更进一步了解相关概念前的一个指导性说明。

本文帮助读者能够快速开始编写实用的Scheme程序。虽然我们不会覆盖到Scheme程序的方方面面,我们也会有意回避语言中那些复杂,高深莫测,非标准或这不同寻常的特性,比如Call-with-current-continueation系统接口以及某些方言的发布。我们的讨论主要集中在问题的解决上,而不是纠缠于元语言的概念讨论上。我借此参考了很多传统的Scheme教程。本教程中将不会充斥了各种各样的说教、或者关于理论形而上学的讨论,我并不是说这些都不重要,而本教程的宗旨是为用户提供一个能够快速开始的实用指南。

跳转后阅读Scheme 自学教程 1的完整内容