Каков эквивалент схемы для этого псевдонима, написанного на CL? - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь написать схему, эквивалентную этому коду CL:

(defmacro alias (new-name prev-name)
  `(defmacro ,new-name (&rest args)
     `(,',prev-name ,@args)))

;; Sample use:
(alias co concatenate)

Моя цель состоит в том, чтобы иметь возможность использовать сокращенные имена для имен символов и функций, например:

(alias sa string-append)
(sa "ok" "not ok") 

Для этого я попробовал это, но это не сработало:

(define-syntax alias (new-name prev-name)
   `(define-syntax ,new-name (#!rest args)
     `(,',prev-name ,@args)))

Любая помощь приветствуется.Спасибо.

Ответы [ 3 ]

0 голосов
/ 15 сентября 2018

Если ваша схема поддерживает регистр синтаксиса R6RS и родственники (скажем, схема guile или chez), синтаксис идентификатора является наиболее прямым способом реализации того, что вы хотите:

(define-syntax new-name (identifier-syntax old-name))

Таким образом:

(define-syntax new-display (identifier-syntax display))
(new-display "hello\n")

Редактировать : Я вижу, вы используете курицу. В этом случае вы можете использовать er-macro-transformer для воспроизведения вашего решения defmacro (в любом случае это работает с chicken-4.10.0):

(define-syntax alias
  (er-macro-transformer
   (lambda (exp r c)
     (let ([new-name (cadr exp)]
           [old-name (caddr exp)])
       `(define-syntax ,new-name
          (ir-macro-transformer
           (lambda (exp i c)
             `(,',old-name ,@(cdr exp)))))))))
0 голосов
/ 15 сентября 2018

Кстати, в Common Lisp вы можете сделать псевдоним реальной функцией, а не макросом, установив symbol-function символа, обозначающего псевдоним, подобный этому:

CL-USER> (defun foo (name)
           (format nil "Hello ~A!~%" name))
FOO
CL-USER> (setf (symbol-function 'bar)
               #'foo)
#<INTERPRETED-FUNCTION FOO>
CL-USER> (bar "Bob")
"Hello Bob!
"
0 голосов
/ 13 сентября 2018

Вы можете легко сделать это с помощью макроса syntax-rules, который определяет другой макрос syntax-rules:

(define-syntax alias
  (syntax-rules ()
    ((_ new-name prev-name)
     (define-syntax new-name
       (... (syntax-rules ()
              ((_ arg ...)
               (prev-name arg ...))))))))

Самое сложное в том, что этот макрос - использование ... для избежания вложенного использования ....

Однако это не обязательно лучший способ сделать это.Вероятно, наилучший способ зависит от вашей точной реализации Scheme, поскольку Scheme - это не столько язык, сколько семья.Написание переносимой схемы обычно не очень полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...