[racket] else: not allowed as an expression in: else

From: Jon Rafkind (rafkind at cs.utah.edu)
Date: Tue Dec 21 19:34:04 EST 2010

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



Posted on the users mailing list.