adding member
This commit is contained in:
parent
c78f6018be
commit
f43f43f2b1
32
runtime.js
32
runtime.js
|
@ -788,6 +788,14 @@
|
||||||
Primitives['equal?'] = function(MACHINE, arity) {
|
Primitives['equal?'] = function(MACHINE, arity) {
|
||||||
var firstArg = MACHINE.env[MACHINE.env.length-1];
|
var firstArg = MACHINE.env[MACHINE.env.length-1];
|
||||||
var secondArg = MACHINE.env[MACHINE.env.length-2];
|
var secondArg = MACHINE.env[MACHINE.env.length-2];
|
||||||
|
return isEqual(firstArg, secondArg);
|
||||||
|
};
|
||||||
|
Primitives['equal?'].arity = 2;
|
||||||
|
Primitives['equal?'].displayName = 'equal?';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var isEqual = function(firstArg, secondArg) {
|
||||||
var lset = [firstArg], rset = [secondArg];
|
var lset = [firstArg], rset = [secondArg];
|
||||||
while (lset.length !== 0 && rset.length !== 0) {
|
while (lset.length !== 0 && rset.length !== 0) {
|
||||||
var lhs = lset.pop();
|
var lhs = lset.pop();
|
||||||
|
@ -807,10 +815,29 @@
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
Primitives['equal?'].arity = 2;
|
|
||||||
Primitives['equal?'].displayName = 'equal?';
|
|
||||||
|
|
||||||
|
|
||||||
|
Primitives['member'] = function(MACHINE, arity) {
|
||||||
|
var x = MACHINE.env[MACHINE.env.length-1];
|
||||||
|
var lst = MACHINE.env[MACHINE.env.length-2];
|
||||||
|
var originalLst = lst;
|
||||||
|
while (true) {
|
||||||
|
if (! isList(lst)) {
|
||||||
|
raise(new Error("member: expected list"
|
||||||
|
+ " as argument #2"
|
||||||
|
+ " but received " + originalLst + " instead"));
|
||||||
|
};
|
||||||
|
if (lst === NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (isEqual(x, (lst[0]))) {
|
||||||
|
return lst;
|
||||||
|
}
|
||||||
|
lst = lst[1];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Primitives['member'].arity = 2;
|
||||||
|
Primitives['member'].displayName = 'member';
|
||||||
|
|
||||||
|
|
||||||
// recomputeGas: state number -> number
|
// recomputeGas: state number -> number
|
||||||
|
@ -899,6 +926,7 @@
|
||||||
exports['isVector'] = isVector;
|
exports['isVector'] = isVector;
|
||||||
exports['isOutputPort'] = isOutputPort;
|
exports['isOutputPort'] = isOutputPort;
|
||||||
exports['isOutputStringPort'] = isOutputStringPort;
|
exports['isOutputStringPort'] = isOutputStringPort;
|
||||||
|
exports['isEqual'] = isEqual;
|
||||||
|
|
||||||
exports['ArityAtLeast'] = ArityAtLeast;
|
exports['ArityAtLeast'] = ArityAtLeast;
|
||||||
exports['isArityMatching'] = isArityMatching;
|
exports['isArityMatching'] = isArityMatching;
|
||||||
|
|
|
@ -325,5 +325,14 @@ EOF
|
||||||
"Error: Expected number as argument 1 but received foo")
|
"Error: Expected number as argument 1 but received foo")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(test '(for-each displayln (member 5 '(1 2 5 4 3)))
|
||||||
|
"5\n4\n3\n")
|
||||||
|
|
||||||
|
(test '(displayln (member 6 '(1 2 5 4 3)))
|
||||||
|
"false\n")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#;(test (read (open-input-file "tests/conform/program0.sch"))
|
#;(test (read (open-input-file "tests/conform/program0.sch"))
|
||||||
(port->string (open-input-file "tests/conform/expected0.txt")))
|
(port->string (open-input-file "tests/conform/expected0.txt")))
|
Loading…
Reference in New Issue
Block a user