Author: Anthony Cozzie
Date: 07:50:43 02/18/04
Go up one level in this thread
On February 18, 2004 at 10:32:15, Vincent Diepeveen wrote: >On February 18, 2004 at 08:55:45, Anthony Cozzie wrote: > >>At CMU, I took 15-212 (Functional Programming). Basically, we learned Standard >>ML (ML stands for metalanguage) and wrote some rather complex stuff, including a >>parser/typechecker/runtime environment for a small Logo-like language (it >>included functions, and custom types if I remember correctly). >> >>Basically, it took most people a while to transition from C to ML. Some people >>never did it. I had one friend who, while an incredibly sharp C/assembly coder >>(currently getting his PhD at CMU in signal processing) just didn't "get" ML. >>It is simply different, and if you try to write C-ish ML you will fail >>miserably. >> >>ML allows you to write some amazingly compact and readable programs. I seem to >>remember posting an implementation of regular expressions in ML - it is about 25 >>lines, versus several hundred for a C implementation. I made far fewer mistakes >>in ML than in C, and most of those were caught by the type-checker, not at >>runtime. If you can get a program to "compile" in ML, there is at least a 50% >>chance it will work perfectly on the first run. >> >>Standard ML is about 10 times slower than C. OCAML, the french version, is >>about 50% slower. I don't think functional languages are a good idea for >>writing chess programs, but they certainly have their place. >> >>anthony > >Professor Swierstra (functional programming) focussed for a few years our >attention upon functional programming languages being so good in parsing. > >Especially with a few Haskell scripts he had copied from somewhere you could >very well parse stuff. > >After a few years i was so sick from this guy (he's even more stubborn than Uri >Blass) that i took a bet. Impossible. No one is more stubborn than Uri :) >Someone who had written his thesis about functional programming and who was >giving courses functional programming took the bet. > >We both would write a CGI script. He in gofer + haskell. Diep in C. > >The cgi script had to parse certain things from submissions and needed to get >parsed in the CGI script then a HTML form had to get shipped back to the WWW >server. Of course it had to be bugfree. > >I took me 30 minutes to write this in C. > >It took him a week to get it to work in gofer. > >In fact he didn't finish a buggy version until 2 days after the bet. I think it is a bit premature to dismiss a family of languages based one 1 person's attempt on 1 problem in 1 language. I have never worked with this gopher, or even lisp for that matter. >Additionally his gofer thing was hell slow of course. Lazy evaluation you >know... ...it's dead slow! Of course. Sometimes it doesn't matter, though. >Anyone defending functional languages should know better. Any nonsense that is >claimed about the languages doing better than imperative languages is a big >nonsense. > >Even quickbasic + 1 string lib beats the hell out of it. > >You see, no one has written huge programs with it. That's the problem. As soon >as you have to commercially work, you have to be above that 0.5 source code >lines an hour. > >In such functional languages you don't manage, but in C/C++/JAVA/c# you will >easily get to 10 or more. In C you need 10 lines of code just to turn around. This is my ML regular expression evaluator. If you can do this in C in 40 lines I'll eat my shorts. structure Regex :> REGEX = struct datatype regExp = Char of char | Concat of regExp * regExp | Epsilon | Union of regExp * regExp | Empty | Star of regExp | Underscore | And of regExp * regExp | Top | Not of regExp fun acc (Char(a)) (nil) k = false |acc (Char(a)) (b::s) k = if a = b then k s else false |acc (Epsilon) s k = k s |acc (Empty) s k = false |acc (Union(r1,r2)) s k = acc r1 s k orelse acc r2 s k |acc (Concat(r1,r2)) s k = acc r1 s (fn s' => acc r2 s' k) |acc (r as Star(r1)) s k = k s orelse acc r1 s (fn s' => if s = s' then false else acc r s' k) |acc (Underscore) (nil) k = false |acc (Underscore) (b::s) k = k s |acc (And(r1,r2)) s k = acc r1 s k andalso acc r2 s k |acc (Top) s k = acc (Star(Underscore)) s k |acc (Not(r)) s k = if (acc r s (fn s' => if (k s) then false else true) then false else true fun accept r s = acc r (String.explode s) (fn nil => true | x => false) end anthony
This page took 0 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.