Узнал сегодня про макрос with-method, который я оказыется успешно перезобрел пару раз.
Макрос извлекает методы ил класса и биндит их как функции на область действия.
(with-method ((id (obj-expr method-id)) ...)
body ...+)
Узнал сегодня про макрос with-method, который я оказыется успешно перезобрел пару раз.
Макрос извлекает методы ил класса и биндит их как функции на область действия.
(with-method ((id (obj-expr method-id)) ...)
body ...+)
Суровый выхлоп работы ракетовского макростеппера:
(define (g)
(forever (let ([abort abort])
(unless #t (abort)) (abort))))))
Для тех, кому интересно: первый abort имееет контекст из раскрытия макроса while', а второй - из раскрытия макроса
forever', этакие костыли для обхода гигены без использвания stx-params.
сорцы: http://paste.lisp.org/display/138905
соус: barzilay.org/misc/stxparam.pdf
Считаете, что монадные трансформеры это сложно?
Попробуйте разобраться с syntax model в racket!
Ну короче, как обычно было нечего делать, запилил тупую генерацию выпуклой оболочки трех точек (ТРЕУГОЛЬНИК ДА)
методом выпуклых сумм векторов.
Картинко:
http://i.imgur.com/tMDt225.png
Сорсы:
https://github.com/4DA/racket-algorithms/blob/master/build_convex_hull.rkt
В ракете есть гуй: http://docs.racket-lang.org/gui/ Но только он какой-то странный. Копировать из messagebox-ов нельзя. ctrl-c ctrl-v в текстовых полях не работает, хз вообще что делать. Вообще ракет странный и такое впечатление, будто какой-то недоделанный. Или просто логика тех, кто его делал, какая-то своя, необычная, никакувсех. Например, я так и не нашёл команду, которая бы возвращала булево значение присутствует ли данный элемент в данном списке или нет. Зато есть команда (member e lst), которая возвращает кусок списка lst начиная с элемента e, а если такого элемента там нет, то возвращает #f. Я написал вот такой костыль:
(define (member? el lst)
(not (equal? (member el lst) #f)))
Это не сложно, но как-то странно, что в языке, который построен на операциях со списками чуть менее чем полностью, такой банальной хуйни нет по умолчанию.
Fear of Macros.
Неплохой туториал по макросам.
Русское быдло в рассылке racket
http://lists.racket-lang.org/users/archive/2013-March/056969.html
Хочу начать костылять интерпретатор elisp на racket.
Дальше в планах - реализация недоемакса.
Чят, отговори.
General Parser Combinators in Racket
https://github.com/epsil/gll
На лоре спросили:
/можно ли написать на Racket такую функцию, чтобы внутри неё (в её динамическом окружении) делений на 0 возвращало 0, а не прерывало вычисления/
Короче, да:
(define-syntax-rule (try-or-zero body ...)
(let/cc k (with-handlers ([exn? (λ _ (k 0))])
body ...)))
(define (testl l)
(if (null? l)
'()
(cons (try-or-zero (/ 1 (car l)))
(testl (cdr l)))))
(testl '(1 2 3 0 5))
мемоизация на ракете.
nothing special.
; replace define with a memoized version
(define-syntax define-memoized
(syntax-rules ()
[(_ (f args ...) bodies ...)
(define f
; store the cache as a hash of args => result
(let ([results (make-hash)])
; need to do this to capture both the names and the values
(lambda (args ...)
((lambda vals
; if we haven't calculated it before, do so now
(when (not (hash-has-key? results vals))
(hash-set! results vals (begin bodies ...)))
; return the cached result
(hash-ref results vals))
args ...))))]))
; example, fibonacci with memoization
(define-memoized (mfib n)
(cond
[(< n 1) 1]
[else (+ (mfib (- n 1)) (mfib (- n 2)))]))