Как я могу перегрузить функцию во время выполнения в схеме? - PullRequest
2 голосов
/ 18 июля 2010

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

Ответы [ 3 ]

5 голосов
/ 18 июля 2010
(define (foo x) ...stuff...)
(set! foo (lambda (x) ...different stuff...))
1 голос
/ 18 июля 2010

Может быть целесообразно использовать let, чтобы сделать это локально, это также может применяться к ключевым словам в этом смысле:

(let ((define +))
   (define 2 3)) ; ===> 5

Или даже переопределить их для констант, помните, что Scheme - это lisp-1:

(let ((define 2) (+ 4))
   (- define +)) ; ===> -2

Или даже:

(let ((quote /))
   '3) ===> 1/3

Выполнение этого только локально сохраняет функциональный стиль.

0 голосов
/ 18 июля 2010

Если вы хотите перегрузить функцию, которую вы определили ранее, просто определите ее снова.Это также работает для переопределения функций, таких как car и cdr, например, для превращения car в cdr:

(define (car x) (cdr x))

Однако,Я думаю, что вы не сможете повлиять на другие уже определенные функции с таким переопределением, поэтому системная функция, использующая автомобиль, все равно будет использовать исходную системную машину, а не вашу:

(определение (тест x) (автомобиль x))

(определение (тест x) (cdr x))

(тестирование (1 2 3))

1

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

Если вы хотите переопределить ключевые слова схемы, такие как lambda или cond, используйте синтаксис let (см. http://community.schemewiki.org/?scheme-faq-language)

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