Skip to content

Commit

Permalink
initial commit w/ failing specs
Browse files Browse the repository at this point in the history
  • Loading branch information
smtlaissezfaire committed Sep 30, 2010
0 parents commit e008d80
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.rdoc
@@ -0,0 +1 @@
Some syntax transformation excercises in scheme. Just seeing what's possible with macros, etc.
53 changes: 53 additions & 0 deletions syntax_transformer.ss
@@ -0,0 +1,53 @@
#lang scheme/base

(define list-contains-char?
(lambda (lst search)
(cond
((null? lst) #f)
((equal? (car lst) search) #t)
(else
(list-contains-char? (cdr lst)
search)))))

(define string->split
(lambda (str token)
(let ((chars (string->list str)))
(letrec
((f (lambda (before after)
(cond
((null? after)
(list before after))
((equal? (car after) token)
(list before
(cdr after)))
(else
(f (cons (car after)
before)
(cdr after)))))))
(let ((x (f '() chars)))
(list
(list->string (reverse (car x)))
(cdr x)))))))

(define split_obj_and_args
(lambda (obj_and_args)
(string->split obj_and_args #\.)))

(define transform-syntax
(lambda (syntax)
(cond
((list-contains-char? (string->list (symbol->string (car syntax)))
#\.)
(let ((sym_and_args (split_obj_and_args (symbol->string (car syntax)))))

(cons
(quote __message_send__)
(cons
(string->symbol (car sym_and_args))
(cons
(cdr sym_and_args)
'())))))
(else
syntax))))

(provide transform-syntax)
20 changes: 20 additions & 0 deletions syntax_transformer_test.ss
@@ -0,0 +1,20 @@
#!/usr/bin/env mzscheme
#lang scheme/base

(require (planet schematics/schemeunit:3)
"syntax_transformer.ss")

; test the framework
(check-equal? #t #t "true is true")

(check-equal?
(transform-syntax (quote (foo bar baz)))
(quote (foo bar baz)))

(check-equal?
(transform-syntax (quote (foo.bar)))
(quote (__message_send__ foo (quote bar))))

(check-equal?
(transform-syntax (quote (bar.baz)))
(quote (__message_send__ bar (quote baz))))

0 comments on commit e008d80

Please sign in to comment.