#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 ;;
(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来实现也是很有趣的。
没有评论:
发表评论