Звонок схема: Схема подключения звонка в квартире с одной и двумя кнопками
Схема подключения звонка в квартире с одной и двумя кнопками
- Статья
- Видео
Мы уже рассказывали, как подключить дверной звонок своими руками, останавливаясь не только на электросхемах, но и на подробном описании действий. Сейчас хотелось бы больше времени уделить существующим вариантам подсоединения проводов. Существует 3 возможных схемы подключения звонка в квартире, на рассмотрении которых мы остановимся более подробно.
- Способ №1 – Одна кнопка
- Способ №2 – Две кнопки
- Способ №3 – Два основных блока
Способ №1 – Одна кнопка
Самым простым вариантом установки квартирного звонка является подключение основного блока к одной кнопочке, находящейся у двери. Именно такой тип подсоединения используется в большинстве квартир, как старого образца, так и новостроек. Коммутация проводов к сети 220в не сложная, т.к. их всего 4 (с заземлением 5): ноль нужно сразу завести к основному блоку, а фаза идет на разрыв. Электрическая схема подключения дверного звонка предоставлена ниже:
Упрощенный вариант выглядит так:
Способ №2 – Две кнопки
Если Вы хотите, чтобы сигнал срабатывал с двух мест, что очень удобно в частных домах, тогда придется установить две кнопки. Такой метод подключения лучше всего использовать, если к Вам домой можно попасть с парадного входа и через любую другую дверь. Также подключение дверного звонка с двумя кнопками часто используют на производствах. Схема подсоединения в этом случае выглядит следующим образом:
Ничего сложного нет, просто кнопки соединяются параллельно. Учтите, что на разрыв должен идти именно фазный проводник, а не ноль. О том, как правильно найти фазу, мы рассказывали в соответствующей статье.
Способ №3 – Два основных блока
Ну и последняя, не менее популярная схема подсоединения входного звонка – с двумя основными блоками. Опять-таки, в квартирах такой вариант не используется, т.к. и одного сигнализатора будет достаточно, чтобы услышать, что пришли гости. Однако в двухэтажных частных домах бывает не слышно со второго этажа, как звонят на первом. В этом случае рекомендуется подключить двухклавишный выключатель, каждая кнопка которого будет отвечать за свой этаж. Для того, чтобы гостям было понятно, подпишите каждую клавишу и заранее предупредите их о том, как пользоваться таким необыкновенным методом оповещения о визите. Сама схема подключения звонка к 220в будет иметь следующий вид:
Видео пример установки звонка над дверью:
Правильный монтаж основного блока
Обращаем Ваше внимание на то, что все предоставленные схемы подключения звонка в квартире относятся только к проводным моделям. На порядок удобнее пользоваться дистанционными устройствами, работающими на батарейках либо просто от розетки. Надеемся, что информация была для Вас понятной и интересной!
Правильный монтаж основного блока
Схема беспроводного звонка 👉 различные варианты изготовления – Первый дверной
Комментариев 2
Звонок, Разное
Прикладная наука не стоит на месте. Благодаря этому наша жизнь становится комфортной и безопасной. Так в быту появляются новые приборы и гаджеты, усовершенствуются старые. Они становятся компактными, универсальными и стремительно избавляются от проводов. Аналогично дело обстоит и с дверными звонками. Сейчас уже никого не удивишь звонком со множеством мелодий, с хорошим качеством звука или имитирующим голос человека.
А вот беспроводной радиозвонок – это новый продукт на рынке. Тем не менее, с каждым днем его популярность только растет. Связанно это, прежде всего, с тем, что его легко установить и при этом не придется прокладывать провода и сверлить стены. Это важно, когда он установлен на тамбурной двери или на калитке частного дома.
Дверной звонок беспроводного типа
Так в чем же секрет такого уникального устройства. Как говорят, все гениальное – просто. Достаточно заглянуть под его корпус, чтобы убедиться в этом.
[adinserter block=»1″]
Схемы беспроводного звонка
Радиозвонки отличаются друг от друга набором функций, радиусом действия или источником питания. Схожи они в одном – есть приемник и передатчик сигнала. В качестве источника выступает кнопка, а в качестве приемника устройство с музыкальным чипом, антенной и динамиком. Рассмотрим подробнее, в чем принципиально выражается схема беспроводного дверного звонка.
Примерный вид микросхем передатчика
Как видно на схеме передатчик состоит из генератора высокой частоты, усилителя-преобразователя, трех транзисторов и источника питания. В качестве источника питания используется батарейка на 12 вольт.Частота передачи сигнала на приемник составляет 433 МГц. Антенны как таковой здесь нет. В качестве нее выступают два контура, которые подключены параллельно. Таким образом, нехитрая микросхема позволяет передавать сигнал на 50 метров и более.
Общий вид микросхем приемника
Устройство приемника довольно простое. В его основе – один транзистор. От передатчика сигнал поступает на детектор. Он его принимает и направляет на усилитель. Затем сигнал поступает на звуковой чип. На этом чипе и формируется будущий сигнал, который услышит человек. Также благодаря ему меняют мелодии, выбирают громкость звука и так далее. После того как сигнал попал на чип, он поступает на усилитель звука и далее на динамик.
По такому принципу устроены большинство микросхем передатчика и приемника звонков китайского производства.
Для сравнения рассмотрим схемы китайских проводных дверных звонков. Основное отличие – это наличие антенн и способ передачи сигнала от передатчика к приемнику.
Схема проводного китайского звонка
Самодельный звонок беспроводного типа
Рассмотрим одну из самодельных микросхем беспроводного аналога подобного устройства. В основном принципе работы они похожи, но есть некоторые отличия. Основным отличием становится частота, на которой сигнал передается с передатчика на принимающее устройство – 87.9 МГц. Само устройство состоит из следующих основных модулей:
- Схемы управления,
- Звукового чипа,
- Передатчика,
- Источника питания.
[adinserter block=»2″]
Рассмотрим каждый элемент схемы более подробно.
Схема самодельного дверного радиозвонка.
Управление устройством осуществляется посредством кнопки S1. По сути, она запускает музыкальный чип и таймер передатчика. Когда она находится в нажатом состоянии на выводы 6 и 13 идет напряжение. Также здесь присутствует микросхема на резисторе R2 и двух диодах VD1 и VD2. Она лимитирует верхнее значение напряжения на выводах 6 и 13. Это необходимо, так как микросхемы УСМ и К561 отличаются логическим уровнем. Само устройство управления применяется на основе микросхемы D1. Она играет роль таймера, который включает передатчик на несколько секунд, после того как нажата кнопка S1.
Посредством элементов D1.1 и D1.2 генерируется одиночные положительные импульсы. Их длительность напрямую связана с постоянной времени в цепи С1-R4 (беря во внимание значения, указанные на схеме, можно сказать, что длительность импульсов порядка двадцати секунд). Импульс меняет полярность, попадая на инвертор D1.3, и далее идет на ключ VT1. Источник питания бестрансформаторного типа, а установленный конденсатор C5 гасит излишнее напряжения.
Важно! В этой схеме полярные конденсаторы применяются электролитического типа, C11 и С12 – керамические, остальные же — любые. Необходимо, чтобы все конденсаторы имели напряжение не меньше 16V, а для C5 – минимум 300V. Катушки L1 и L2 обматываются тонким проводом: на первую – 6 витков, на вторую – два. Обе они бескаркасные, а внутренний диаметр — семь миллиметров.
Для звукового чипа используется микросхема УМС8-08. Она воспроизводит 8 различных звуков, заложенных в нее. Выбор мелодий осуществляется перелистыванием, посредством S1. Если же пустить выходные импульсы с микросхемы D2 через транзисторный ключ VT2 на трансформатор T1 с конденсатором C10, а затем на динамик, то звучание сигнала будет мягким и приятным для слуха (исчезнут высокие и резкие звуки).
В качестве антенны используют кусок провода. Будет достаточно длины не более метра. С подобной антенной устройство передает сигнал от передатчика к приемнику на расстояние до ста метров.
Теперь необходимо настроить устройство. Первым делом проверяется источник питания. Далее проверяют правильность работы звукового чипа. Если все работает, то переходят к настройке передатчика. На время проводком замыкается VT1 и эммитер. Сам приемник устанавливается на указанной выше частоте. С помощью настройки С11 и С12 добиваемся уверенного приема на максимальной дальности. Благодаря резистору R8 устанавливаем модуляцию для лучшего звучания приемника. Затем перемычка убирается и настраивается таймер на D1. Для этого кратковременно нажимают кнопку S1. При этом передающее устройство включается и работает несколько секунд. Если этот временной промежуток слишком мал или, наоборот, слишком велик, то его изменяют с помощью подбора R4 и C1.
Таким образом, имея минимальные знания и закупив все необходимое в ближайшем магазине радиотоваров, можно сделать надежный звонок своими руками.
Не менее интересная информация о типах электрических звонков
Звонок из ненужных приборов
Если у вас имеется старый телефон или сломанная компьютерная мышь и их ремонт нецелесообразен, то они пригодятся, если вы решите сделать собственный беспроводной звонок на дверь. Рассмотрим вариант изготовления подобного устройства из мыши:
- Из корпуса удаляются все внутренности кроме контактных кнопок.
- На плате две клавиши соединяются со звонковым устройством, а оставшиеся части убираются.
- Колесико разрезается пополам и одна часть вклеивается обратно.
- На плате пульта к звуковой кнопке припаивается витая пара. Она соединяет кнопку с клавишами мышки.
- Припаиваем оставшиеся концы к контактам клавиш – один к крайнему, второй к любому из оставшихся двух.
- Последний контакт из трех соединяется проводом с противоположным. Таким образом будут срабатывать обе кнопки.
Оригинальный звонок готов.
Проголосовали более 280 раз, средняя оценка 5
Введение в схему и ее реализацию
Введение в схему и ее реализацию — call-with-current-continuation
Перейти к первому, предыдущему, следующему, последнему разделу, оглавлению.
call-with-current-continuation
— очень мощный элемент управления
конструкция, которая может быть использована для создания более традиционных
управляющие конструкции, такие как catch
и throw
в Lisp
(или setjmp
и longjmp
в C), или сопрограммы, и многие
более. Он чрезвычайно мощный, потому что позволяет
программа для манипулирования своим собственным «стеком» управления, поэтому
вызовы и возвраты этой процедуры не обязательно должны следовать
нормальное упорядочение текстовых вызовов в глубину.
Напомним, что мы сказали [ГДЕ? ] что эквивалент Схемы
стека активации на самом деле представляет собой цепочку частичных
продолжения (подвесные записи), и эта цепочка
называется полным продолжением. А так как продолжения
неизменны, они обычно образуют дерево, отражающее
граф вызовов (на самом деле только не хвостовые вызовы).
Обычно части этого дерева, которые не находятся в
текущая цепочка продолжения является мусором и может быть
собранный мусор.
Если взять указатель на текущее продолжение и
поместите его в живую переменную или структуру данных, однако,
то эта цепочка продолжения останется живой, а не
собирать мусор. То есть можно «захватить»
текущее состояние стека.
Если вы храните захваченное состояние стека и
позже установите указатель на него в системном каталоге
регистр продолжения, то можно вернуться через
эту цепь продолжения, как если бы она была
нормальное продолжение. То есть вместо возврата
своему абоненту обычным способом, вы можете взять
старое сохраненное продолжение и вернуться в него вместо этого!
Вы можете задаться вопросом, почему кто-то захочет сделать такое
странная вещь в их «стеке», но есть некоторые
полезные приложения. Один — сопрограммы . Часто
удобно структурировать вычисление как чередование
между двумя разными процессами, возможно, одним из
производит предметы и другой, который их потребляет. Это
может быть неудобным для любого из этих процессов
в подпрограмму, которую можно вызвать один раз, чтобы получить
элемент, потому что каждый процесс может иметь сложное состояние
закодирован в своей управляющей структуре.
(Вы, вероятно, не хотели бы структурировать свой
программа как набор инкрементных операций, которые были
вызывается последовательными вызовами процедуры do-next-increment.
Возможно, программа, из которой она получает данные, не может
также легко структурировать таким образом. Каждая программа
вероятно, должно быть написано с его собственным естественным
структура управления, каждая из которых приостанавливает свою работу, когда
ему нужен другой, чтобы делать свое дело.)
Сопрограммы позволяют структурировать взаимодействующие подпрограммы
таким образом, не делая никого подчиненным (и вызываемым
по частям от) другого.
Сопрограммы могут быть реализованы как операции над продолжениями.
Когда сопрограмма хочет приостановить себя и активировать другую
(со-)подпрограмма, она просто подталкивает частичное продолжение к
сохраняет свое состояние, затем фиксирует значение продолжения
каким-либо образом зарегистрируйтесь, чтобы его можно было восстановить позже.
Чтобы возобновить приостановленную процедуру, цепочка продолжения
восстановлено, и верхнее частичное продолжение выскочило в
регистры состояния системы. Чередование сопрограмм
таким образом достигается путем сохранения и восстановления подпрограмм
продолжения.
Обратите внимание, что в этом случае у нас может быть два (или более) дерева
продолжения, которые представляют ход вычислений,
и этот поток управления может чередоваться между
деревья. Обычно вычисления строятся таким образом, чтобы
работа выполняется в обычной процедуре поиска в глубину
вызов и возвращение, с случайными скачками от одной программы
деятельность в глубину к чужой.
Другое использование продолжений — реализация catch
и throw 9.0005 ,
которые примерно похожи на setjmp и longjmp в C. Идея в том,
что вы можете захотеть прервать вычисление, не проходя через
обычная вложенная процедура возвращается. В обычном стеке
lagnuage (без продолжений), это обычно выполняется
путем сохранения указателя в стеке перед запуском прерываемого
вычисление. Если необходимо прервать расчет, все
записи активации над точкой вызова могут быть проигнорированы,
и указатель стека может быть восстановлен до этой точки, как
хотя все вызовы выше вернулись нормально.
Это можно реализовать с помощью call-with-current-continuation
путем сохранения продолжения в точке, где прерываемый
начинается вычисление. В любом месте этого вычисления это
продолжение может быть восстановлено (затирание "нормального" значения
регистра продолжения и т. д.), чтобы возобновить работу с этой точки.
Но вызов с текущим продолжением
более мощный, чем
сопрограммы или поймать и бросить. Мы можем не только уйти «вниз»,
из вычисления (путем извлечения нескольких частичных продолжений
сразу, фактически не возвращаясь через них), мы также можем
побег "вверх" обратно в расчет, который мы спасли
раньше. Это может быть полезно при реализации исключения .
обработка , где мы можем захотеть передать управление специальному
сопрограмма, которая может «исправить» обнаруженную ошибку,
но затем возобновите процедуру, в которой возникла ошибка,
после устранения проблемы.
call-with-current-continuation
также можно использовать для реализации
откат , где поток управления резервируется и выполняется повторно
из какого-то сохраненного продолжения. В этом случае мы можем сохранить
продолжение для некоторых вычислений, но продолжайте и возвращайтесь
через него нормально. Позже мы можем восстановить сохраненное продолжение
и вернуться через него снова.
Обратите внимание, что в общем случае можно использовать продолжения в схеме.
кратно раза. Основная идея заключается в том, что вместо использования
стек, который диктует граф вызова в глубину, Схема позволяет
вам просмотреть график вызовов КАК ГРАФИК, который может содержать циклы,
даже направленные циклы (которые представляют собой возврат).
Синтаксис вызова с текущим продолжением
довольно уродлив,
но по некоторым веским причинам; в сыром виде очень
мощный, но, соответственно, сложный в использовании. Как правило, это
инкапсулируется в макросы или другие процедуры для реализации
другие управляющие конструкции более высокого уровня.
call-with-current-continuation
сам по себе является обычным первоклассным
процедура, которая инкапсулирует очень низкоуровневое продолжение
мануальные способности в чем-то вроде цивилизованной упаковки.
Поскольку это первоклассная процедура, вы можете написать более высокий порядок
процедуры, которые обрабатывают его как данные или вызывают его, или и то, и другое.
call-with-current-continuation
— это процедура ровно из одного
аргумент, который является еще одной процедурой, выполняемой после
текущее продолжение было захвачено. Текущее продолжение
будет передано той процедуре, которая может его использовать (или нет)
как угодно.
Захваченное продолжение само упаковано как процедура,
тоже один аргумент. Это для того, чтобы вы не могли гадить
с самим продолжением любым способом, подобным структуре данных.
Есть только две вещи, которые вы можете сделать с захваченным
продолжения - захватить их и возобновить их. Продолжения
захватываются выполнением call-with-current-continuation
,
который создает процедуру выхода . Они возобновляются по
вызов процедуры побега. При вызове процедура выхода
отказывается от любых вычислений, восстанавливает сохраненные
продолжение и возобновляет выполнение сохраненного вычисления в
точка где 9Произошел вызов 0004 с текущим продолжением .
Обратите внимание, что call-with-current-continuation
— это процедура
один аргумент. Мы назовем эту процедуру прерываемой
процедура. Процедура прерывания должна быть и процедурой
ровно из одного аргумента. (Если вы хотите вызвать процедуру, которая
принимает кучу аргументов и все же делает его прерванным
используя call-with-current-continuation
, вы должны использовать трюк
ниже опишу)
Аргумент прерываемой процедуры — это процедура выхода, которая
инкапсулирует захваченное продолжение.
call-with-current-continuation
делает следующее:
- Создает процедуру выхода, которая фиксирует текущее продолжение.
При вызове эта процедура восстановит продолжение в
точка вызова наcall-with-current-continuation
. - Вызывает процедуру, переданную как ее (call-with-current-continuation’s)
аргумент, передав ему процедуру выхода как его аргумент .
Если и когда процедура escape вызывается, она восстанавливает продолжение
захвачено в точке вызова call-with-current-continuation
.
Мы называем это нелокальным возвратом — с точки зрения
вызывающего абонента call-with-current-continuation
, это выглядит как
хотя вызов с текущим продолжением
вернулся нормально.
Процедура (отменяемая), которую мы хотим вызвать, должна принимать один аргумент, который
процедура выхода, которая может возобновить вычисления сразу после
позвони на вызов с текущим продолжением
.
Как будто это было недостаточно загадочно, процедура выхода также
процедура ровно одного аргумента. Когда процедура побега
используется для выполнения нелокального возврата, он возвращает значение как
результат вызова call-with-current-continuation
.
Аргументом escape-процедуры является значение, которое будет возвращено.
как стоимость вызова. Обратите внимание, что если процедура выхода
Вызывается , а не , и прерываемая процедура возвращается нормально,
возвращаемое им значение возвращается как значение вызова
до вызов с текущим продолжением
.
Следовательно, вызов call-with-current-continuation
может вернуть
двумя способами. Либо прерванная процедура возвращается нормально, и
call-with-current-continuation
просто возвращает это значение, или
процедура escape может быть вызвана, и ее аргумент возвращается как
значение вызова call-with-current-continuation
.
Рассмотрим следующий пример, где я дал номера строк для
обратитесь позже:
0: (определить некоторый флаг #f) 1: (определить (my-abortable-proc escape-proc) 2: (отображать "в моем прерываемом процессе") 3: (если какой-то флаг 4: (escape-процедура "ПРЕРЫВАНИЕ")) 5: (отображать «все еще в моем прерываемом процессе») 6: "НЕ ПРЕВРАЩЕНО") 7: (определить (my-resumable-proc) 8: (сделать что-нибудь) 9: (отображение (вызов с текущим продолжением моей прерываемой процедуры)) 10: (сделай ещё)) 11: (моя-возобновляемая-процедура)
В строке 11 мы вызываем my-resumable-procedure
. Он звонит
сделать что-нибудь
, а затем вызвать display. Но прежде чем он позвонит
display он должен оценить свой аргумент, который является вызовом
на вызов с текущим продолжением
.
call-with-current-continuation
сохраняет продолжение при этом
point и упаковывает его как процедуру выхода. (строка 9) Побег
процедура, если она вызвана, вернет свой аргумент как значение
формы call-with-current-continuation
.
То есть, если процедура escape будет вызвана, она возобновится.
выполнение процедуры отображения, которая печатает это значение,
а затем выполнение продолжится, вызывая do-some-more.
После того, как call-with-current-continuation
создал процедуру выхода,
он вызывает свой аргумент my-abortable-proc
с процедурой выхода как
его аргумент .
my-abortable-proc
затем отображает (распечатывает) «in my-abortable-proc».
Затем он проверяет какой-то флаг
, который является ложным, и выполняет ли , а не
следствие , если
— то есть, он не выполняет побег
процедура. Он продолжает выполняться, отображая
"все еще в
my-abortable-proc."
Затем он оценивает свой последний
форма тела, строка "NOT ABORTED"
, которая вычисляется сама по себе, и
возвращает это как обычное возвращаемое значение вызова процедуры.
На данный момент значение, возвращаемое из my-abortable-proc
печатается вызовом , отображающим
в строке 9.
Но предположим, что мы установили какой-то флаг
на #t
вместо #f
.
Затем, когда управление достигает строки 3, , если
оценивает
его следствие. Это вызывает процедуру побега, передавая
это строка "ABORTED"
в качестве аргумента. Выход
процедура возобновляет захваченное продолжение, возвращая
управление вызывающей стороне call-with-current-continuation
,
без выполнения строк 5 и 6.
Процедура escape возвращает свой аргумент, строку
"ПРЕРЫВНО"
как значение вызова с текущим продолжением
форма. Он восстанавливает выполнение my-resumable-proc в
строка 9, отобразив строку "ПРЕРЫВНО"
(как
значение его формы аргумента). На данный момент "ПРЕРЫВНО"
отображается, и выполнение продолжается со строки 10.
Часто мы хотим использовать call-with-current-continuation для
вызвать некоторую процедуру, которая принимает аргументы, отличные от
процедура побега. Например, у нас может быть
процедура, которая принимает два аргумента, кроме
процедура выхода, таким образом:
(определить (foo x y escape) ... (если (= х 0) (экранировать 'ОШИБКА)) ...))
Мы можем исправить это, каррируя процедуру, сделав ее процедурой
одного аргумента.
[ В одной из предыдущих глав должно быть обсуждение каррирования! ]
Предположим, мы хотим передать 0 и 1 как значения x и y,
а также передать foo процедуру побега. Вместо того, чтобы говорить
(вызов с текущим продолжением foo)
который не передает достаточно аргументов для вызова foo, мы говорим
(вызов с текущим продолжением (лямбда (экранирование) (foo 0 1 escape)))
Лямбда-выражение создает замыкание, которое делает именно то, что
мы хотим. Он вызовет foo с аргументами 0, 1 и побегом
процедура, созданная call-with-current-continuation
.
Перейти к первому, предыдущему, следующему, последнему разделу, оглавлению.
Введение в схему и ее реализацию
Введение в схему и ее реализацию — процедуры первого класса
Перейти к первому, предыдущему, следующему, последнему разделу, оглавлению.
Процедуры первого класса
В Scheme процедуры являются объектами данных — у вас может быть указатель на
процедуру и сделайте то же самое, что и с любым другим значением Scheme.
Технически мы говорим, что процедуры являются объектами первого класса в
язык — вы можете передать процедурное значение в качестве аргумента процедуре,
вернуть его как значение вызова процедуры, сохранить в переменной или
поле другого объекта. Указатель процедуры — это просто значение, которое вы
может передаваться как любое другое значение, например пара или логическое значение.
Процедуры, конечно, особенные, потому что это единственный вид объектов.
который поддерживает операцию вызова процедуры.
В терминологии Схемы
выражение вызова процедуры называется комбинацией . Оценка
комбинации включает оценку выражений аргументов и
приложение процедуры к аргументам, т.е. фактически
вызывая его («применяя его к») этим значениям.
Необычной особенностью Scheme является то, что он использует единое пространство имен ,
это означает, что для обеих обычных переменных существует только одно имя
и процедуры — на самом деле, имена процедур на самом деле просто переменные
имена, и есть только один вид переменных. Именованная процедура
на самом деле просто первоклассный объект процедуры, на который ссылаются
из переменной.
Вспомним определение min
:
(определить (мин a b) (если (< а б) а б))
Когда вы определяете такую процедуру,
на самом деле вы делаете три вещи: создаете процедуру, создаете
нормальная переменная (с именем мин
), и инициализация переменной с помощью
указатель на процедуру.
(Это означает, что у вас не может быть и процедурной переменной, и «нормальной»
переменная данных с тем же именем в той же области видимости — на самом деле существует только
один тип переменной, поэтому вы можете иметь только одну привязку в данной области.)
Когда вы определяете процедуру, как мы делали выше для примера мин
,
Не позволяйте специальному синтаксису определений процедур ввести вас в заблуждение.
имя процедуры на самом деле просто имя переменной, которая
содержать значение процедуры. Вы можете использовать любую переменную таким образом, сохраняя
значение процедуры в нем. Вы также можете назначить новое значение процедуры
в переменную, а затем использовать ее для имени новой процедуры.
Например, если вы определили мин.
, как указано выше, вы можете изменить
значение в привязке мин
говоря (набор! мин +)
.
Это выражение присваивания будет искать значение переменной +
,
которая является процедурой добавления, и присвоить ее переменной
мин
.
Затем, когда вы вызываете min
, как и раньше, вместо этого будет выполняться сложение,
потому что это вызовет ту же процедуру, что и +
. Например
(мин 5 10)
вернет 15
, а не 5
.
Вы также можете изменить значение +
, просто назначив новый
значение (привязка) переменной +
. Это, вероятно,
плохая идея, если у вас действительно нет
веская причина, потому что, если новая процедура не выполняет сложение, любой
код, вызывающий +
, вернет разные ответы!
Важно понимать, как на самом деле работают вызовы процедур в Scheme.
что на самом деле очень просто. Рассмотрим комбинацию (процедура
выражение вызова) (+ а б)
. Что это на самом деле означает
- найдите значение (текущую привязку) переменной
+
,
которую мы предполагаем является процедурой, - искать значения (текущие привязки) переменных
и
иб
, и - применить процедуру к этим значениям, т. е. вызвать ее с этими значениями как
аргументы.
Первое подвыражение комбинации оценивается в
точно так же, как и другие, хотя результат используется по-разному.
Первое подвыражение — это просто подвыражение, которое должно возвращать
значение процедуры, а остальные дают аргументы для передачи ей.
Это не сработает, если первое подвыражение не оценивается
к процедурному значению. Например, вы можете изменить значение
+
с выражением присваивания (set! + 3)
. Тогда, если
вы пытаетесь позвонить +
с комбинацией (+ 2 3)
вы получите ошибку. Схема скажет что-то вроде "ОШИБКА: Попытка
применять непроцедуру».
Тот факт, что первое (операторное) подвыражение вычисляется только
как и любое другое выражение может быть очень полезным. Вместо того, чтобы дать
имя конкретной процедуры для вызова, мы можем использовать любое выражение
результатом которого является процедура. Например, у нас может быть таблица
процедуры для использования в различных ситуациях, и искать, что
таблица для процедуры, вызываемой в определенное время:
((ключ процедуры поиска) foo bar)
Здесь мы вызываем процедуру поиска-
соответствующую-
процедуру
с аргументом ключ
, чтобы получить процедуру, а затем применить ее к
значения foo
и bar
.