-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathReflection.scm
42 lines (33 loc) · 1.22 KB
/
Reflection.scm
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
;; Tema1 - PP
;; Mini - API pentru functii capabile de reflexie.
(define-syntax define-r
(syntax-rules ()
((_ name lambda-ex)
(define name
(make-reflection-function 'name 'lambda-ex)))))
(define (get-name f) (f '__GET_NAME__))
(define (get-lambda f) (f '__GET_LAMBDA__))
;;------------------------------------------------------------------------------
;; Functii ajutatoare (nu se vor folosi)
(define (make-reflection-function name lambda-ex)
(if (not (valid-lambda-ex? lambda-ex))
(error (string-append "INVALID LAMBDA EXPRESSION FOR FUNCTION "
(symbol->string name)))
(let ((real-function (eval lambda-ex)))
(lambda args
(if (and (not (null? args)) (null? (cdr args)))
(cond
((equal? (car args) '__GET_NAME__) name)
((equal? (car args) '__GET_LAMBDA__) lambda-ex)
(else (real-function (car args))))
(apply real-function args))))))
(define (valid-lambda-ex? ex)
(and (list? ex)
(has-length? 3 ex)
(equal? 'lambda (car ex))
(list? (cadr ex))))
(define (has-length? n L)
(cond
((zero? n) (null? L))
((null? L) #f)
(else (has-length? (sub1 n) (cdr L)))))