Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/deanwampler/sicpexercisesolutions
My Scheme, Scala, and Clojure solutions to some of the SICP exercises
https://github.com/deanwampler/sicpexercisesolutions
Last synced: about 2 months ago
JSON representation
My Scheme, Scala, and Clojure solutions to some of the SICP exercises
- Host: GitHub
- URL: https://github.com/deanwampler/sicpexercisesolutions
- Owner: deanwampler
- Created: 2009-09-24T23:17:20.000Z (over 15 years ago)
- Default Branch: master
- Last Pushed: 2010-12-24T01:20:58.000Z (about 14 years ago)
- Last Synced: 2024-10-12T15:10:57.095Z (2 months ago)
- Language: Scala
- Homepage: http://polyglotprogramming.com
- Size: 689 KB
- Stars: 43
- Watchers: 6
- Forks: 10
- Open Issues: 0
-
Metadata Files:
- Readme: README.markdown
Awesome Lists containing this project
README
# README: Dean Wampler's Solutions to the SICP Exercises #
Dean Wampler ([email protected])
These are solutions for many of the SICP exercises, written in Scheme, Scala, and Clojure and driven by a unit testing library for each language. I didn't solve all the exercises. Also, I didn't solve some of the problems in all three languages (especially those that were proofs, extensions of previous exercises, etc.)
Feedback is welcome.
## Updates December 2010 ##
After a long hiatus, I returned to the problems. Starting around exercise 2.74. I've updated the build environment, too:
* **Scala**: Now using scala v2.8.1.final and ScalaTest 1.2.
* **Clojure**: Now using Clojure 1.2 and Clojure Contrib 1.2.
* **Scheme**: Now using Racket 5.0.X (the new name for PLT Scheme).
* **Makefile**: Minor refinements.## Running the Solutions ##
There is a simple Makefile that runs all the solutions. However, it appears that failed tests don't return `$? = 1` for all the runtimes (?), so if a particular exercise solution fails, `make` won't exit.
For running individual script files, use the `run.sh` files in each language directory, *e.g.*, if your current directory is `scheme/ch02` and you want to run the Exercise 2.1 solution, then use `../run.sh ex2.1.scm`.
## Scheme Solutions ##
Most of the Scheme solutions use just the features learned up to that point. The only exceptions are a few exercises where I use output functions and the `(set! ...)` form before the book introduced them, in order to test the exercise results.
I use *SchemeUnit* as the XUnit tool and run the solutions using *PLT Scheme*, in particular the *mzscheme* interpreter. One thing I noticed about this version of scheme; there is no `nil` defined for empty lists, as used in the book.. I used `(list)` instead.
## Scala Solutions ##
I'm a self-proclaimed Scala expert: [Programming Scala](http://oreilly.com/catalog/9780596155957/) ;) Hence, some of my solutions use idioms that haven't been introduced at that point in the book.
I use Scala v2.8.1 and [ScalaTest](http://www.artima.com/scalatest/) v1.0 to run the solutions. You'll need to add the `scalatest-x.y.jar` to the `CLASSPATH`. I invoke `scala` interactively, then load and execute files, *e.g.,*
scala -cp $SCALA_TEST_HOME/scalatest-1.0/scalatest-1.0.jar
scala> :load ex1.3.scala
Loading ex1.3.scala...
f: (Int,Int,Int)Int
import org.scalatest._
import org.scalatest.matchers._
defined module FSpec
Squaring top two of three integers
- should select the top two values, square them, and add the result(I suppressed some of the output.)
Sometimes I define versions of functions for which JDK implementations already exist, *e.g.*, `abs` (absolute).
## Clojure Solutions ##
I'm a novice Clojure user, so some of the solutions may be naive!
I switched to the Clojure 1.1 release candidates midstream without difficulty. The exercises probably work fine with 1.0, too. I use the `clojure.test` package that comes with the distribution to write the exercises as unit tests. To run them, I invoke the REPL, load each exercise solution into the REPL, then run it using the following command:
(run-tests)
Note that `(run-tests)` runs *all* the tests that have been defined in the current REPL session, not just test(s) for the last-loaded solution.As for my Scala solutions, sometimes I define versions of functions for which JDK or Clojure core implementations already exist, e.g., `abs` (absolute) and `even?`.