Вы не можете сделать это, но вы можете сделать что-то эквивалентное. Допустим, у меня есть какая-то функция f1
, в которой связаны a
и b
(скажем, они являются аргументами, поскольку это облегчит задачу). И в какой-то момент я хочу поменять местами a
и b
. Итак, я начну с этого:
(define f1
(λ (a b)
... code that uses a and b ...
(let ([tmp a])
(set! a b)
(set! b tmp))
... code that uses a and b, now swapped ...))
И этот код явно не функционален, так как в нем есть назначение. Но я могу сделать это, придумав новую функцию, f2
:
(define f1
(λ (a b)
... code that uses a and b ...
(f2 b a)))
(define f2
(λ (a b)
... code that uses a and b, now swapped ...))
И этот код является функциональным, и он делает то же самое. И тогда я могу просто избавиться от имени f2
, потому что функции первого класса:
(define f1
(λ (a b)
... code that uses a and b ...
((λ (a b)
... code that uses a and b, now swapped ...)
b a))
(И, очевидно, мы бы написали это как:
(define f1
(λ (a b)
...
(let ([b a] [a b])
...)))
это то же самое.)
Таким образом, этот код теперь делает то же самое, что и исходный код, за исключением того, что он является чисто функциональным (хорошо: пока код в многоточии есть, чего, вероятно, нет, поскольку первый блок действительно может только что-то делать побочным эффектом).
Теперь вот умный бит: Схема должна быть корректно хвостовой рекурсивной . Это означает, что хвостовые вызовы должны быть исключены реализациями. Вызов функции в Схеме - это, по сути, GO TO, передающий аргументы, как это классно описано в Разоблачение мифа о «дорогостоящем вызове процедуры», или реализациях вызова процедур, считающихся вредными, или Lambda: The Ultimate GOTO , одна из знаменитых работ «Лямбда-ультрас». Вызов функции к тому, что изначально было f2
и стало анонимной функцией, является хвостовым вызовом, и поэтому должен быть исключен. Любая разумная реализация Схемы, скорее всего, превратит этот код в код, который такой же или, возможно, лучше, чем простой код с присваиванием.
Примечание к лямбда-ультрасовременным документам: сайт, на котором размещались их копии и на которые по-прежнему много ссылок, , в том числе из Википедии *, 1037 * превратился в спам: не подписывайтесь эти ссылки (у сайта было название, которое включало слова «читать» и «схема»). Лучшим местом для их поиска сейчас является хранилище AI Memos на MIT . Довольно досадно, что их стало так трудно найти, поскольку они являются абсолютно основополагающими документами.