27 квітня 2012

Kawa: макроси-стрілки (-> ->>) з Clojure

Написати свої аналоги макросів -> так ->> (запозичених з мови Clojure) для мови Scheme (вони мали б працювати не тільки в Kaw’і, але в мене для тестування саме Kawa) виявилося не просто, а дуже просто:

(define-syntax ->
  (syntax-rules ()
    ((-> x) x)
    ((-> x (fn . args)) (fn x . args))
    ((-> x fn) (fn x))
    ((-> x fn rest ...) (-> (-> x fn) rest ...))))

(define-syntax ->>
  (syntax-rules ()
    ((->> x) x)
    ((->> x (fn args ...)) (fn args ... x))
    ((->> x fn) (fn x))
    ((->> x fn rest ...) (->> (->> x fn) rest ...))))

А використовуються вон так, як в Clojur’і:

(-> (sqrt 25) integer list)

Це еквівалентно ось цьому:

(list (integer (sqrt 25)))

Більше про ці макроси можна прочитать ось тут: http://blog.fogus.me/2009/09/04/understanding-the-clojure-macro/. Ну, чи в у довідці до Clojure: http://clojure.github.com/clojure/clojure.core-api.html. А тут можна подивитися, як реалізовали цей макрос у модулі clojurian для Chicken Scheme: https://bitbucket.org/DerGuteMoritz/clojurian/src/3b701b8f1e09/clojurian-syntax.scm.

0 коментарів | Коментувати