Skip to content

My personal attempt to solve SICP exercises with Clojure.

License

Notifications You must be signed in to change notification settings

SmetDenis/Clojure-SICP

Repository files navigation

Solving exercises from SICP with Clojure

Clojure CI Coverage Status Progress

SICP (Structure and Interpretation of Computer Programs) is the book of Harold Abelson and Gerald Jay Sussman on basics of computer science and software engineering.

Based on

Table of Contents

Chapter 1 - Building Abstractions with Procedures

Progress

Chapter 2 - Building Abstractions with Data

Progress

Chapter 3 - Modularity, Objects, and State

Progress

  • 3.1 Assignment and Local State
    • 3.1.1 Local State Variables
    • 3.1.2 The Benefits of Introducing Assignment
    • 3.1.3 The Costs of Introducing Assignment
  • 3.2 The Environment Model of Evaluation
    • 3.2.1 The Rules for Evaluation
    • 3.2.2 Applying Simple Procedures
    • 3.2.3 Frames as the Repository of Local State
    • 3.2.4 Internal Definitions
  • 3.3 Modeling with Mutable Data
    • 3.3.1 Mutable List Structure
    • 3.3.2 Representing Queues
    • 3.3.3 Representing Tables
    • 3.3.4 A Simulator for Digital Circuits
    • 3.3.5 Propagation of Constraints
  • 3.4 Concurrency: Time Is of the Essence
    • 3.4.1 The Nature of Time in Concurrent Systems
    • 3.4.2 Mechanisms for Controlling Concurrency
  • 3.5 Streams
    • 3.5.1 Streams Are Delayed Lists
    • 3.5.2 Infinite Streams
    • 3.5.3 Exploiting the Stream Paradigm
    • 3.5.4 Streams and Delayed Evaluation
    • 3.5.5 Modularity of Functional Programs and Modularity of Objects

Chapter 4 - Metalinguistic Abstraction

Progress

  • 4.1 The Metacircular Evaluator
    • 4.1.1 The Core of the Evaluator
    • 4.1.2 Representing Expressions
    • 4.1.3 Evaluator Data Structures
    • 4.1.4 Running the Evaluator as a Program
    • 4.1.5 Data as Programs
    • 4.1.6 Internal Definitions
    • 4.1.7 Separating Syntactic Analysis from Execution
  • 4.2 Variations on a Scheme — Lazy Evaluation
    • 4.2.1 Normal Order and Applicative Order
    • 4.2.2 An Interpreter with Lazy Evaluation
    • 4.2.3 Streams as Lazy Lists
  • 4.3 Variations on a Scheme — Nondeterministic Computing
    • 4.3.1 Amb and Search
    • 4.3.2 Examples of Nondeterministic Programs
    • 4.3.3 Implementing the Amb Evaluator
  • 4.4 Logic Programming
    • 4.4.1 Deductive Information Retrieval
    • 4.4.2 How the Query System Works
    • 4.4.3 Is Logic Programming Mathematical Logic?
    • 4.4.4 Implementing the Query System
      • 4.4.4.1 The Driver Loop and Instantiation
      • 4.4.4.2 The Evaluator
      • 4.4.4.3 Finding Assertions by Pattern Matching
      • 4.4.4.4 Rules and Unification
      • 4.4.4.5 Maintaining the Data Base
      • 4.4.4.6 Stream Operations
      • 4.4.4.7 Query Syntax Procedures
      • 4.4.4.8 Frames and Bindings

Chapter 5 - Computing with Register Machines

Progress

  • 5.1 Designing Register Machines
    • 5.1.1 A Language for Describing Register Machines
    • 5.1.2 Abstraction in Machine Design
    • 5.1.3 Subroutines
    • 5.1.4 Using a Stack to Implement Recursion
    • 5.1.5 Instruction Summary
  • 5.2 A Register-Machine Simulator
    • 5.2.1 The Machine Model
    • 5.2.2 The Assembler
    • 5.2.3 Generating Execution Procedures for Instructions
    • 5.2.4 Monitoring Machine Performance
  • 5.3 Storage Allocation and Garbage Collection
    • 5.3.1 Memory as Vectors
    • 5.3.2 Maintaining the Illusion of Infinite Memory
  • 5.4 The Explicit-Control Evaluator
    • 5.4.1 The Core of the Explicit-Control Evaluator
    • 5.4.2 Sequence Evaluation and Tail Recursion
    • 5.4.3 Conditionals, Assignments, and Definitions
    • 5.4.4 Running the Evaluator
  • 5.5 Compilation
    • 5.5.1 Structure of the Compiler
    • 5.5.2 Compiling Expressions
    • 5.5.3 Compiling Combinations
    • 5.5.4 Combining Instruction Sequences
    • 5.5.5 An Example of Compiled Code
    • 5.5.6 Lexical Addressing
    • 5.5.7 Interfacing Compiled Code to the Evaluator

License

MIT