add comments, paste content from rosetta2
[lambda.git] / rosetta.mdwn
1 ## Can you summarize the differences between our made-up language and Scheme, OCaml, and Haskell? ##
2
3 The made-up language we wet our toes in in week 1 is called Kapulet. (I'll tell you the story behind its name sometime.) The purpose of starting with this language is that it represents something of a center of gravity between Scheme, OCaml, and Haskell, and also lacks many of their idiosyncratic warts. One downside is that it's not yet implemented in a form that you can run on your computers. So for now, if you want to try out your code on a real mechanical evaluator, you'll need to use one of the other languages.
4
5 Also, if you want to read code written outside this class, or have others read your code, for these reasons too you'll need to make the shift over to one of the established languages.
6
7 We hope, though, that learning Kapulet first puts you in a position to make that shift more effortlessly, and also to more quickly see the places where there's underlying unity to Scheme, OCaml, and Haskell, despite their diverse syntaxes. (And idiosyncratic warts.)
8
9 ### Comments
10
11     ...  # this is a comment in Kapulet, that goes until the end of the line
12
13     ...  ; this is a comment in Scheme, that goes until the end of the line
14
15     ...  -- this is a comment in Haskell, that goes until the end of the line
16
17 Note that for Haskell's comments, the `--` must be immediately followed by something like a space or a letter. `-->` does not begin a comment; it's a legal operator symbol.
18
19 OCaml doesn't have comments of that sort. It only has "block" comments like this:
20
21     (* ... *)
22
23 which may last for several lines. These comments *nest*, so that:
24
25     (* ... (* inner *) ... *)
26
27 is a single comment.
28
29 Haskell also has block comments, though it `{- writes them differently -}`.
30 Haskell's block comments also nest.
31
32 Racket and Scheme also have block comments, though they `#| write them differently |#`.
33 These block comments also nest. Another form of block comments is `#;( ... )`. Those may contain nested parentheses, and extend until the next *matching* `)`. So prefixing `#;` to a complex parenthesized expression is a way to turn the whole thing into a comment. (These two comment styles aren't part of the official Scheme standard, but they widely implemented.)
34
35
36
37
38
39
40
41
42
43
44
45
46 ## Offsite Readings comparing Scheme, OCaml, and Haskell ##
47
48 *   [Haskell for OCaml Programmers](http://science.raphael.poss.name/haskell-for-ocaml-programmers.pdf)
49 *   [Introduction to OCaml for Haskellers](http://foswiki.cs.uu.nl/foswiki/pub/Stc/BeyondFunctionalProgrammingInHaskell:AnIntroductionToOCaml/ocaml.pdf), [another](http://blog.ezyang.com/2010/10/ocaml-for-haskellers/)
50 *   Haskell Wiki on [OCaml](https://wiki.haskell.org/OCaml)
51 *   [ML Dialects and Haskell](http://hyperpolyglot.org/ml)
52 *   [Differences between Haskell and SML?](http://www.quora.com/What-are-the-key-differences-between-Haskell-and-Standard-ML?browse)
53 *   [Comparing SML to OCaml](http://www.mpi-sws.org/~rossberg/sml-vs-ocaml.html)
54
55
56
57 ## Why did you name these pages "Rosetta"? ##
58
59 The [Rosetta Stone](https://en.wikipedia.org/wiki/Rosetta_Stone) is a famous slab discovered during Napoleon's invasion of Egypt, that had the same decree written in ancient Greek (which modern scholars understood) and two ancient Egyptian scripts (which they didn't). The slab enabled us to recover understanding of those Egyptian scripts; and has since come to be a symbol for the simultaneous expression of a single idea in multiple languages. A number of websites do this for various programming languages:
60
61 <table><th>
62 <td>Scheme
63 <td>OCaml
64 <td>Haskell
65 <tr>
66 <td rowspan=10>&nbsp;
67 <td><a href="http://rosettacode.org/wiki/Category:Scheme">Rosetta Code</a>
68 <td><a href="http://rosettacode.org/wiki/Category:OCaml">Rosetta Code</a>
69 <td><a href="http://rosettacode.org/wiki/Category:Haskell">Rosetta Code</a>
70 <tr>
71 <td><a href="http://pleac.sourceforge.net/pleac_guile/index.html">PLEAC</a>
72 <td><a href="http://pleac.sourceforge.net/pleac_ocaml/index.html">PLEAC</a>
73 <td><a href="http://pleac.sourceforge.net/pleac_haskell/index.html">PLEAC</a>
74 <tr>
75 <td>n/a
76 <td colspan=2 align=center><hr><a href="http://langref.org/ocaml+haskell/solved">langref.org</a>
77 <tr>
78 <td><a href="http://www.codecodex.com/wiki/Category:Scheme">code codex</a>
79 <td><a href="http://www.codecodex.com/wiki/Category:Objective_Caml">code codex</a>
80 <td><a href="http://www.codecodex.com/wiki/Category:Haskell">code codex</a>
81 <tr>
82 <td><a href="http://community.schemewiki.org/?ninety-nine-scheme-problems">99 problems</a>
83 <td><a href="http://ocaml.org/learn/tutorials/99problems.html">99 problems</a>
84 <td><a href="https://wiki.haskell.org/H-99:_Ninety-Nine_Haskell_Problems">99 problems</a>
85 </table>
86
87 See also the [Project Euler](https://projecteuler.net/) programming challenges.