Advertisement
Guest User

Untitled

a guest
Aug 21st, 2009
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 1.57 KB | None | 0 0
  1. (function lch:tknize ( right )
  2.   (foreach-map (r right)
  3.      (cond
  4.        ((symbol? r)
  5.         (case r
  6.          ((<- & |) `(,r))
  7.          (else `(VAR ,r))))
  8.        (else `(OTHER ,r)))))
  9.  
  10.  
  11. (bnf-parser
  12.   ((comprexpr lch:parse-compr))
  13.  
  14.   (comprexpr
  15.     ((expr:e | rightexpr:r) `(lch:list-comprehension ,e (generators ,@r))))
  16.  
  17.   (expr
  18.     ((VAR) $0)
  19.     ((OTHER) $0))
  20.  
  21.   (rightexpr
  22.     ((rightsome:l | rightexpr:r) (cons l r))
  23.     ((rightsome) (list $0)))
  24.  
  25.   (rightgena
  26.     ((expr:v <- expr:e) `(<- ,v ,e)))
  27.  
  28.   (rightsome
  29.     ((rightgena:l & rightexprs:r) `(with ,l ,@r))
  30.     ((rightgena) $0))
  31.   (rightexprs
  32.     ((expr:l & rightexprs:r) (cons l r))
  33.     ((expr) (wrap $0)))
  34.  
  35. )
  36.  
  37. (function lch:parse ( expr )
  38.    (car ((lch:parse-compr nil) (lch:tknize expr))))
  39.  
  40. (macro lch:list-comprehension ( inner-expr generators )
  41.   (let loop (( v (cdr generators )))
  42.     (p:match v
  43.       (() inner-expr)
  44.       (((<- $vr $e) . $cdrv)
  45.        (let ((nvr (if (list? vr) (gensym) vr)))              
  46.      `(,(if (null? cdrv) 'foreach-map 'foreach-mappend) (,nvr ,e)
  47.        ,(if (list? vr) `(format ,nvr ,vr ,(loop cdrv)) (loop cdrv)))))
  48.       (((with ($_ $vr $e) . $qery) . $cdrv)
  49.        `(,(if (null? cdrv) 'foreach-map-filter 'foreach-mappend-filter)
  50.      (,vr ,e) (and ,@qery)
  51.      ,(loop cdrv)
  52.      )))))
  53.  
  54. (macro <L> rest
  55.    (
  56.     "A list comprehensions macro."
  57.     ""
  58.     "Format: [[(<L> generator-expression | source-sets*)]]"
  59.     ""
  60.     "Usage example:"
  61.     "[["
  62.     " (<L> (cons x y) | x <- '(a b) | y <- '(a b) & (not (eqv? x y)))"
  63.     "]]"
  64.     )
  65.    (lch:parse rest))
  66.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement