From f23168670146fb6810d3293d5539579fe261db4d Mon Sep 17 00:00:00 2001 From: Tim Morgan Date: Mon, 27 Jul 2015 20:58:27 -0500 Subject: [PATCH] Add boolean? predicate --- lib/bool.scm | 7 +++++++ spec/lib/bool_spec.rb | 48 +++++++++++++++++++++++++++++++++++++++++++ vm.rb | 1 + 3 files changed, 56 insertions(+) create mode 100644 lib/bool.scm create mode 100644 spec/lib/bool_spec.rb diff --git a/lib/bool.scm b/lib/bool.scm new file mode 100644 index 0000000..6dc236c --- /dev/null +++ b/lib/bool.scm @@ -0,0 +1,7 @@ +(define boolean? + (lambda (b) + (if (eq? b #t) + #t + (if (eq? b #f) + #t + #f)))) diff --git a/spec/lib/bool_spec.rb b/spec/lib/bool_spec.rb new file mode 100644 index 0000000..6d30350 --- /dev/null +++ b/spec/lib/bool_spec.rb @@ -0,0 +1,48 @@ +require_relative '../spec_helper' +require 'stringio' + +describe 'Library' do + let(:stdout) { StringIO.new } + + let(:subject) { Program.new(code, stdout: stdout) } + + before { subject.run } + + describe 'boolean?' do + context 'given #t' do + let(:code) do + <<-END + (boolean? #t) + END + end + + it 'returns #t' do + expect(subject.vm.pop_val).to eq(VM::BoolTrue.instance) + end + end + + context 'given #f' do + let(:code) do + <<-END + (boolean? #f) + END + end + + it 'returns #t' do + expect(subject.vm.pop_val).to eq(VM::BoolTrue.instance) + end + end + + context 'given a list' do + let(:code) do + <<-END + (boolean? (list)) + END + end + + it 'returns #f' do + expect(subject.vm.pop_val).to eq(VM::BoolFalse.instance) + end + end + end +end diff --git a/vm.rb b/vm.rb index 35b19e9..66ce6d3 100644 --- a/vm.rb +++ b/vm.rb @@ -396,6 +396,7 @@ class VM LIBRARIES = %w( list pair + bool ) def lib_sexps(lib) -- 2.34.2