首页

2010年5月29日星期六

Scheme/Lisp 合同(强制类型)、通讯、多回值

例如程序:
      #lang scheme

     (provide/contract
        (amount (and/c integer? positive?)) ;;约定类型必须是整数和正数
        (sum (-> number? number? number?)));;约定sum参数是两个数字,返回一个数字
      ;;如果你定义amount为一个负数或字符串、小数则都会返回你违反了约定
       ;;broke the contract (and/c integer? positive?) on amount; expected <(and/c integer? positive?)>, given: 你定义的参数(如-100,那么这里就是-100)

     (define amount 100)
      ;;然后定义sum进行计算,如果输入一个字符串(sum "name" 1)
      ;;则返回你违反了约定top-level broke the contract (-> number? number? number?) on sum; expected ;;, given: "name"
      (define sum (lambda (x y)
                              (+ x y)))
    ;;其实这也是异常捕获,我们也可以自己定义一个如:
(with-handlers ([exn:fail:contract? (lambda (x) "the is wrong!")))
      (sum "hello" 100))
    ;;现在则不会返回合同的约定了,将直接打印自己定义的匿名函数the is wrong!


今天除了学习写合同模块,还学习了使用IO/tcp协议在网络中通讯,跟我以前写的JAVA通讯录一样,属于C/S模式,不同的是,使用的语言不一样和写 法不一样,原理基本差不多。而scheme的最大好处就是不用编译,只要有解释器就能通讯,跟java一样需要加载模块,(require scheme/tcp)在scheme里面则是加载Scheme里面已经封装好了的TCP协议。
如client程序:

(require scheme/tcp) ;;加载TCP协议模块
(define list-of-env-var '(content-length query-string)) ;;定义一段话发送的时候可以直接调用此函数
(define-values (server->me me->server)   ;;链接服务器
    (tcp-connect "localhost" 8080))            ;;服务器地址和端口
(write list-of-env-var me->server);;写入消息给服务器,已经定义了一个函数 list-of-env-var 再此直接调用
(close-output-port me->server) ;;关闭输出流
(read server->me) ;;读取server发送给我的消息
(close-input-port server->me) 关闭输入流

如server程序:

(require scheme/tcp) ;;一样加载TCP协议模块
(define tcp-port-listener (tcp-listen 8080)) ;;监听8080端口
(define-values (client-me me-client) ;;连接客服机
    (tcp-accept tcp-port-listener)) ;;接受client发送的消息
(read client->me) ;;读取client发给我的信息
(write "hello!" me->client) ;;向client发送消息
(close-output-port me->client);;关闭输出流
(tcp-close tcp-port-listener);;关闭监听端口

这样在linux系统或uinx系统下面,只要知道对方的服务器IP或域名,就能直接给他发消息了。

((lambda () (values 1 2 3 4))) ;;values接受多个参数。

;;values接受多个参数进行计算。
(call-with-values
    (lambda () (values 1 2)) (lambda (x y) (+ x y)))

;;进行多个函数绑定值

(define-values (a s d f)(values 1 2 3 4))

;;使用多对进行计算,多回值。

(let-values (((x y) (values 1 2))
                    ((n m) (values 3 4)))
(+ x y m n))
;;文件的发送读入和写入的函数
with-input-from-file
with-output-to-file

以上就是我今天学习的东西,还不错,很好玩,虽然这样的流程用JAVA实现过,但是使用Scheme来实现也是很有趣的。

没有评论:

发表评论