Subject: Re: Attribute String... From: Dave Love <d.love@xxxxxxxx> Date: 06 Oct 1997 18:55:00 +0100 |
>>>>> "Norman" == Norman Walsh <norm@xxxxxxxxxxxxx> writes: Norman> I thought two lists would be easier to maintain (and Norman> customize for other alphabets) than an explicitly constructed Norman> character-by-character mapping. I could be wrong... Probably not. (You could also search strings rather than lists, but the constant-time string-ref vs. list-ref probably won't gain much.) The association lists should be roughly sorted by character frequency, obviously. A canonical solution for the lookup would probably use association lists: (define alist-u-l ; association list indexed on u.c. (map cons uppercase-list lowercase-list)) (define alist-l-u (map cons lowercase-list uppercase-list)) ;(define (tr alist) ; (lambda (c) ; (cond ((assoc c alist) => cdr) ; not Jade :-( ; (else c)))) (define (tr alist) ; general translation using alist (lambda (c) (let ((x (assoc c alist))) (if x (cdr x) c)))) (define char-downcase (tr alist-u-l)) (define char-upcase (tr alist-l-u)) (define (string-map f s) ; useful abstraction (list->string (map f (string->list s)))) (define (string-upcase s) (string-map char-upcase s)) Jade doesn't have `assoc' and I don't know if a definition has been posted: (define (assoc obj alist) (cond ((null? alist) #f) ((equal? obj (car (car alist))) (car alist)) (else (assoc obj (cdr alist))))) You might win a little speed by unfolding some of the definitions if you really care. Since `assoc' isn't primitive you might do better generating double-length lists and using `member' for the search, like: (define l-u ; '(#\a (#\A) #\b (#\B) ...) (apply append (map list lowercase-list (map list uppercase-list)))) (define (char-upcase c) (let ((x (member c l-u))) (if x (list-ref x 1) c))) Or make assoc primitive [do I not like C++ :-(]. --- style/InterpreterMessages.msg 1997/10/06 18:16:20 1.1 +++ style/InterpreterMessages.msg 1997/10/06 18:19:44 1.2 @@ -107,3 +107,4 @@ I1+stackTraceEllipsis++called from here...(%1 calls omitted) E0+processNodeLoop++node processing loop detected E0+spliceNotList++unquote-splicing expression does not evaluate to a list +E3+notAnAlist++%2 argument for primitive %1 of wrong type: %3 not an association list --- style/primitive.cxx 1997/10/06 18:16:20 1.1 +++ style/primitive.cxx 1997/10/06 18:19:44 1.2 @@ -4294,6 +4294,25 @@ return interp.makeFalse(); } +DEFPRIMITIVE(Assoc, argc, argv, context, interp, loc) +{ + ELObj *p = argv[1]; + while (!p->isNil()) { + PairObj *tem = p->asPair(); + if (!tem) + return argError(interp, loc, + InterpreterMessages::notAnAlist, 1, argv[1]); + PairObj *tem2 = (tem->car())->asPair(); + if (!tem2) + return argError(interp, loc, + InterpreterMessages::notAnAlist, 1, argv[1]); + if (*argv[0] == *tem2->car()) + return tem2; + p = tem->cdr(); + } + return interp.makeFalse(); +} + void Interpreter::installPrimitives() { #define PRIMITIVE(name, string, nRequired, nOptional, rest) \ --- style/primitive.h 1997/10/06 18:16:20 1.1 +++ style/primitive.h 1997/10/06 18:19:44 1.2 @@ -169,6 +169,7 @@ PRIMITIVE(NodeListReverse, "node-list-reverse", 1, 0, 0) PRIMITIVE(NodeListLength, "node-list-length", 1, 0, 0) PRIMITIVE(SgmlParse, "sgml-parse", 1, 0, 1) +PRIMITIVE(Assoc, "assoc", 2, 0, 0) // External procedures XPRIMITIVE(ReadEntity, "read-entity", 1, 0, 0) XPRIMITIVE(Debug, "debug", 1, 0, 0) HTH. DSSSList info and archive: http://www.mulberrytech.com/dsssl/dssslist
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: Attribute String..., Norman Walsh | Thread | Emergent, Paul Prescod |
Re: Attribute String..., Dave Love | Date | Re: Accessing declared value of att, Daniel Speck |
Month |