27 квітня 2012

Kawa: import, як у Clojure

У принципі, мені подобається і мій макрос з минулого поста, import-many, але я хотів зробити щось ще більше подібне на Clojure. Ось вам результат.

; Clojure-like import macro for Kawa scheme (cimport)
(require 'pregexp)

(defmacro import-many (ns . classes)
  (cons 'begin
        (let loop ((shortname (car classes))
                   (rest (cdr classes)))
             (cons (list 'define-alias
                         shortname
                         (string->symbol
                           (string-append
                                 (symbol->string ns)
                                 "."
                                 (symbol->string shortname))))
                   (if (eqv? rest '())
                       '()
                       (loop (car rest) (cdr rest)))))))

(defmacro import-one-class (class)
  (let* ((clname (symbol->string class))
         (indexes (car (pregexp-match-positions
                          "\.[^.]+$" clname)))
         (short-name (substring clname
                                (+ (car indexes) 1)
                                (cdr indexes))))
        (list 'define-alias
              (string->symbol short-name)
              class)))

(defmacro cimport lists-or-classes
  (cons 'begin
        (let loop ((first (car lists-or-classes))
                   (rest (cdr lists-or-classes)))
                  (cons (if (list? first)
                            (cons 'import-many first)
                            (list 'import-one-class first))
                        (if (eqv? rest '())
                            '()
                            (loop (car rest) (cdr rest)))))))

Користатися так:

(cimport (javax.swing JFrame JPanel JButton) java.util.Date)

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