LINUX.ORG.RU

Scheme


0

1

Можно ли на макросах Scheme сделать такую штуку:

Есть некий макрос: (TEST name p1 p2 p3), который объявит функции:
name-decode, name-encode, name-print. Т.е. склеить имя как в макросах C: name##_encode, name##_decode.

Может есть и другое решение. Есть некоторая сруктура (SEQUENCE name (field1 type1) (field2 type2)..)

По ней надо сгенерировать функции для кодировки, печати и декодировки, которые в свою очередь вызывают функции кодировки, печати и декодировки вложенных типов с известными типами type1, type2 и т.д.

★★

Да, можно.

anonymous
()

у меня достаточно базовое представление о scheme, но вот, например, на elisp можно сделать что-то вроде:


(defmacro def-some-fn (fn-name)
  (let* ((fn (symbol-name fn-name))
	 (fn+ (intern (concat fn "foo")))
	 (fn- (intern (concat fn "bar"))))
    `(progn
      (defun ,fn+ () "+")
      (defun ,fn- () "-"))))

(def-some-fn soo)

lazyklimm ★★★★★
()
Ответ на: комментарий от lazyklimm

нет, ему сюда: http://www.cs.indiana.edu/~dyb/pubs/tr356.pdf стр. 23

например:

(define-syntax test
  (lambda (stx)
    (define (construct-name template-identifier . args)
      (datum->syntax
       template-identifier
       (string->symbol
               (apply string-append
                      (map (lambda (x)
                             (if (string? x)
                                 x
                                 (symbol->string (syntax->datum x))))
                           args)))))
    (syntax-case stx ()
      ((_ name p1 p2 p3)
       (with-syntax
           ((-decode (construct-name (syntax name) (syntax name) "-decode"))
            (-encode (construct-name (syntax name) (syntax name) "-encode"))
            (-print  (construct-name (syntax name) (syntax name) "-print" )))
         (syntax
          (begin
            (define -decode p1)
            (define -encode p2)
            (define -print  p3))))))))

(test foo 1 2 3)

foo-decode ; => 1
foo-encode ; => 2
foo-print  ; => 3
korvin_ ★★★★★
()
Ответ на: комментарий от korvin_

Спасибо! Работает, но разобраться в том, что написано даже по документации не просто:)

olegk ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.