yarlisp 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use 1.9.2@yarlisp
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,24 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ yarlisp (0.0.1)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+ diff-lcs (1.1.3)
10
+ rspec (2.7.0)
11
+ rspec-core (~> 2.7.0)
12
+ rspec-expectations (~> 2.7.0)
13
+ rspec-mocks (~> 2.7.0)
14
+ rspec-core (2.7.0)
15
+ rspec-expectations (2.7.0)
16
+ diff-lcs (~> 1.1.2)
17
+ rspec-mocks (2.7.0)
18
+
19
+ PLATFORMS
20
+ ruby
21
+
22
+ DEPENDENCIES
23
+ rspec
24
+ yarlisp!
data/README.md ADDED
@@ -0,0 +1,93 @@
1
+ # YARLISP #
2
+
3
+ ## What is it and a brief history. ##
4
+
5
+ Yet Another Ruby Lisp.
6
+
7
+ (I assume that other people have implemented Lisp in ruby so...)
8
+
9
+ After reading [McCarthy's Paper][paper] for one of the
10
+ [Boston Software Crafstmanship Meetups][bossoftcraft] I decided to try to expand my limited
11
+ knowledge of Ruby by implmenting this Lisp.
12
+
13
+ That attempt failed - I even deleted the GitHub repository for it.
14
+
15
+ I hope that this attempt works better.
16
+
17
+ ## The relevant parts of the paper: ##
18
+
19
+ Snippets from McCarthy's paper:
20
+
21
+ The Elementary S-functions and Predicates. We introduce the following
22
+ functions and predicates:
23
+
24
+ 1. atom. `atom[x]` has the value of T or F according to whether x is an atomic symbol. Thus
25
+
26
+ atom [X] = T
27
+ atom [(X . A)] = F
28
+
29
+ 2. eq. `eq [x;y]` is defined if and only if both x and y are atomic. `eq [x; y] = T` if x and y are the same symbol, and `eq [x; y] = F` otherwise. Thus
30
+
31
+ eq [X; X] = T
32
+ eq [X; A] = F
33
+ eq [X; (X . A)] is undefined
34
+
35
+ 3. car. `car[x]` is defined if and only if x is not atomic.
36
+
37
+ car [(e1 . e2)] = e1
38
+
39
+ Thus `car [X]` is undefined.
40
+
41
+ car [(X . A)] = X
42
+ car [((X . A) . Y )] = (X . A)
43
+
44
+ 4. cdr. `cdr [x]` is also defined when x is not atomic. We have `cdr [(e1 . e2)]= e2`. Thus cdr [X] is undefined.
45
+
46
+ cdr [(X . A)] = A
47
+ cdr [((X . A) . Y )] = Y
48
+
49
+ 5. cons. `cons [x; y]` is defined for any x and y. We have `cons [e1; e2] = (e1 . e2`). Thus
50
+
51
+ cons [X; A] = (X A)
52
+ cons [(X . A); Y ] = ((X . A) Y )
53
+
54
+ car, cdr, and cons are easily seen to satisfy the relations
55
+
56
+ car [cons [x; y]] = x
57
+ cdr [cons [x; y]] = y
58
+ cons [car [x]; cdr [x]] = x, provided that x is not atomic.
59
+
60
+ The S-function apply is defined by
61
+
62
+ apply[f; args] = eval[cons[f; appq[args]];NIL],
63
+
64
+ where
65
+
66
+ appq[m] = [null[m] ! NIL; T ! cons[list[QUOTE; car[m]]; appq[cdr[m]]]]
67
+
68
+ and
69
+
70
+ eval[e; a] = [
71
+ atom [e] ! assoc [e; a];
72
+ atom [car [e]] ! [
73
+ eq [car [e]; QUOTE] ! cadr [e];
74
+ eq [car [e]; ATOM] ! atom [eval [cadr [e]; a]];
75
+ eq [car [e]; EQ] ! [eval [cadr [e]; a] = eval [caddr [e]; a]];
76
+ eq [car [e]; COND] ! evcon [cdr [e]; a];
77
+ eq [car [e]; CAR] ! car [eval [cadr [e]; a]];
78
+ eq [car [e]; CDR] ! cdr [eval [cadr [e]; a]];
79
+ eq [car [e]; CONS] ! cons [eval [cadr [e]; a]; eval [caddr [e]; a]];
80
+ T ! eval [cons [assoc [car [e]; a]; evlis [cdr [e]; a]]; a]];
81
+ eq [caar [e]; LABEL] ! eval [cons [caddar [e]; cdr [e]]; cons [list [cadar [e]; car [e]; a]];
82
+ eq [caar [e]; LAMBDA] ! eval [caddar [e]; append [pair [cadar [e]; evlis [cdr [e]; a]; a]]]
83
+
84
+ and
85
+
86
+ evcon[c; a] = [eval[caar[c]; a] ! eval[cadar[c]; a]; T ! evcon[cdr[c]; a]]
87
+
88
+ and
89
+
90
+ evlis[m; a] = [null[m] ! NIL; T ! cons[eval[car[m]; a]; evlis[cdr[m]; a]]]
91
+
92
+ [paper]: <http://www-formal.stanford.edu/jmc/recursive.pdf>
93
+ [bossoftcraft]: <http://groups.google.com/group/boston-software-craftsmanship?pli=1>
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/lib/yarlisp.rb ADDED
@@ -0,0 +1,5 @@
1
+ require "yarlisp/version"
2
+
3
+ module Yarlisp
4
+ # Your code goes here...
5
+ end
@@ -0,0 +1,3 @@
1
+ module Yarlisp
2
+ VERSION = "0.0.0"
3
+ end
data/script/test ADDED
@@ -0,0 +1,35 @@
1
+ #!/bin/bash
2
+ #
3
+ # From Destroy All Software screencast #10, at:
4
+ # http://destroyallsoftware.com/screencasts/catalog/fast-tests-with-and-without-rails
5
+ #
6
+ # Put this in the script/ directory of your Rails app, then run it with a spec
7
+ # filename. If the spec uses spec_helper, it'll be run inside Bundler.
8
+ # Otherwise, it'll be run directly with whatever `rspec` executable is on the
9
+ # path.
10
+
11
+ set -e
12
+
13
+ need_rails=1
14
+
15
+ if [ $# -gt 0 ]; then # we have args
16
+ filename=$1
17
+ # Remove trailing line numbers from filename, e.g. spec/my_spec.rb:33
18
+ grep_filename=`echo $1 | sed 's/:.*$//g'`
19
+
20
+ (set +e; grep -r 'spec_helper' $grep_filename) > /dev/null
21
+ if [ $? -eq 1 ]; then # no match; we have a stand-alone spec
22
+ need_rails=''
23
+ fi
24
+ else # we have no args
25
+ filename='spec'
26
+ fi
27
+
28
+ command='rspec'
29
+
30
+ if [ $need_rails ]; then
31
+ command="ruby -S bundle exec $command"
32
+ fi
33
+
34
+ RAILS_ENV=test $command $filename
35
+
data/yarlisp.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "yarlisp/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "yarlisp"
7
+ s.version = Yarlisp::VERSION
8
+ s.authors = ["Mark Simpson"]
9
+ s.email = ["verdammelt@gmail.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{A toy implementation of McCarthy's LISP in Ruby.}
12
+ s.description = %q{I must assume that someone has already implmented Lisp in Ruby and thus I name this 'Yet Another Ruby Lisp"}
13
+
14
+ s.rubyforge_project = "yarlisp"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ s.add_development_dependency "rspec"
23
+ # s.add_runtime_dependency "rest-client"
24
+ end
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: yarlisp
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Mark Simpson
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-10-19 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: &2157015400 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *2157015400
25
+ description: I must assume that someone has already implmented Lisp in Ruby and thus
26
+ I name this 'Yet Another Ruby Lisp"
27
+ email:
28
+ - verdammelt@gmail.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - .rvmrc
34
+ - Gemfile
35
+ - Gemfile.lock
36
+ - README.md
37
+ - Rakefile
38
+ - lib/yarlisp.rb
39
+ - lib/yarlisp/version.rb
40
+ - script/test
41
+ - yarlisp.gemspec
42
+ homepage: ''
43
+ licenses: []
44
+ post_install_message:
45
+ rdoc_options: []
46
+ require_paths:
47
+ - lib
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ! '>='
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ requirements: []
61
+ rubyforge_project: yarlisp
62
+ rubygems_version: 1.8.10
63
+ signing_key:
64
+ specification_version: 3
65
+ summary: A toy implementation of McCarthy's LISP in Ruby.
66
+ test_files: []