Skip to content

Commit

Permalink
more loyal "and" and "or" methods
Browse files Browse the repository at this point in the history
  • Loading branch information
hugodecasta committed Feb 21, 2020
1 parent 6026c94 commit 639ea57
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 12 deletions.
36 changes: 24 additions & 12 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -116,24 +116,36 @@ let methods = {
return handle(args[0]) == handle(args[1])
},
'and':function(args) {
for(let arg of args) {
if(!handle(arg)) {
return false
}
if(args.length == 0) {
return true
}
return true
let car = handle(args[0])
let cdr = args.slice(1)
if(car === false) {
return false
}
if(cdr.length == 0) {
return car
}
return handle(['and'].concat(cdr))
},
'or':function(args) {
for(let arg of args) {
if(handle(arg)) {
return true
}
if(args.length == 0) {
return false
}
let car = handle(args[0])
let cdr = args.slice(1)
if(car !== false) {
return car
}
return false
return handle(['or'].concat(cdr))
},
'not':function(args) {
let value = handle(args[0])
return !value
let car = handle(args[0])
if(car !== false) {
return false
}
return !car
},
// -----------------------------------------------------
'null?':function(args) {
Expand Down
18 changes: 18 additions & 0 deletions test.js
Original file line number Diff line number Diff line change
Expand Up @@ -100,5 +100,23 @@ test('specific scheme env', t => {
t.is(sc2.interpret("a"), 5)
t.is(sc3.interpret("(define a 7)"), 7)
t.is(sc3.interpret("a"), 7)
})

test('and', t => {
t.is(scheme('(and #t #t #f)'),false)
t.is(scheme('(and #f #t #t)'),false)
t.is(scheme('(and #t #t #t)'),true)
t.is(scheme('(and #t #t 5)'),5)
t.is(scheme('(and 5 #t 7)'),7)
t.is(scheme('(and 5 #f 7)'),false)
t.deepEqual(scheme("(and 5 #t '(a b))"),['list','a','b'])
})

test('or', t => {
t.is(scheme('(or #f #f #t)'),true)
t.is(scheme('(or #f #t #f)'),true)
t.is(scheme('(or #f 7 #f)'),7)
t.is(scheme('(or 5 7 #f)'),5)
t.is(scheme('(or #f #f #f)'),false)
t.deepEqual(scheme("(or '(a b) #f #f)"),['list','a','b'])
})

0 comments on commit 639ea57

Please sign in to comment.