-
Notifications
You must be signed in to change notification settings - Fork 0
/
syntax_transformer.ss
53 lines (47 loc) · 1.36 KB
/
syntax_transformer.ss
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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)