apue实验(二):cat 标准输入与输出

c++ 版:

#if HAVE_CONFIG_H
# include <config.h>
#endif

#include <sys/types.h>
#include <sys/uio.h>
#include <unistd.h>

#include <iostream>

int main(void){
    int n;
    const size_t buffersize= 10240;
    char buf[buffersize];
    while( (n=read(STDIN_FILENO,buf,buffersize))>0) {
    if(write(STDOUT_FILENO,buf,n) !=n)
    std::cerr<<"write error\n"<<std::endl;
    }
    if(n<0)
    std::cerr<<"read error"<<std::endl;
    return 0;
}

ocaml 版:

let rec mainloop buf buffersize= 
begin match
Unix.read Unix.stdin buf 0 buffersize;
with
0 -> ();
| n when n>0 ->
begin match
Unix.write Unix.stdout buf 0 n;
with
l when l=n -> mainloop buf buffersize;
| _ -> Printf.printf "write error\n";
end
| n when n<0 -> Printf.printf "read error\n";
end

let _=
let buffersize=10240 in
let buf=String.create buffersize in
mainloop buf buffersize;

我好像用match用的太过分了……
本来应该用if...else...的,在functional programming中用if...else...应该不算犯讳吧?
这次学会了let...in,是因为我在写程序的时候emacs的自动缩进让我意识到这点的。fp中的赋值语句是有层次的,呵呵……

一个疑问是,ocaml中的参数是passed by value,还是 passed by reference ?
对于fp而言,传参方式和传参顺序一般不算问题。但是这里就很重要了。
首先,string不是一个constant value.它唯一被固定的就是size.
其次,如果我的buffer不是实现分配好后传递给loop,而是在recursive function 内分配,语法上没错,但是执行的时候……后果是可想而知的。

ocaml并不是一个纯粹的functional programming language,不知道这个算不算是一个example?
呵呵,我不懂fp,还请指教。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥