It was with great trepidation that I wrote this:
proc serve_directory(k:socket_t, fname:string)
{
var dirname = Filename::basename fname;
fun rf(f:string)=>' <a href="/$'+ fname + '/' +f+'">'+f+'</a>';
var eof_flag = false;
val top = "A DIRECTORY " + fname + "\r\n";
val flist =
match FileSystem::filesin fname with
| Some ?files =>
let ?aux =
fun (ls2:list[string] * list[string]) (f:string) =>
match ls2 with | ?ds,?rs => match FileSystem::filetype
(Filename::join (fname,f)) with
| DIRECTORY => Cons (f,ds), rs
| REGULAR => ds, Cons (f,rs)
| _ => ls2
endmatch
endmatch
in
let ?dirs,?regs = fold_left aux (Empty[string], Empty[string]) files in
"<pre>"+
' <a href="/"><em>home</em></a>\r\n'+
' Directories: \r\n' +
(fold_left (fun (acc: string) (f:string) =>
match f with
| "." => acc
| ".." => acc
| _ => acc + rf f + "\r\n" endmatch)
"" dirs
) +
' Files: \r\n' +
(fold_left (fun (acc: string) (f:string) =>
acc + rf f + "\r\n" )
"" regs
) +
"</pre>"
| None => "ERROR ACCESSING DIRECTORY"
endmatch
;
val page = make_html(top + flist);
write_string(k,page,&eof_flag);
}
This code generates the HTML for the webserver to display a directory,
splitting files into directories and regular files now. The splitup code
is one huge expression, heavy functional stuff, including tail recursion
and lets, matches etc.
I'm a marginally disappointed that the "aux" function wasn't inlined,
Felix used a double closure here.. everything else was completely flattened
into straight line code.
--
john skaller
[email protected]
------------------------------------------------------------------------------
The Next 800 Companies to Lead America's Growth: New Video Whitepaper
David G. Thomson, author of the best-selling book "Blueprint to a
Billion" shares his insights and actions to help propel your
business during the next growth cycle. Listen Now!
http://p.sf.net/sfu/SAP-dev2dev
_______________________________________________
Felix-language mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/felix-language