Переопределить встроенную схему, но только если она используется в качестве аргумента для конкретной процедуры? - PullRequest
0 голосов
/ 01 сентября 2018

Как я могу переопределить процедуру and только тогда, когда она вызывается в качестве аргумента для процедуры fetch?

Например:

; this `and` returns #f
(and #t #f)

; this `and` returns "and a b" 
(fetch (foo (bar (and "a" "b"))))

Я хотел бы написать макрос для этого, но я не могу понять, как написать шаблон, который соответствует and в любом месте произвольного дерева аргументов, переданных fetch.

Я использую Chicken и с удовольствием использую столько R7RS, сколько поддерживает Chicken.

1 Ответ

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

Один крот: and - это не процедура, это синтаксис (подумайте об этом: оценка останавливается, как только встречается первый #f).

Но независимо от этого, я не думаю, что вы пытаетесь сделать это, переопределив and. Вам нужно будет преобразовать fetch в макрос. Вместо того, чтобы пытаться сканировать ввод и заменять and, я бы использовал негигиеничный let, чтобы переопределить значение and локально. Немного так:

(define my-local-and ...)
(define the-real-fetch ...)

(define-syntax fetch
  (ir-macro-transformer
    (lambda (e i c)
      `(let ((,(i 'and) my-local-and))
         (the-real-fetch ,@(cdr e))))))

Я бы на самом деле возразил против этого, потому что это действительно испортит ожидания пользователей в отношении того, что происходит. Возможно, вы можете объяснить немного больше о почему вы хотите это сделать?

...