Проверка ссылки на процедуру для типа? - PullRequest
0 голосов
/ 07 февраля 2012

Мы используем версию схемы r5rs, пытающуюся проверить указатель процедуры на тип, на который он указывает.

Мы создали объект, используя:

(define (%macro name exp env)
  (define (set-exp new_exp) (set! exp new_exp))
  (define (set-env new_env) (set! env new_env))
  (define (set-name new_name) (set! name new_name))

  (define (%dispatch call)
    (cond 
      ((eq? call 'get-exp) exp)
      ((eq? call 'get-env) env)
      ((eq? call 'get-name) name)

      ((eq? call 'set-exp) set-exp)
      ((eq? call 'set-env) set-env)
      ((eq? call 'set-name) set-name)
  ))

  %dispatch
)

Затем мы хотим проверить ссылку на процедуру, чтобы определить, указывает ли она на функцию отправки в другой части кода:

(define (macro? exp)
  (eq? %macro exp)
  )

Похоже, это не работает. Как правильно проверить указатель, если он указывает на макрообъект (действительно, процедура отправки)?

Любая помощь очень ценится:)

1 Ответ

3 голосов
/ 07 февраля 2012

Возможно, добавьте еще один метод к вашему объекту, который отвечает на 'macro ?. С точки зрения программиста на Java: избегайте вызовов instanceof. Если все ваши объекты следуют общему протоколу, как реализация макроса? метод, это решит проблему?

В более функциональных языках, таких как full Racket, использование свойства типа структуры также будет работать. Поскольку вы намеренно находитесь в r5rs, ваши возможности более ограничены.

...