(define CTX:s 7)
(print CTX:s)
(define CTX:f (lambda (a) (+ 1 a)))
(define CTX:g (lambda (a) (+ n a)))
(setq CTX:n 66)
(setq n 1)
(CTX:g 2) ---> 3
(define CTX:g (lambda (a) (+ CTX:n a)))
(CTX:g 2) ---> 68
(define C:n 1)
(define C:g (lambda (a) (+ C:n a)))
(setq cn CTX)
(cn:g 2) -> 68
(setq cn C)
(cn:g 2) -> 3
(setq cn C)
(define cn:X 8)
(define cn:X2 (lambda () (* cn:X 2)))
(cn:X2) -> 16
(setq cn CTX)
(define cn:X 1)
(define cn:X2 (lambda () (* cn:X 2)))
(cn:X2) -> 2
(define X2 (lambda (cn) (* cn:X 2))
(X2 C) -> 16
(X2 CTX) -> 2
(define (mk-ctx c) (define c:X2 (lambda (cn) (* cn:X 2))))
(context 'OO)
(context MAIN)
(mk-ctx OO)
(OO:X2 C) ---> 16
(OO:X2 CTX) ---> 2
(define (mk-ctx c) (define c:X2 (lambda () (* c:X 2))))
(define (mk-ctx c) (define c:X2 (lambda () (print c) (* c:X 2))))
(setq OO:X 10)
(setq c 9382)
(mk-ctx OO)
(OO:X2)
9382
ERR: context expected in function * : MAIN:c
called from user function OO:(X2)
(setq c OO)
(mk-ctx OO)
(OO:X2) ---> 20
OO
(define (mk-ctx c) (define c:X2 (lambda () (let (cn (context)) (* cn:X 2)))) c)
(setq the-ctx (mk-ctx OO))
(the-ctx:X2) --> 20
(define (mk-ctx c) (define c:X2 (lambda () (* (my 'X) 2))) c)
(define (my v) (eval (sym v (context))))
(define (mk-ctx c f b) (define c:f b) c)
(setq the-ctx (mk-ctx OO 'f (lambda () (let (cn (context)) (* cn:X 2))) ))
(the-ctx:f) --> 20
(setq the-ctx (mk-ctx OO 'f (lambda () 1) ))
(the-ctx:f) --> 1
(my 'v) ---> returns the value of symbol v in context defined using mk-ctx (current context, OO, when invoking the function f)
(setf (my 'v) 4) ---> set the value of symbol v to 4 in context defined using mk-ctx
(define (sel-idx lst)
(let ((out '()) (len (length lst)))
(dolist (el lst)
; select and index of the list different from the current
(while (= (setq idx (rand len)) $idx))
;(println "coppia: " $idx idx)
(push (list $idx idx) out -1))
out))
(sel-idx '(1))
;-> ((0 0)) --> ERROR(sel-idx '(1 2))
;-> ((0 1) (1 0)) --> OK
(sel-idx '(1 2))
;-> ((0 1) (1 1)) --> ERROR
Why doesn't the function produce correct results?(define (sel-idx-ok lst)
(let ((out '()) (len (length lst)) (tmp 0))
(dolist (el lst)
(setq tmp $idx)
; select and index of the list different from the current
(while (= (setq idx (rand len)) tmp))
;(println "coppia: " $idx idx)
(push (list tmp idx) out -1))
out))
(sel-idx-ok '(1))
;-> ... --> infinite loop
(sel-idx-ok '(1 2))
;-> ((0 1) (1 0)) --> OK
(sel-idx '(0 1 2 3 4 5 6 7 8 9))
;-> ((0 4) (1 9) (2 4) (3 8) (4 8) (5 9) (6 1) (7 1) (8 6) (9 6))
(define (test lst)
(let (len (length lst))
(dolist (el lst)
; select and index of the list different from the current
(while (!= (setq idx (rand len)) $idx)))
(println "index: " idx)))
Why (test '(1 2 3 4 5)) fall (almost always) into an infinite loop?(define (primes-to num)
"Generate all prime numbers less than or equal to a given number"
(cond ((< num 2) '())
((< num 3) '(2))
(true
(letn ((m (/ (- num 3) 2))
(arr (array (+ m 1)))
(lim (/ (- (int (sqrt num)) 3) 2))
(lst '(2)))
(for (i 0 lim)
(when (nil? (arr i))
(letn ((p (+ (* 2 i) 3))
(j (/ (- (* p p) 3) 2)))
(for (k j m p (> k m))
(setf (arr k) true)))))
(for (i 0 m)
(when (nil? (arr i))
(push (+ (* 2 i) 3) lst -1)))
lst))))
(time (println (length (primes-to 1e6))))
;-> 78498
;-> 100.292
(time (println (length (primes-to 1e7))))
;-> 664579
;-> 1396.784
(time (println (length (primes-to 1e8))))
;-> 5761455
;-> 15544.004
(time (println (length (primes-to 1e9))))
;-> 50847534
;-> 178960.989