continuing to work on xexps

This commit is contained in:
Danny Yoo 2011-09-01 12:59:39 -04:00
parent a01462673d
commit c0ac816fda
3 changed files with 112 additions and 1 deletions

View File

@ -65,4 +65,9 @@
view-form-value view-form-value
update-view-form-value update-view-form-value
view-append-child view-append-child
xexp?
xexp->dom
)) ))

View File

@ -9,6 +9,10 @@
var finalizeClosureCall = plt.baselib.functions.finalizeClosureCall; var finalizeClosureCall = plt.baselib.functions.finalizeClosureCall;
var PAUSE = plt.runtime.PAUSE; var PAUSE = plt.runtime.PAUSE;
var isString = plt.baselib.strings.isString; var isString = plt.baselib.strings.isString;
var isSymbol = plt.baselib.symbols.isSymbol;
var isList = plt.baselib.lists.isList;
var isEmpty = plt.baselib.lists.isEmpty;
var listLength = plt.baselib.lists.length;
var makeList = plt.baselib.lists.makeList; var makeList = plt.baselib.lists.makeList;
var makePair = plt.baselib.lists.makePair; var makePair = plt.baselib.lists.makePair;
var makeSymbol = plt.baselib.symbols.makeSymbol; var makeSymbol = plt.baselib.symbols.makeSymbol;
@ -1113,6 +1117,78 @@
var isAttributeList = function(x) {
var children;
if (isList(x) && (! isEmpty(x))){
if (isSymbol(x.first) && x.first.val === '@') {
children = x.rest;
while(! isEmpty(children)) {
if (isList(children.first) &&
listLength(children.first) === 2 &&
isSymbol(children.first.first) &&
isString(children.first.rest.first)) {
children = children.rest;
} else {
return false;
}
}
return true;
} else {
return false;
}
} else {
return false;
}
};
// An xexp is one of the following:
// xexp :== (name (@ (key value) ...) xexp ...)
// :== (name xexp ...)
// :== string
var isXexp = function(x) {
var children;
if (isString(x)) {
return true;
}
if (isList(x) && !(isEmpty(x))) {
if (isSymbol(x.first)) {
children = x.rest;
// Check the rest of the children. The first is special.
if (isEmpty(children)) {
return true;
}
if (isAttributeList(children.first)) {
children = children.rest;
}
while (! (isEmpty(children))) {
if (! isXexp(children.first)) {
return false;
}
children = children.rest;
}
return true;
} else {
return false;
}
}
return false;
};
var xexpToDom = function(x) {
return x;
};
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
var checkReal = plt.baselib.check.checkReal; var checkReal = plt.baselib.check.checkReal;
@ -1120,6 +1196,7 @@
var checkSymbolOrString = plt.baselib.check.checkSymbolOrString; var checkSymbolOrString = plt.baselib.check.checkSymbolOrString;
var checkProcedure = plt.baselib.check.checkProcedure; var checkProcedure = plt.baselib.check.checkProcedure;
var checkWorldHandler = plt.baselib.check.makeCheckArgumentType( var checkWorldHandler = plt.baselib.check.makeCheckArgumentType(
isWorldHandler, isWorldHandler,
'world handler'); 'world handler');
@ -1132,6 +1209,9 @@
var checkSelector = plt.baselib.check.makeCheckArgumentType( var checkSelector = plt.baselib.check.makeCheckArgumentType(
isString, 'selector'); isString, 'selector');
var checkXexp = plt.baselib.check.makeCheckArgumentType(
isXexp, 'xexp');
EXPORTS['big-bang'] = makeClosure( EXPORTS['big-bang'] = makeClosure(
'big-bang', 'big-bang',
@ -1508,6 +1588,22 @@
}); });
EXPORTS['xexp?'] = makePrimitiveProcedure(
'xexp?',
1,
function(MACHINE) {
return isXexp(MACHINE.env[MACHINE.env.length - 1]);
});
EXPORTS['xexp->dom'] = makePrimitiveProcedure(
'xexp->dom',
1,
function(MACHINE) {
var xexp = checkXexp(MACHINE, 'xexp->dom', 0);
return xexpToDom(xexp);
});
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
}()); }());

View File

@ -22,7 +22,10 @@
view-hide view-hide
view-append-child view-append-child
open-output-element) open-output-element
xexp?
xexp->dom)
(define (big-bang world . handlers) (define (big-bang world . handlers)
@ -142,3 +145,10 @@
(define (open-output-element id) (define (open-output-element id)
(error 'open-output-element "Please run in JavaScript context.")) (error 'open-output-element "Please run in JavaScript context."))
(define (xexp? x)
(error 'xexp? "Please run in JavaScript context."))
(define (xexp->dom x)
(error 'xexp->dom "Please run in JavaScript context."))