If you change from #lang racket to #lang mzscheme your program will work. I'm pretty sure the issue is that eopl was defined in terms of the 'mzscheme' language where `cond' checks for `else' symbolically. The `else' you are using is from the 'racket' language where its defined as a syntactic transformer that cannot be used as an expression, it can only be used inside `cond' forms from the 'racket' language.
Well maybe thats not 100% right, but its something like that. The whole situation (combining the mzscheme and racket modules) pretty unfortunate, IMO. On 12/21/2010 04:57 PM, Niitsuma Hirotaka wrote: > I try to run this code on racket > > http://www.daniweb.com/forums/thread277930.html > > After little modify I enables run this code on swindle. > But when I chose language racket, this code cause error > > else: not allowed as an expression in: else > > flowing is the modified code > ------------------------------------------- > > #lang racket > > (require eopl/eopl) > > ;The helpers used in parse and unparse > > ;(define list-of > ; (lambda (pred) > ; (lambda (val) > ; (or (null? val) > ; (and (pair? val) > ; (pred (car val)) > ; ((list-of pred) (cdr val))))))) > > ;combines 2 lists of the same size > ;as a list of list with corresponding elements > (define combine > (lambda (ls1 ls2) > (if (null? ls1) > '() > (append (list (list (car ls1) (car ls2))) > (combine (cdr ls1) (cdr ls2)))))) > > > (define improperlist? > (lambda (x) > (and (pair? x) (not (list? x))))) > > (define literal? > (lambda (x) > (or (number? x) > (string? x) > (boolean? x) > (vector? x)))) > > (define list-of-lists? > (lambda (x) > (and (list? x) > (andmap list? x)))) > > (define lengths-equal-two? > (lambda (x) > (= (length x) 2))) > > (define firsts > (lambda (ls) > (if (null? ls) > '() > (cons (caar ls) > (firsts (cdr ls)))))) > > (define lasts > (lambda (ls) > (if (null? ls) > '() > (cons (cadar ls) > (lasts (cdr ls)))))) > > > > > (define-datatype expression expression? > [var-exp > (id symbol?)] > [lambda-exp > (vars (list-of symbol?)) > (bodies (list-of expression?))] > [lambda-var-improp-exp > (vars (list-of improperlist?)) > (bodies (list-of expression?))] > [lambda-var-sym-exp > (vars symbol?) > (bodies (list-of expression?))] > [set-exp > (id symbol?) > (var expression?)] > [app-exp > (rands (list-of expression?))] > [lit-exp > (id literal?)] > [if-exp > (test expression?) > (true expression?) > (false expression?)] > [if-noelse-exp > (test expression?) > (true expression?)] > [let-exp > (vars (list-of symbol?)) > (vals (list-of expression?)) > (bodies (list-of expression?))] > [let*-exp > (vars (list-of symbol?)) > (vals (list-of expression?)) > (bodies (list-of expression?))] > [letrec-exp > (vars (list-of symbol?)) > (vals (list-of expression?)) > (bodies (list-of expression?))] > [letname-exp > (name symbol?) > (vars (list-of symbol?)) > (vals (list-of expression?)) > (bodies (list-of expression?))]) > > > > > > ;parse > (define parse-exp > (lambda (datum) > (cond > [(symbol? datum) (var-exp datum)] > [(literal? datum) (lit-exp datum)] > [(pair? datum) > (cond > [(eqv? (car datum) 'lambda) > (if (< (length (cdr datum)) 2) > (eopl:error 'parse-exp "Invalid lambda syntax ~s" datum) > (cond > [(list? (cadr datum)) > (lambda-exp (cadr datum) > (map parse-exp (cddr datum)))] > [(symbol? (cadr datum)) > (lambda-var-sym-exp (cadr datum) > (map parse-exp (cddr datum)))] > [(improperlist? (cadr datum)) > (lambda-var-improp-exp (cadr datum) > (map parse-exp (cddr datum)))] > [else > (eopl:error 'parse-exp > "Invalid lambda syntax ~s" datum)]))] > [(eqv? (car datum) 'set!) > (if (= (length (cdr datum)) 2) > (set-exp (cadr datum) > (parse-exp (caddr datum))) > (eopl:error 'parse-exp > "Invalid set! syntax ~s" datum))] > [(eqv? (car datum) 'set) > (eopl:error "Invalid set syntax ~s" datum)] > [(eqv? (car datum) 'if) > (cond > [(= (length (cdr datum)) 3) > (if-exp (parse-exp (cadr datum)) > (parse-exp (caddr datum)) > (parse-exp (cadddr datum)))] > [(= (length (cdr datum)) 2) > (if-noelse-exp (parse-exp (cadr datum)) > (parse-exp (caddr datum)))] > [else > (eopl:error 'parse-exp > "Invalid if syntax ~s" datum)])] > [(and (eqv? (car datum) 'let) (list? (cadr datum))) > (cond > [(< (length (cdr datum)) 2) > (eopl:error 'parse-exp "Invalid let syntax ~s" datum)] > [(and (list-of-lists? (cadr datum)) > (andmap lengths-equal-two? (cadr datum))) > (let-exp (firsts (cadr datum)) > (map parse-exp (lasts (cadr datum))) > (map parse-exp (cddr datum)))] > [else > (eopl:error 'parse-exp > "Invalid let syntax ~s" datum)])] > [(and (eqv? (car datum) 'let) (symbol? (cadr datum))) > (cond > [(< (length (cdr datum)) 3) > (eopl:error 'parse-exp "Invalid named let syntax ~s" datum)] > [(and (list-of-lists? (caddr datum)) > (andmap lengths-equal-two? (caddr datum))) > (letname-exp (cadr datum) > (firsts (caddr datum)) > (map parse-exp (lasts (caddr datum))) > (map parse-exp (cdddr datum)))] > [else > (eopl:error 'parse-exp > "Invalid named let syntax ~s" datum)])] > [(eqv? (car datum) 'let*) > (cond > [(< (length (cdr datum)) 2) > (eopl:error 'parse-exp "Invalid let* syntax ~s" datum)] > [(and (list-of-lists? (cadr datum)) > (andmap lengths-equal-two? (cadr datum))) > (let*-exp (firsts (cadr datum)) > (map parse-exp (lasts (cadr datum))) > (map parse-exp (cddr datum)))] > [else > (eopl:error 'parse-exp > "Invalid let* syntax ~s" datum)])] > [(eqv? (car datum) 'letrec) > (cond > [(< (length (cdr datum)) 2) > (eopl:error "Invalid letrec syntax ~s" datum)] > [(and (list-of-lists? (cadr datum)) > (andmap lengths-equal-two? (cadr datum))) > (letrec-exp (firsts (cadr datum)) > (map parse-exp (lasts (cadr datum))) > (map parse-exp (cddr datum)))] > [else > (eopl:error 'parse-exp > "Invalid letrec syntax ~s" datum)])] > [(list? datum) > (app-exp (map parse-exp datum))] > [else > (eopl:error 'parse-exp "Invalid syntax ~s" datum)])] > [else (eopl:error 'parse-exp > "Invalid syntax ~s" datum)]))) > > > > ;unparse > (define unparse-exp > (lambda (exp) > (cases expression exp > [var-exp (id) id] > [lit-exp (id) id] > [lambda-exp (vars bodies) > (append (list 'lambda vars) > (map unparse-exp bodies))] > [lambda-var-sym-exp (vars bodies) > (append (list 'lambda vars) > (map unparse-exp bodies))] > [lambda-var-improp-exp (vars bodies) > (append (list 'lambda vars) > (map unparse-exp bodies))] > [set-exp (id var) > (list id (unparse-exp var))] > [app-exp (rands) > (map unparse-exp rands)] > [if-exp (test true false) > (list 'if (unparse-exp test) > (unparse-exp true) > (unparse-exp false))] > [if-noelse-exp (test true) > (list 'if (unparse-exp test) (unparse-exp true))] > [let-exp (vars vals bodies) > (append (list 'let (combine vars vals)) > (map unparse-exp bodies))] > [let*-exp (vars vals bodies) > (append (list 'let* (combine vars vals)) > (map unparse-exp bodies))] > [letrec-exp (vars vals bodies) > (append (list 'letrec (combine vars vals)) > (map unparse-exp bodies))] > [letname-exp (name vars vals bodies) > (append (list 'let name (combine vars vals)) > (map unparse-exp bodies))]))) > _________________________________________________ > For list-related administrative tasks: > http://lists.racket-lang.org/listinfo/users _________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/users

