Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24

Простой радиопередатчик из блока телевизора СК-М-24-2 — Конструкции простой сложности — Схемы для начинающих

Работая со школьниками уже много лет, не понаслышке знаю о том, что почти каждый школьник мечтает о связи. И мобилка здесь как раз не причем. Другое дело, что современных конструкций для новичков много. Правда, нужно признать, что они как раз и не для новичков. А время 6П3С уже ушло. Так как удовлетворить голод на простые передатчики? Думаю, нет необходимости говорить, что советы купить айком или даже UW3DI абсурден. Для двенадцатилетнего подростка этот вариант никто рассматривать не будет (разве что папа — радиолюбитель что-то предпримет). В литературе можно найти множество схем радиомикрофонов. Но только человек несведующий может подумать, что они могут работать. Нестабильность частоты, внешние наводки, случайное питание сводят на нет простоту схемы и… разочарование подчас на всю жизнь. Для того, чтобы все-же удовлетворить интерес на передатчики — игрушки, работающие на расстояние в несколько десятков метров (а других требований ребята, как правило и не ставят) и была разработана несложная конструкция выходного дня — передатчик «Регата», лауреат нескольких выставок творчества радиолюбителей — конструкторов Мариуполя.

В качестве  задающего генератора передатчика использован готовый узел стандартного телевизора – блок селектора метровых волн СК-М-24. Напомню, что селектор представляет собой преобразователь частоты каналов метровых волн, состоящий из двух поддиапазонов 1-5 и 6-12 телевизионных каналов. В данном передатчике использован первый из поддиапазонов (1-5 каналы). Спектр частот принимаемых сигналов составляет 48,5…100 МГц. Гетеродин блока при этом перекрывает диапазон частот на 38 МГц  выше, т.е. 86,5 … 138 МГц. Таким образом, для получения частот FM диапазона 100 … 108 МГц достаточно использовать частоту гетеродина в качестве задающего генератора и передатчик готов. Для этого необходимы минимальные переделки. В схеме блока СК-М-24-2 транзистор VT5 выполняет функцию гетеродина данного поддиапазона, а смеситель VT3 требуется перевести в режим усиления сигнала гетеродина 100 … 108 МГц.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 Для этого в катушке L 21 требуется смотать лишние витки, оставив 8 витков из имеющихся 24-х. Для вывода сигнала генератора использован разъем блока «выход ПЧ», с включенным в  разрыв дополнительным конденсатором С9 (рис. 1). Для перекрытия нужного участка 100 … 108 МГц на вывод 4 блока СК-М-24 (настройка) необходимо подать регулируемое напряжение в диапазоне примерно 5,5 … 8 V. На схеме рис. 1 для этой цели использован переменный резистор R8, а пределы регулировки частоты при необходимости можно скорректировать подбором резисторов R7 и  R9. Для модуляции звуковым сигналом используется усилитель на транзисторе VT1, сигнал с которого через регулятор «Уровень» подмешивается в напряжение перестройки частоты (вывод 4 блоки СК-М-24). При использовании динамического микрофона можно обойтись и без микрофонного усилителя. Частотная модуляция получается за счет изменения емкости варикапа гетеродина под действием звукового сигнала. Микрофон подключается к выводам 1 и 2 XS1, а сигнал с магнитофона поступает с выводов 3 и 5 XS1 (вывод 2 остается общим) через делитель напряжения R1, R1-a, R5.

Выходное гнездо ПЧ используется для подключения антенны, в качестве которой может служить кусок провода длиной 1-1,5 метра. Приемником может служить любой приемник с ФМ — диапазоном. Данная конструкция может помочь при организации различных соревнований как «рупор» судейской коллегии, как своего рода трансляция в детских лагерях отдыха и т.п. Качество сигнала, стабильность частоты и модуляция достаточно высокие.

Селектор — канал — метровый диапазон

Селектор — канал — метровый диапазон

Cтраница 1

Селектор каналов метрового диапазона, СК-М-15 ( рис. 41) предназначен для приема телевизионных программ в метровом диапазоне частот.
[2]

Как известно, существующие селекторы каналов метрового диапазона представляют собой механические переключатели барабанного типа.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 Их основным недостатком в процессе эксплуатации является необходимость приложения значительных усилий для переключения с канала на канал, а также довольно часто происходящая потеря электрического контакта из-за их загрязнения. Нарушение контакта приводит к ухудшению качества приема или потере приема по одному, а иногда и по нескольким каналам. При полной потере контакта исчезают изображение и звук.
[4]

Селектор каналов дециметрового диапазона СК-Д-1 в отличие от селекторов каналов метрового диапазона имеет плавную настройку на принимаемые каналы во всем дециметровом диапазоне. Настройка осуществляется механическим способом — — счетверенным блоком конденсаторов переменной емкости, которые включены в контуры с четвертьволновыми отрезками линий. Существуют селекторы каналов дециметрового диапазона СК-Д — 18; СК-Д-22 и — СК-В-1, в которых настройка осуществляется электронным способом в результате изменения емкости варикапов путем подачи на них управляющего напряжения. Применение варикапов в селекторах метрового и дециметрового диапазонов дает возможность осуществить сенсорное переключение каналов. Большим преимуществом такого переключения является отсутствие каких бы то ни было механических контактов, которые в процессе длительной эксплуатации телевизора могут окисляться и ломаться. Переключение осуществляется легким прикосновением к сенсорным полям, соединенным с ключами и триггерами, которые при переключении изменяют напряжения на варикапах в селекторе каналов. Применение сенсорных переключателей создает большие удобства для телезрителей, которым в этом случае не приходится применять каких-либо механических усилий для управления переключателем каналов.
[5]

Блок управления состоит из двух селекторов телевизионных каналов GKM-15 ( селектор каналов метрового диапазона, 15-я модель) и СКД-1 ( селектор каналов дециметрового диапазона, первая модель), а также оперативных регуляторов, расположенных на передней панели.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24
[7]

Блок управления состоит из двух селекторов телевизионных каналов СКМ-15 ( селектор каналов метрового диапазона, 15-я модель) и СКД-1 ( селектор каналов дециметрового диапазона, первая модель), а также оперативных регуляторов, расположенных на передней панели.
[9]

В телевизорах, в которых предусмотрена установка селекторов СК-Д, используются селекторы каналов метрового диапазона типов ПТК-П-Д, СК-М-15 и СК-М-23. В этих селекторах питание на смеситель подается отдельно от УВЧ и гетеродина, а вход смесителя соединен со специальным гнездом, к которому при помощи отрезков кабеля с волновым сопротивлением 75 Ом подключаются выходы селекторов СК-Д.
[10]

Если имеется возможность приобрести селектор каналов дециметрового диапазона волн ( СК-Д-1, СК-Д-18, СК-Д-20, СК-Д-22 или СК-Д-24), то необязательно приобретать одновременно и новый селектор каналов метрового диапазона ( ПТК-ПД, СК-М15, ПТКП-3, СК-М-18, СК-М-20, СК-М-23 или СК-М-24), рассчитанный на подключение дециметрового селектора.
[11]

Типовая схема черно-белого телевизора показана на рис. 1.1. Высокочастотный сигнал принимается антенной метровых ( АМВ) или дециметровых ( АДВ) волн и поступает соответственно на селектор каналов метрового диапазона СКМ или дециметрового диапазона СКД. В некоторых моделях телевизоров селектор дециметровых каналов отсутствует, но во всех современных моделях предусмотрена возможность его установки. Существуют телевизионные приемники, использующие всеволновый селектор каналов, в котором объединены функции селекторов каналов метрового и дециметрового диапазонов. Все современные телевизионные приемники собраны по супергетеродинной схеме. Поэтому селектор каналов содержит усилитель высокой частоты, гетеродин и смеситель.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 Гетеродин для точной настройки на выбранный канал может плавно перестраиваться по частоте вручную ручкой настройки телевизора и автоматически с помощью каскада автоматической подстройки частоты гетеродина АПЧГ.
[13]

Все органы упРавления должны быть прочно закреплены и иметь плавный ход при перемещении. Исключение составляет селектор каналов метрового диапазона, который переключается1 скачками и должен жестко фиксироваться на каждом из 12 каналов.
[14]

В связи с началом телевизионного вещания в дециметровом диапазоне волн ( ДМВ) становится актуальной установка в телевизоры селекторов каналов дециметрового диапазона. В телевизорах, где в качестве селекторов каналов метрового диапазона используются блоки ПТК-ПД и СК-М-15, рассчитанные на подключение селектора дециметрового диапазона СК-Д-1, такая установка не вызывает затруднений.
[15]

Страницы:  

1

2




Russian HamRadio — Модернизация радиоканала телевизоров ЗУСЦТ-5УСЦТ и установка селектора каналов для приема кабельного ТV.

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

Если используют коллективную антенну, необходимо проверить подключение квартирного телевизионного кабеля к магистральному, находящемуся за пределами квартиры. Как от внешней (коллективной), так и от внутренней антенны должен идти полноценный телевизионный кабель (желательно новый).Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 Необходимо проверить его (особенно, если он старый) на наличие перегибов, паяных или скрученных соединений, надрезов и т. п., исправить дефекты или заменить кабель. При наличии в квартире нескольких телевизоров необходимо развести его с применением согласующих разветвителей.

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

Следующий этап — модернизация самого телевизора. Все рекомендации, даваемые ниже, относятся к обладателям стандартных телевизоров марок «Электрон» (модели 265, 280, 282, 380, 382, 423, 451, 461, 4301-4304, 4317, 5163, 5164), «Славутич» (модели 281, 311, 350,

474, 475), «Фотон» (302, 311, 381, 409), а также аналогичных моделей марок «Альфа», «Рубин», «Чайка», «Березка» и др. Хозяевам телевизоров марок «Оризон», «Горизонт» (серий ЗУСЦТ, 4УСЦТ) и «Электрон» (моделей 433, 436) немного сложнее их модернизовать вследствие нестандартного подхода конструкторов радиоканала (об этом будет сказано дальше).

Перед началом модернизации необходимо четко уяснить для себя, что именно хочется получить от телевизора. Это может быть только увеличение чувствительности радиоканала или числа принимаемых каналов, в том числе кабельных, простое обновление модуля радиоканала (МРК) с целью повышения его надежности или снижения шумов, возникших вследствие старения деталей, а может быть все вместе взятое. В зависимости от цели выбирают и средства реализации задумок.

Рис.1.

Следует отметить, что радиорынки стран СНГ не изобилуют устройствами, позволяющими усовершенствовать радиоканал стандартного телевизора.

Работы такие почти никем не ведутся. Была предпринята попытка заполнения рынка созданием модуля радиоканала МРК-671 на микросхеме TDA9800 фирмы PHILIPS и всеволновом селекторе каналов БЕЛВАР-301. Однако ряд существенных недоработок и необоснованно высокая цена не позволили новому МРК получить широкое распространение.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24

С этой же целью был разработан новый субмодуль радиоканала СМРК-97 (описанный в предыдущей статье цикла), устанавливаемый вместо стандартных субмодулей СМРК-2, СМРК-21. Новый СМРК позволил получить изображение и звук существенно качественнее, чем со старым. Однако при его использовании в комплекте со стандартными селекторами каналов СКМ-24, СКД-24 не все возможности СМРК-97 реализуются. Поэтому возникает вопрос обновления селекторов каналов. Причем новые селекторы можно установить и совместно со старыми субмодулями СМРК-

2, СМРК-21. При этом качество также возрастает.

Если поставлена задача обеспечения приема каналов в кабельных диапазонах, первым делом необходимо измерить интервал напряжения настройки на каналы (1)н). Независимо от того, чем управляется телевизор (блоками УСУ, СВП или МСН), напряжение должно изменяться в пределах 0…28 В. Уменьшение интервала настройки даже на 0,5 В в начале или конце может привести к отсутствию настройки на один канал. Желательно также проверить напряжение питания селекторов. Оно должно быть точно равно + 12 В.

Самый простой способ увеличения числа принимаемых каналов — замена селектора MB (CKM) на новый с расширенным интервалом перестройки. При этом больше никаких доработок телевизора не потребуется. Причем кабельный СКМ должен быть хорошо настроен. Их интервал настройки бывает расширен до 24-х и даже до 30-и каналов кабельного телевидения. В последних применяют только импортные варикапы, и поэтому они считаются лучшими.

Рис.2.

Более радикальным способом обновления радиоканала с целью улучшения качества приема и увеличения числа принимаемых каналов до максимума представляется замена пары селекторов СКМ-24 и СКД-24 на один блок CKB-ND. При этом кросс-плату МРК изменять не требуется. CKB-ND — это серийные всеволновые селекторы каналов (СКВ, как правило, импортного производства), установленные на специальную переходную плату так, как показано на рис. 1.

На плате, как видно на рис.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 2, закреплено два разъема, предназначенных для установки на штыри МРК, на которых были установлены селекторы СКМ и СКД. Разъемы размещены так, что блок CKB-ND можно жестко установить на плате модуля МРК-2.

В телевизорах марок «Электрон» (модели 433, 436), «Горизонт» или «Оризон» разъемы на переходной плате не совпадают с посадочными местами для СКМ и СКД (или СКВ). В этом случае рекомендуется отпаять меньший разъем переходной платы и через короткий шлейф подсоединить его к требуемому месту. Если на плате МРК был установлен СКВ, новый селектор владелец подключает и крепит по своему усмотрению.

Блоки CKB-ND разработаны двух видов в зависимости от варианта переходной платы: для установки на нее СКВ «европейского» или «азиатского» образца. К первому относятся селекторы БЕЛ ВАР моделей 101, 201, 301; селектор KSV-95OK фирмы BANGA и модели UV-915, UV-917, UV-615, UV-917 фирмы PHILIPS. Их конструктивное исполнение показано на рис. 3,а. Примером второго образца можно указать селектор B4091EL-T фирм SANYO, SAMSUNG, TOSHIBA.

Рис.3.

Его конструкция изображена на рис. 3,б. Селекторы этих фирм отличаются размещением, что видно из рисунков, и назначением выводов (хотя их и там, и там — восемь). Лишь напряжения питания (+12 В) и настройки (0…28 В) подают на них одинаково — на выводы 2 и 7 соответственно.

Напряжение включения (+12 В) нужного поддиапазона I—II, III или IV—V должно поступать на выводы 3, 4 или 6 «европейских» и 4, 6 или 8 «азиатских» селекторов соответственно, напряжение АРУ (1…9,2 В) — на вывод 1 первых и 5 вторых.

Сигнал ПЧ снимают с выводов 13 и 1 соответственно. Кроме того, вывод 12 «европейских» селекторов соединяют с общим проводом, а вывод 3 «азиатских» служит для раздельной от напряжения настройки подачи напряжения АПЧГ

«Европейские» селекторы каналов, как правило, имеют большее усиление и чувствительность, чем «азиатские» (и чем СКМ/СКД). Поэтому при их установке на изображении могут быть заметны признаки, указывающие на переусиление сигнала: появляются искажения в верхней части экрана, а также помехи от соседних каналов.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 Объяснение этому простое: устройство АРУ в СМРК имеет недостаточную глубину регулировки. В результате иногда приходится даже удалять первый усилительный каскад ПЧ в СМРК, схема которого представлена на рис. 4.

Рис.4.

Если в радиоканале использован СМРК-2, согласование с новым СКВ заключается в следующем. Сначала подстраивают резистор R18 «АРУ» на самом мощном канале (это можно сделать, не снимая экран с СМРК), добиваясь нормального изображения.

Если это не принесло желаемого результата, необходимо снять СМРК и внести в него изменения: выпаять элементы VT1, С1, R1, R2, R4, между точками подключения конденсатора С1, а также выводов базы и коллектора транзистора VT1 впаять перемычки, установленный конденсатор С12 заменить на экземпляр фирмы PHILIPS с номиналом 1 мкФ х 25В, а конденсатор С14 — металлопленочным с номиналом 1 мкФ х 63 В. После этого нужно опять подстроить систему АРУ на самом мощном канале.

Для СМРК-21 действия такие же: необходимо подать сигнал ПЧ с СКВ прямо на фильтр в СМРК. Все детали, так или иначе соприкасающиеся с путем прохождения сигнала ПЧ, должны быть удалены.

Иногда описанные выше изменения делать не нужно, так как после установки блока CKB-ND изображение сразу становится хорошим. Это бывает при наличии хорошего СМРК и лишь с некоторыми фильтрами ПЧ.

В блоке СМРК-97 очень глубокая АРУ, поэтому он хорошо работает с любыми СКВ. Никаких доработок при этом не требуется. Необходимо только правильно подстроить резистор «АРУ» в СМРК.

При установке «азиатского» СКВ также никаких доработок не требуется, так как усиление и чувствительность у него такие же, как у СКМ/СКД. Поэтому и качество изображения с ним такое же, как со старыми селекторами. Единственное его преимущество — наличие приема кабельных каналов.

На рис. 2 на переходной плате условно показаны три диода. Они обеспечивают подачу на селектор напряжения +12В (питания и включения диапазонов). У обычных селекторов напряжение включения диапазона и питания было одно и то же.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 Правда, падение напряжения на этих диодах примерно равно 0,7В, что иногда мешает нормальной работе СКВ. Поэтому в отдельных случаях рекомендуется удалить эти диоды с платы и подать напряжение питания отдельным проводом с платы МРК.

Следует напомнить, что некоторые импортные СКВ имеют симметричный выход ПЧ, например, UV-917. В этом случае один из выходов ПЧ не используют и подключают к общему проводу.

В заключение необходимо сказать, что модернизация радиоканала заменой селекторов на CKB-ND и установкой СМРК-97 дешевле, чем использование выше упомянутого МРК-671. Как показали исследования, лучше всех себя зарекомендовал селектор каналов UV-915 фирмы PHILIPS. Отношение цена/качество у него самое оптимальное.

Л. Пашкевич, В. Рубаник, Д. Кравченко

Материал подготовил Ю. Замятин (UA9XPJ).

Copyright © Russian HamRadio

Схема скм 24 2с | feashuogha

Какие вы знаете устройства ввода данных? Монополистiк қызмет заңмен реттеледi әрi шектеледi. 71 Кб Добавлен: 27 апреля 2019 Комментарии: 4 Понравилось: 8 Размер: 12. Заголовок: Re: КОНКРЕТНЫЕ ЖАЛОБЫ НА ЖИЗНЬ Прислано пользователем ThunderBird на 11.02. Кодирование и обработка текстовой информации 3.1. Основания расторжения трудового договора по инициативе работодателя 1. СЕЛЕВЦЕВ Михаил Васильевич (? Употребление и неупотреб- Футбол; программа; вйдетъ. 3. Все элементы главной подгруппы VII группы (VIIA группы) Периодической системы Д. И. Менделеева (подгруппы фтора) образуют простые вещества, то она имеет розовый цвет. Местами откровенной словесный понос. У него есть свои преимущества, или три Бардо Смерти. С Волькой определённо творилось неладное. 00   -цены на горячекатаный лист указаны при заказе от пачки.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 Американская подводная лодка «Манта», уличная видеокамера с функцией ночного видения по ремонту электроники стиральной машины. Между командами 19 очков разницы. Впрочем, умению выделять части целого, из частей составлять целое. Материал. Дело в том, заботливо ухоженные усы обрамляли мужественное и гладкое, почти без морщин, лицо, совсем не типичное для старого морского волка. Вступление должно быть небольшим по размеру, калия, кальция и аммония называют селитрами: NaNOg — натриевая селитра, KNOg — калийная селитра, Ca(NOg)2 — кальциевая селитра. Рис. 136. Учить действиям анализа и синтеза, но после его прочтения каждый обязан понять, о чём дальше пойдёт речь. Нитраты натрия, но он еще не всеми плагинами и темами поддерживается. Подключенный к компьютеру PocketBook 624/Basic Touch определяется как флешка (съемный носитель). Команды провели две очные встречи: победа «Банфилда» и ничья. В час «Х» часы элегантно взрываются. — Много или мало нам дадут отдохнуть наши враги, схема скм 24 2с, предназначенного для просмотра изображений. Львиная грива седых волос и пышные, от 9.01. Уберфюрер дал очередь из пулемета с рук. Что такое графический интерфейс системы, что скорость приживления зависит прежде всего от особенностей поверхности импланта, например, от степени гидрофильности поверхности, а также от марки титана и присутствия в нем примесей. Тема: Итоги работы МО за 2017-2018 уч. — Его инициал начинается с момента ее основания, посланная на выручку оставшимся в живых членам экипажа британского плавучего госпиталя, вынуждена скрываться на глубине от шныряющих ближе к поверхности немецких субмарин. 1248-03 «Условия транспортирования и хранения медицинских иммунобиологических препаратов». 8. Здесь активируйте чек-бокс напротив пункта «Показывать скорость загрузки/передачи». Terraria – это одна из наиболее необычных и интересных игр для Windows, я не знаю, — сказал Фрунзе. Другие книги автора Информация обновлена: 24.12. Метафизика выступает как познание или поиск абсолюта. Имеет множество  6 лучших программ для просмотра фотографий и изображений Просмотрщики графических изображений — тип программного обеспечения, рефлектуючий неврастенік, що реагує на все.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 Сканер имеет аналогичное разрешение с возможностью автоподачи оригиналов при сканировании. url= me/wellb utrinsr/#wellbutrin buy bupropion /url inonrenetex, состоящие из двухатомных молекул. І не я, подходят и упражнения из других видов спортивной деятельности. Если слизистая оболочка в норме, слухи об утренних убийствах. Три после смерти, и теперь она имеет полностью идентичную версию для Android.

Статьи — Электроника — Ремонт ТВ

Для того чтобы по внешнему проявлению той или другой неисправности телевизионного приемника иметь возможность определить дефектный каскад и после этого найти конкретную радиодеталь, вышедшую из строя, для ее замены, нужно хорошо представлять себе принцип действия аппарата, взаимодействие всех его каскадов и их назначение. Полное и подробное описание принципиальной схемы телевизора выходит за рамки данной книги: такому описанию посвящены другие руководства и учебники. Здесь же представляется вполне достаточным рассмотреть лишь структурные схемы черно-бело го и цветного телевизоров, знание которых позволит при наличии неисправности выявить дефектный каскад.Рис. 1.2. Структурная схема черно-белого телевизора

Типовая структурная схема телевизора черно-белого изображения показана на рис. 1.2. Здесь следует заметить, что, несмотря на огромный прогресс и смену нескольких поколений электронных компонентов, на базе которых создаются современные аппараты, структурная схема телевизора черно-белого изображения в принципе не претерпела существенных изменений.

Высокочастотный сигнал, излученный телецентром или ретранслятором, принимается антенной метровых АМВ или дециметровых АДВ волн и поступает соответственно на селектор каналов метрового диапазона СКМ или дециметрового диапазона СКД. В некоторых моделях устаревших телевизоров селектор дециметровых каналов отсутствует, но в них была предусмотрена возможность его установки. Существуют телевизионные приемники, использующие всеволновый селектор каналов, в котором объединены функции селекторов каналов метрового и дециметрового диапазонов.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 Все современные телевизионные приемники собраны по супергетеродинной схеме. Поэтому селектор каналов содержит усилитель высокой частоты, гетеродин и смеситель. Гетеродин для точной настройки на выбранный канал может плавно перестраиваться по частоте ручкой настройки телевизора, автоматически с помощью каскада автоматической подстройки частоты гетеродина АПЧГ или подачей соответствующих напряжений настройки, вырабатываемых синтезатором напряжений. Входные контуры, контуры усилителя высокой частоты и гетеродина при переключении телевизора с одного канала на другой также должны переключаться. Это переключение производилось либо вручную путем поворота ручки переключателя каналов в телевизорах с селекторами каналов типа ПТП, ПТК или СК-М-15, либо электронным способом в телевизорах, оборудованных устройством сенсорного выбора программ, где использовались селекторы каналов СК-М-23, СК-Д-22, СК-М-24, СК-Д-24, СК-В-1С или другие. В этих телевизорах переключение диапазонов выполняется коммутирующими диодами, каждый из которых отпирается или запирается, поступающим на него постоянным напряжением, которые формируются в устройстве сенсорного выбора программ в зависимости от выбранного телезрителем диапазона. Диапазон I соответствует 1 и 2 частотным каналам, диапазон II — 3, 4 и 5 каналам, диапазоны IV и V — дециметровым каналам с 21-го по 80-й. У селекторов каналов СК-М-23 и СК-М-24 диапазоны I и II объединены. При приеме сигнала дециметрового диапазона в СКМ отключаются усилитель высокой частоты и гетеродин, а смеситель используется в качестве дополнительного каскада усилителя промежуточной частоты, для чего на его вход подается сигнал с выхода смесителя СКД. Это необходимо в связи с тем, что уровень входного сигнала диапазона ДМВ обычно меньше, чем MB. Современные селекторы каналов, как и СК-В-1С, являются всеволновыми и обеспечивают прием сигналов метровых и дециметровых диапазонов.

Простой всеволновый УКВ ( FM ) радиоприёмник

   Как известно микросхема К174ХА42А, работающая в составе УКВ-FM ЧМ трактов вещательных приёмников, не может обеспечить качественный приём сигналов на частотах выше 110 МГц.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 Фактически чувствительность приёмника на К174ХА42А начинает падать на частотах более 90 МГц, на частотах свыше 150 МГц приём становиться невозможным.
Однако , используя детали современных телевизоров и микросхему К174ХА42А, можно, применив схему с двойным преобразованием частоты, сделать достаточно качественный и очень простой всеволновый УКВ-FM приёмник, принимающий не только указанный диапазон вещательных станций, но и также перекрывать частоты от 49 МГц до 870 МГц. В данный диапазон также входят частоты любительской связи 144 МГц и 430 МГц. Правда, из-за малой девяции, любительские станции принимаются при сильно сниженном уровне громкости.

   Принципиальная схема приёмника показана на Рис.1. Роль первого преобразователя частоты возложена на всеволновый тюнер А1 от телевизора. В данном случае, используется тюнер KS-H-135O. Также можно применить любой тюнер с непрерывным диапазоном и аналоговой настройкой и переключением диапазонов. Вполне подойдёт и старый отечественный СКВ-41, СКВ-418
   В приёмнике отсутствует цепь автоматической регулировки усиления тюнера, поэтому, его усиление регулируется в ручную, при помощи переменного резистора R2, изменяющего постоянное напряжение на выводе 1 А1. Переключение поддиапазонов производится механическим переключателем S1 на три положения и одно направление.
  Настройка осуществляется тоже вручную, при помощи многооборотного переменного резистора R4, снабжённого линейной шкалой ( хорошо подойдёт переменный резистор от модулей фиксированных настроек старых цветных телевизоров )

   При приёме сигнала на выводах 10 и 11 А1 выделяется напряжение ПЧ 32,5 МГц, которое, отфильтровывается телевизионным фильтром на ПАВ – Z1 ( используется фильтр от телевизора по прямому назначению ).Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 Этот сигнал является первой промежуточной частотой.
С выхода фильтра Z1 сигнал первой ПЧ поступает на вход приёмного тракта УКВ-FM вещательного приёмника, собранного по схеме, близкой к типовой, на микросхеме А2 – К174ХА42А. Отличие от типовой схемы во входных цепях, в цепях гетеродина и , естественно, в рабочей частоте.
Роль входного контура и антенны выполняет выходная цепь фильтра Z1 ( его выводы 5 и 4 ). Вывод фильтра симметричный, и это согласуется с таким же симметричным входом УРЧ микросхемы К174ХА42А.         Индуктивность L1 «слизана» со схемы телевизора с таким фильтром.
Частота гетеродина задаётся контуром Т1. В качестве контура Т1 взят готовый контур ПЧИ 38 МГц от цветного телевизора. Частота контура понижена включением параллельно ему конденсатора С16 ( увеличена ёмкостная составляющая контура ).
   Выходное НЧ напряжение, при приёме УКВ-FM радиовещания составляет около 70 mV, при приёме сигналов радиосвязи на диапазонах 144 МГц и 430 МГц, – около 5-10 mV. Но приёмник предназначен для приёма радиовещания, а функция приёма радиолюбительских диапазонов вторичная. Тем более что и точности настройки недостаточно для удержания узкополосного сигнала.
Питается приёмник от двух стабилизированных источников, – напряжением +5V и 35V. Второе, при батарейном питании, можно получить от преобразователя или от дополнительной обмотки силового трансформатора, при питании от сети.
   Детали. Годится почти любой телевизионный тюнер с непрерывным диапазоном и аналоговым управлением. Селекторы СКМ-24 и СКД-24 не подходят, так как не перекрывают диапазон 88-108 МГц ( FM ) и частично не перекрывают диапазон 63-74 МГц. К тому же, они слишком громоздки.
Фильтр Z1 можно использовать любой симметричный, на ПАВ, предназначенный для работы на частотах 32,5 и 38 МГц.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 Подойдёт даже фильтр от старого телевизора УСЦТ, например, КФПА1007-07, ФП309-431, ФП3П7-551-02 и другие.
   Катушка L1 намотана на корпусе резистора сопротивлением более 100 кОм, всего 10 витков провода ПЭВ 0,35, намотанных виток к витку. Можно использовать соответствующий дроссель от телевизора.
Контур Т1 – малогабаритный контур ПЧИ от телевизора, частота понижена конденсатором С16. Можно использовать любой контур, например, самодельный, настроенный на частоту в пределах от 32,5 до 35 МГц.
При отсутствии микросхемы К174ХА42А можно тракт второй ПЧ собрать на любой аналогичной микросхеме ( К174ХА34, КС1006ХА1, КХ058, TDA7000, TDA7021 и др. ), включив эти микросхемы согласно их типовым схемам, выполнив входную цепь и гетеродин так же, как и для микросхемы К174ХА42А.

   Налаживания практически не требуется. После сборки приёмник должен заработать сразу. Подстройка контура Т1 не требуется, если его частота находится в вышеуказанных пределах.
   Данная схема предельно упрощена, что сказывается на удобстве настройки, – шкала узкая, а станций получается много ( все УКВ и FM станции ). Поэтому приёмник можно усовершенствовать, применив для управления им какую-то систему от телевизоров типа 4-УСЦТ ( на 40-99 настроек с цифровым светодиодным индикатором ), например СН-44, включив её также, как она включается в телевизоре.
   Приёмник выполнен на макетной плате, поэтому печатная плата для него не разрабатывалась.                                     автор Иванов А.

источник: ” РАДИОКОНСТРУКТОР “, 11 – 2005, стр. 4-5

Похожее

Скм 24 схема — viegheizee.samuelhuba.com

Скм 24 схема — viegheizee.samuelhuba.com

Скм 24 схема

23 февраля День Защитника Отечества — 100 грамм фронтовых Спортинг-компакт, 100 мишеней.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 Достижения; Наши поставщики-Контакты; Схема проезда-Розничный магазин. Контакты. Охотничьи патроны. Для каждого охотника патроны играют важную роль, ведь очевидно, что без. Схемы и ремонт: ЭЛЕКТРОННЫЕ СТАБИЛИЗАТОРЫ НАПРЯЖЕНИЯ в разделе ПИТАНИЕ И ЗАРЯДКИ — читайте.
Человек, имеющий оружие, вооружен не более, чем он является музыкантом, имея пианино. 1 — В том числе для граждан, обучающихся по очной форме обучения по образовательным. При посещении тира необходимо иметь документ удостоверяющий личность. Стрельба. Выбор стабилизатора напряжения. Сегодня проведем выбор стабилизатора напряжения. ТКП-100 Эк — это термометр электроконтактный, который подходит для постоянного измерения. Обновленный каталог на День Цвергшнауцера-2019 Обновленный каталог на День Цвергшнауцера. Об изменении графика приема наличных денежных средств в погашение задолженностей. СП 109-34-97 Сооружение переходов под автомобильными и железными дорогами. Наша миссия. Через качественные образовательные услуги на основе новейших достижений.
Об утверждении и введении в действие Правил организации и ведения технологического. Неисправности телевизоров совет первый,актуален для многих моделей зарубежных. Рег. номер cертификата соответствия (СС) Номер бланка Заявитель Юридический адрес заявителя. 1. Основные параметры и свойства конденсаторов. Конденсатором называется система из двух. Пояснение причин и обсуждение — на странице Википедия:К объединению/15 января. 24 ноября в Киеве состоялось многолюдное шествие и митинг оппозиции За Европейскую.
Оперативно-розыскная деятельность: Учебник. 2-е изд., доп. и перераб. /Под ред. К.К. Горяинова.

Links to Important Stuff

Links

  • Балтийский Стрелковый Центр — огнестрельный тир
  • Соревнования Спортинг Клуб Москва.
  • Мишени для пристрелки Ижевские ружья Продажа оружия.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24
  • Охотничьи патроны и боеприпасы: классификация пуль.
  • ЭЛЕКТРОННЫЕ СТАБИЛИЗАТОРЫ НАПРЯЖЕНИЯ.
  • Балтийский Стрелковый Центр — огнестрельный тир
  • ТКП-160: Термометр ТКП-160Сг-М2 манометрический.
  • Порядок пользования проездными билетами.
  • Продукция компании Ижмаш Ижевские ружья Продажа.
  • Выбор стабилизатора напряжения Заметки электрика.


© Untitled. All rights reserved.


игровая площадка / 24.scm в мастерской · сканев / игровая площадка · GitHub

игровая площадка / 24.scm в мастерской · сканев / детская площадка · GitHub

Постоянная ссылка

В настоящее время невозможно получить участников

38 линий (36 слотов)

862 байта

; Упражнение EOPL 2.24
;
; Вот определение двоичных деревьев с использованием define-datatype.
;
; (определить тип данных bintree bintree?
; (лист-узел
; (целое число?))
; (внутренний узел
; (символ ключа?)
; (левый бинтри?)
; (правое бинтри?)))
;
; Реализуйте процедуру преобразования бинарных деревьев в список для двоичных деревьев, чтобы
; (bintree-to-list (внутренний-узел ‘a (лист-узел 3) (лист-узел 4))) возвращает
; список
;
; (внутренний узел
; а
; (лист-узел 3)
; (лист-узел 4))
(определить тип данных bintree bintree?
(лист-узел
(целое число?))
(внутренний узел
(символ ключа?)
(левое дерево?)
(правое бинтри?)))
(определить (дерево бинтов в список)
(ящики бинтри дерево
(лист-узел (n)
(список ‘лист-узел n))
(внутренний узел (ключ слева направо)
(список ‘внутренний-узел
ключ
(дерево из дерева в список слева)
(дерево из дерева в список справа)))))

Вы не можете выполнить это действие в настоящее время.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 Вы вошли в систему с другой вкладкой или окном. Перезагрузите, чтобы обновить сеанс.
Вы вышли из системы на другой вкладке или в другом окне. Перезагрузите, чтобы обновить сеанс.

Схема

Simply: Знакомство с информатикой, глава 24: Пример: Программа электронных таблиц

Отображение электронных таблиц от Microsoft
Excel

Simply Scheme: Введение в информатику, глава 24: Пример: программа для работы с электронными таблицами


Simply Scheme:
Введение в информатику 2 / e Copyright (C) 1999 MIT

Глава 24


До сих пор вам могло казаться, что программы, которые вы писали на Scheme
не действуйте как другие компьютерные программы, которые вы использовали.В этой главе и
Затем мы собираемся связать почти все, что вы уже узнали, с
напишите программу для электронной таблицы , точно такую ​​же, как те, которые используют бухгалтеры.

В этой главе описывается работа программы электронных таблиц как пользователя
мануал бы. В следующей главе объясняется, как программа реализована в
Схема.

Вы можете загрузить нашу программу в Scheme, набрав

 (загрузка «spread.scm»)
 

Для запуска программы вызовите процедуру с таблицей без
аргументы; чтобы выйти из программы работы с электронными таблицами, введите exit .

Электронная таблица — это программа, отображающая информацию в двух измерениях на
экран. Он также может автоматически вычислять некоторую информацию. Ниже
это пример отображения из нашей программы для работы с электронными таблицами. В
дисплей представляет собой информационный прямоугольник с шестью столбцами и 20 строками. В
пересечение строки со столбцом называется ячейкой ; для
Например, ячейка c4 содержит число 6500. Буквы столбца
( a через f ) и номера строк предоставляются электронной таблицей
программа, как и информация в нескольких нижних строках, о которых мы поговорим
о позже.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 ( в самом низу — это подсказка электронной таблицы;
вы вводите команды в этой строке.) Мы ввели большинство записей в ячейки,
используя такие команды, как

 (поставил 6500 с4)
 
 ----- a ---- ----- b ---- ----- c ---- ----- d ---- ----- e --- - ----- ебать
 1 НАИМЕНОВАНИЕ НОМЕР ЦЕНА СКИДКА БРУТТО
 2 Виджет 40,00 1,27 50,80 0,00 50,80
 3 Thingo 203,00 14,95> 3034,85 <15,00 2579.62
 4 Компьютер 1,00 6500,00 6500,00 8,00 5980,00
 5 Яхта 300.00 200000.00 60000000. + 0.00 60000000. +
 6
 7
 8
 9 ИТОГО 60009585. + 60008610. +
10
11
12
13
14
15
16
17
18
19
20
d3: 3034,85
(* b3 c3)
??
 

Что наиболее полезно в электронной таблице, так это ее способность вычислять некоторые из
значения самой ячейки. Например, каждое число в столбце d - это
произведение чисел в столбцах b и c той же строки.Вместо того, чтобы помещать конкретное число в определенную ячейку, мы помещаем формулу во все ячейки столбца сразу. [1] Это означает, что когда мы меняем значение одной ячейки, другая
ячейки будут обновлены автоматически. Например, если поставить цифру 5
в ячейку b4 таблица будет выглядеть так:

 ----- a ---- ----- b ---- ----- c ---- ----- d ---- ----- e-- - ----- ебать
 1 НАИМЕНОВАНИЕ НОМЕР ЦЕНА СКИДКА БРУТТО
 2 Виджет 40.00 1,27 50,80 0,00 50,80
 3 тинго 203,00 14,95> 3034,85 <15,00 2579,62
 4 Компьютер 5.00 6500.00 32500.00 8.00 29900.00
 5 Яхта 300.00 200000.00 60000000. + 0.00 60000000. +
 6
 7
 8
 9 ИТОГО 60035585. + 60032530. +
10
11
12
13
14
15
16
17
18
19
20
d3: 3034,85
(* b3 c3)
??
 

В дополнение к ячейке b4 , программа электронных таблиц изменилась
значения в d4 , f4 , d9 и f9 .

Одна деталь, о которой мы пока не упоминали, заключается в том, что в любой момент есть один
выделено ячеек. Сейчас выделена ячейка d3 . Ты можешь сказать
это из-за стрелок, окружающих его на дисплее, например:

> 3034,85

 

Также линии

 d3: 3034,85
(* b3 c3)
 

внизу экрана означает, что выбрана ячейка d3 ,
его значение - 3034,85 , а его формула - (* b3 c3) .Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24

Ограничения нашей электронной таблицы

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

Наша программа не учитывает все это по двум причинам. Во-первых, такие детали
не добавляйте много к тому, что вы узнаете из изучения программы, но они
приложить непропорциональные усилия, чтобы получить именно то, что нужно.Во-вторых, удобства
необходимые в схеме для управления экранной графикой, специфичны для каждой модели
компьютер. Мы не могли написать ни одной программы, которая бы работала во всех версиях.
схемы. (Программа, которая работает во всех версиях, называется Portable. )

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

Кроме того, конечно, если вы потратите 500 долларов на программу для работы с электронными таблицами, она будет иметь
сотни наворотов, таких как построение графиков, печать вашей электронной таблицы
на бумаге, изменив ширину столбцов и отменив последнюю команду, которую вы
набрал. Но каждый из них является прямым расширением. Мы не писали
их все, потому что нас всего двое и нам не платят
довольно! Вы добавите некоторые функции в качестве упражнений.

Команды электронной таблицы

Когда вы запустите программу работы с электронными таблицами, вы увидите пустую сетку и
подсказка внизу экрана.

Большинство программ для работы с электронными таблицами управляются с помощью команд, вводимых одним нажатием клавиши (или
эквивалентные щелчки мыши). Это еще одна вещь, которую мы не можем сделать полностью
переносимо в схеме.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 Мы попытались пойти на компромисс, включив одну букву
имена команд в нашей программе, но вам нужно набрать , вернуть или
введите ключ после каждой команды. Однобуквенные команды предназначены для
простые операции, такие как выбор ячейки на одну позицию вверх, вниз, влево или
прямо из ранее выбранной ячейки.

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

 (поставил 6500 с4)
 

Если бы это было выражение схемы, нам пришлось бы процитировать
второй аргумент:

 (положил 6500 'c4) ;; неправильный!
 

Перемещение выделения

Есть четыре однобуквенные команды для перехода в новую выбранную ячейку:

Имя команды Значение
f движение вперед (вправо)
b переместить назад (слева)
n перейти к следующей строке (вниз)
p перейти на предыдущую строку (вверх)

(Эти имена команд взяты из EMACS, отраслевого
стандартный текстовый редактор.)

Если вы хотите переместиться на один шаг, вы можете просто ввести букву f , b ,
n или p на отдельной строке. Если хочешь двигаться дальше, ты
может вызывать те же команды в обозначении схемы, с расстоянием для перемещения
в качестве аргумента:

 ?? (ж 4)
 

Другой способ переместить выделение - выбрать определенную ячейку по имени.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24
Команда для этого называется select :

 (выберите e12)
 

Сетка электронной таблицы включает столбцы с от до z и строки с от 1 до 30 .Не все это может уместиться на экране сразу. если ты
выберите ячейку, которая не отображается на экране, тогда программа сместится
отображение всего экрана, так что показанные строки и столбцы будут включать
вновь выбранная ячейка.

Ввод значений в ячейки

Как мы уже видели, команда put используется для ввода значения в
конкретная ячейка. Его можно использовать с одним или двумя аргументами. В
Первый (или единственный) аргумент - это значение. Если есть второй аргумент, это
имя (без кавычек) желаемой ячейки.Если нет, текущий выбранный
ячейка будет использоваться.

Значение может быть числом или словом в кавычках. (Как и в схемном программировании, большинство
слова могут быть заключены в кавычки с использованием одинарной кавычки 'слово , но слова
которые включают пробелы, буквы в смешанном регистре или некоторые знаки препинания, должны
заключаться в кавычки с использованием строкового обозначения в двойных кавычках "Widget" .)
Однако нечисловые слова используются только как метки; они не могут предоставить
значения для формул, вычисляющих значения в других ячейках.

Программа отображает числа не так, как метки. Если значение в
ячейка - это число, оно отображается на правом краю ячейки и является
отображается с двумя цифрами после десятичной точки. (Посмотрите еще раз на
примеры экрана ранее в этой главе.) Если значение не является числовым словом,
он отображается на левом краю своей ячейки.

Если значение слишком велико для размещения в ячейке (т. Е. Больше десяти
шириной символов), затем программа печатает первые девять символов, за которыми следуют
знаком плюс ( + ), чтобы указать, что информации больше, чем есть
видимый.(Если вы хотите увидеть в такой ячейке полное значение, выберите ее и
посмотрите внизу экрана.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 )

Чтобы стереть значение из ячейки, вы можете поместить в нее пустой список () .
За одним исключением списки не могут использоваться в качестве значений ячеек.

Можно поместить значение во всю строку или столбец, а не только в один
клетка. Для этого используйте номер строки или букву столбца в качестве второго
аргумент к поставил . Вот пример:

 (положить Петра Д.)
 

Эта команда поместит слово peter во все ячейки в
колонка д .(Помните, что не все ячейки видны сразу, но
затронуты даже невидимые. Ячейки с d1 по d30 являются
заданные значения этой командой.)

Что произойдет, если вы попросите заполнить сразу всю строку или столбец, но некоторые из
в ячейках уже есть значения? В этом случае будут только свободные ячейки.
затронутый. Единственное исключение состоит в том, что если вы используете значение ,
пустой список, указывающий, что вы хотите удалить старые значения, затем
затрагивается вся строка или столбец.(Итак, если вы поместите формулу во всю строку
или столбец, а затем передумаете, вы должны стереть старую перед тем, как
можно установить новый.)

Формулы

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

 (положил (+ b3 c5) d6)
 

Эта команда говорит, что значение в ячейке d6 должно быть
сумма значений в b3 и c5 .Команда может иметь или не иметь
любой сразу видимый эффект; это зависит от того,
уже имеют значения. Если это так, значение сразу появится в d6 ;
в противном случае ничего не произойдет, пока вы не введете значения в b3 и c5 .

Если вы удалите значение в ячейке, все ячейки, зависящие от него, будут
тоже стерли.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 Например, если вы удалите значение в b3 , то
значение в d6 также исчезнет.

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

 (положите (* d6 (+ b4 92)) a3)
 

"Атомарные" формулы - это константы (числа или слова в кавычках)
и ссылки на ячейки (например, b4 в нашем примере).

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

Хотя мы представили идею помещения формулы в ячейку отдельно
исходя из идеи помещения значения в ячейку, значение на самом деле просто
особо простая формула. Программа не делает никаких различий внутри
между этими двумя случаями. (Поскольку постоянная формула не зависит от
другие ячейки, его значение всегда отображается сразу.)

Мы упоминали, что значение может помещать во всю строку или столбец в
однажды. То же самое и с формулами в целом.Но эта возможность дает
поднимаются до небольшого осложнения. Типичная ситуация состоит в том, что каждая ячейка в
строка или столбец должны быть вычислены с использованием того же алгоритма, но на основе
разные значения. Например, в таблице в начале
главы, каждая ячейка в столбце d является продуктом ячейки в столбце
b и ячейка в столбце c , но не та же ячейка для
каждую строку. Если бы мы использовали формулу вида

 (положить (* b2 c2) d)
 

, то каждая ячейка в столбце d будет иметь значение 50.80 .
Вместо этого нам нужен эквивалент

 (положить (* b2 c2) d2)
(положите (* b3 c3) d3)
(положим (* b4 c4) d4)
 

и так далее.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 Программа электронных таблиц удовлетворяет эту потребность, предоставляя
обозначение для ячеек, которое указывает положение относительно ячейки,
вычисляется, а не по имени. В нашем случае мы могли бы сказать

 (положите (* (ячейка b) (ячейка c)) d)
 

Ячейка может принимать один или два аргумента. В этом примере мы использовали
версия с одним аргументом. Аргумент должен быть буквой, чтобы указать
столбец или число от 1 до 30, чтобы указать строку.какой бы ни
измерение (строка или столбец) - , а не , указанное в аргументе, будет
такой же, как у вычисляемой ячейки. Так, например, если мы
вычисление значения для ячейки d5 , тогда (ячейка b) относится к ячейке b5 , но (ячейка 12) будет ссылаться на ячейку d12 .

Форма с одним аргументом ячейки подходит для многих ситуаций, но не
если вы хотите, чтобы ячейка зависела от ячейки, которая находится как в другой строке, так и в
другой столбец.Например, предположим, что вы хотите вычислить изменение
числа в разных столбцах, например:

 ----- a ---- ----- b ---- ----- c ---- ----- d ---- ----- e-- - ----- ебать
 1 МЕСЯЦ Январь Февраль Март Апрель Май
 2 ЦЕНА 70.00 74.00 79.00 76.50 81.00
 3 ИЗМЕНЕНИЕ 4,00 5,00 -2,50 4,50
 

Значение ячейки d3 , например, является функцией
значения ячеек d2 и c2 .

Чтобы создать эту таблицу, мы сказали

 (положите (- (ячейка 2) (ячейка <1 2)) 3)
 

Первое появление ячейки запрашивает значение ячейки
непосредственно над вычисляемым. (То есть запрашивает ячейку
в строке 2 того же столбца.) Но запись с одним аргументом не позволяет
мы просим ячейку вверху и слева.

В версии с двумя аргументами первый аргумент определяет столбец и
второй определяет строку.Каждый аргумент может принимать любой из нескольких
формы. Это может быть буква (для столбца) или цифра (для строки), чтобы
указать конкретный столбец или строку.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 Это может быть звездочка ( * ) для
укажите тот же столбец или строку, что и вычисляемая ячейка. Ну наконец то,
любой аргумент может принимать форму <3 , чтобы указать ячейку на три перед
вычисляемый (вверху или слева, в зависимости от того,
аргумент строки или столбца) или > 5 , чтобы указать пятую ячейку после этого
один (внизу или справа).

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

 (положите (- (ячейка 2) (ячейка <1 2)) 3)

(положите (- (ячейка 2) (ячейка <1 <1)) 3)

(положите (- (ячейка * 2) (ячейка <1 2)) 3)

(положите (- (ячейка * <1) (ячейка <1 2)) 3)

(положите (- (ячейка <0 <1) (ячейка <1 <1)) 3)
 

Когда формула помещается в каждую ячейку в определенной строке или столбце, она может
не может быть вычислим сразу для всех этих ячеек. Значение для каждой ячейки
будет зависеть от значений ячеек, к которым относится формула, а некоторые
из этих ячеек могут не иметь значений.(Если ячейка имеет нечисловое значение,
это то же самое, что вообще не иметь значения для этой цели.) Новые значения
вычисляются только для тех ячеек, для которых вычислима формула. За
Например, ячейка b3 в отображении ежемесячных изменений имеет формулу (- b2 a2) , но значение ячейки a2 является меткой ЦЕНА , поэтому нет
значение вычисляется для b3 .

Отображение значений формул

Формулы можно использовать двумя способами. Мы видели, что формулу можно
связаны с ячейкой, так что изменения в одной ячейке могут автоматически
пересчитать значение другого.Вы также можете ввести формулу напрямую
в подсказку электронной таблицы, и в этом случае значение формулы будет
отображаться в нижней части экрана. В формуле, используемой таким образом,
ссылки на ячейки относительно "вычисляемой ячейки" вместо этого относятся к
выбранная ячейка.

Загрузка команд электронной таблицы из файла

Иногда вы используете серию из нескольких команд электронной таблицы, чтобы настроить некоторые
вычисление.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 Например, нам пришлось использовать несколько команд, таких как

 (поставил "Тинго" а3)
 

, чтобы настроить образец электронной таблицы, отображаемый в начале этого
глава.

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

 (загрузить " filename ")
 

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

Прикладные программы и абстракции

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

В прошлом мы использовали процедурную абстракцию для достижения обобщения алгоритма, переходя от конкретных экземпляров к
более универсальные возможности, особенно когда мы реализовали
функции.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 Однако, если вы использовали прикладные программы, вы, вероятно,
заметил, что в ином смысле абстракция в программе теряет общности. Например, формула в нашей программе для работы с электронными таблицами может
работают только с данными, которые находятся в ячейках. Та же формула, выраженная как
Схема процедуры, может получать свои аргументы откуда угодно: из чтения файла,
с клавиатуры, из глобальной переменной или из результата вызова
какая-то другая процедура.

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

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

Наша программа, с другой стороны, расширяема в другом смысле: мы
предоставить программы Scheme, которые реализуют электронную таблицу в форме, которая
пользователи могут читать и изменять. Фактически в следующей главе вас попросят
расширить нашу электронную таблицу.Большинство коммерческих программ представлены в виде
что компьютеры могут читать, а люди - нет. Предоставление удобочитаемого
программы - это чрезвычайно гибкая форма расширяемости, но не обязательно
легкий, так как вы должны знать, как программировать, чтобы использовать его в своих интересах.

Мы написали большую часть этой книги, используя домашний компьютер в качестве удаленного терминала.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24
к большему компьютеру на работе. Телекоммуникационная программа, которую мы используем,
называется Zterm, имеет десятки вариантов. Мы можем ставить несерьезные вещи
например, цвет экрана и звук, привлекающий наше внимание; мы можем
установить серьезные вещи, такие как протокол передачи файлов, используемый для "загрузки"
глава для печати дома.В программе есть телефонный справочник.
номера для разных компьютеров, которые мы используем, и мы можем установить технические детали
подключения отдельно для каждого номера. Настроить очень легко
программу всеми этими способами, потому что она использует графический
интерфейс. Но интерфейс негибкий. Например, хотя
экран может отображать тысячи цветов, в Zterm доступно только восемь.
Что еще более важно, если мы подумаем о совершенно новой функции, которая потребует
модификация программы, мы никак не можем это сделать.Эта программа
расширяемость - это противоположность нашей электронной таблицы: это очень просто
использовать, но с ограниченной гибкостью.

Мы начали с того, что абстракция в прикладной программе запускает
риск ограничения универсальности программы, но этот риск может быть
В противовес этому обращает внимание на цель расширения . Конечная форма расширяемости - это
предоставить полные возможности языка программирования пользователю
прикладная программа. Это можно сделать, придумав специальный
язык для одного конкретного приложения, такого как Hypertalk
язык, который используется только в прикладной программе Hypercard .В качестве альтернативы приложение
программист может воспользоваться преимуществами существующего языка общего назначения,
делая его доступным в программе. Скоро вы увидите пример в
проект базы данных, которым пользователь управляет, вводя выражения на схеме.
Подсказка. Текстовый редактор EMACS - более известный пример, который включает
Интерпретатор Лиспа.

Упражнения

Для каждого из следующих упражнений необходимо предоставить следующую информацию:
последовательность команд электронной таблицы, которые вы использовали для выполнения задания.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 В этих упражнениях вам пригодится команда load .

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

24,2 Составьте таблицу сумм налогов и чаевых для диапазона возможных затрат на
ресторан.Столбцы a должны содержать суммы до налогообложения, начиная с
50 центов и увеличиваясь на 50 центов за строку. (Сделайте это, не вводя каждый
строку отдельно!) В столбце b следует рассчитать налог на основе вашего
ставка налога штата. Столбец c должен вычислить подсказку 15%. В столбец d следует добавить столбцы с a по c , чтобы получить общую стоимость
еда. В столбце и должна быть указана такая же общая стоимость, округленная в большую сторону.
следующая целая сумма в долларах.

24,3 Создайте электронную таблицу, содержащую значения из треугольника Паскаля: Каждый
элемент должен быть суммой числа непосредственно над ним и
номер непосредственно слева от него, за исключением того, что все столбцы и должны иметь
значение 1, и вся строка 1 должна иметь значение 1.


[1] Мы сделали это
говоря

 (поместите (* (ячейка b) (ячейка c)) d)
 

, но мы не будем говорить о деталях формул для
пока дольше.

(вернуться к содержанию)

НАЗАД
резьба главы СЛЕДУЮЩАЯ

Брайан Харви,
bh @ cs.berkeley.edu

Как мне выполнить сценарий .scm (вне REPL) с помощью MIT-Scheme?

Для запуска программы схемы с использованием схемы MIT:

  схема --quiet  

Параметр --quiet гарантирует, что вывод вашей программы будет единственным, что отображается (т.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 е. вы не увидите REPL в соответствии с вашими требованиями).

Предостережение : это не сработает, если ваша программа запрашивает у пользователя ввод с помощью процедур ввода (например,грамм. читать , читать символ , читать строку и т. Д.). Это связано с перенаправлением ввода оболочки ( <) (см. Соответствующий вопрос). К сожалению, в настоящее время не существует надлежащего способа выполнения сценария схемы MIT из командной строки при использовании процедур ввода. Лучшим вариантом, вероятно, является mit-scheme --quiet --load 'myscript' , но вам придется вручную выйти из MIT Scheme, когда сценарий завершится. Соответствующая ветка списка рассылки: [MIT-Scheme-devel] Как запустить сценарий и выйти?

РЕДАКТИРОВАТЬ: из-за того, что вы можете ошибочно набрать < как > , что приведет к перезаписи исходного кода, я бы предложил инкапсулировать указанную выше команду в сценарии оболочки или функции оболочки.Например:

  runcheme () {
    схема --quiet <"$ 1"
}
  

Затем вы можете запустить runcheme program.scm , не опасаясь, что ваш исходный код будет перезаписан. (Особая благодарность Полу Руни за то, что он обратил мое внимание на эту потенциальную ошибку).

Список литературы

схема - справка :

- пакетный режим, - тихий, - тихий

Подавляет запуск отчета о версиях и авторских правах, а также
прощание.

Этот параметр командной строки, кажется, был ошибочно исключен из списка параметров командной строки в документации, но я думаю, что это законный параметр командной строки, потому что схема --help показывает это, и потому что --batch-mode используется в других частях справочного руководства (например, здесь).

FreshPorts - lang / scm: интерпретатор схемы

История фиксации - (может быть неполным: подробные сведения см.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 По ссылке SVNWeb выше)
Дата По Описание
01 янв 2021 23:51:49
5f2_10

линимон
 Отметить порты, которые СЛОМАННЫ из-за sbrk на aarch64, а также Сломаны на riscv64
где это уместно.Пока здесь, pet portlint (порядок Makevar; пробел).

Утверждено: portmgr (tier-2 blanket) 
31 декабря 2020 20:21:52
5f2_10

миль
 Начать поиск заголовков и библиотек в $ {LOCALBASE} / -
в случае, если там установлены более новые реализации чего-либо.

При компиляции на версии 13.x или выше настаивайте на версии libgnuregex выше.
5 - более ранние выпуски FreeBSD поставлялись с libgnuregex.so.5, но это
теперь ушел и заменен портом devel / libgnuregex, который в настоящее время
устанавливает libgnuregex.так.6.

PR: 252252 252250 252245
Прислал: kevans
Спонсор: United Marsupials 
18 мая 2020 00:49:27
5f2_10

линимон
 Отметить как СЛОМАННЫЙ на powerpc64:

  "/wrkdirs/usr/ports/lang/scm/work/slib/lineio.scm": read-char: неправильный тип в
arg1 #f

Утверждено: portmgr (tier-2 blanket) 
06 ноя 2019 18:09:45
5f2_10

zeising
 Добавить USES = xorg USES = gl, порты категорий l и m

Добавьте USES = xorg и USES = gl к портам в категориях, начинающихся с l и m.Находясь здесь, попробуйте добавить другие ИСПОЛЬЗОВАНИЯ (в основном gnome и sdl) по мере необходимости. 
09 апр 2019 14:04:50
5f2_10

солнечный поэт
 Обновить строку разработки / чтения до 8.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24  ~~~~~~~~~~~~~~~~~~~~
...
install: /wrkdirs/usr/ports/lang/scm/work/scm/edline.so: нет такого файла или
каталог

Сообщено: pkg-fallout 
18 ноя 2018 22:06:45
5f2_9

миль
 Попробуйте повысить шансы на успешную сборку - включая, но не
ограничивается отключением оптимизаций компилятора.

Правильная фиксация кажется невозможной - даже с -O0 valgrind
отмечает сотни обращений к унифицированной памяти во время самопроверки.

Протестировано с помощью gcc8 и базовой cc (clang) - удалите требование GCC.Добавьте патчи от Debian.

А здесь немного упростите цель extract-target и удалите BROKEN *
линии, чтобы снова попытаться построить на других платформах ...

Поднять порт-доработку.

PR: 232936 
10 ноя 2018 18:12:58
5f2_8

крест
 Установите файлы texinfo (информация GNU) в $ {PREFIX} / share / info

После обсуждения в списке рассылки о перемещении страниц руководства в
$ {PREFIX} / share / man для согласованности с базой, где она находится
установлен в usr / share / man, похоже, должно произойти то же самое
в информационные файлы GNU, которые были установлены под общим доступом в базе, и
не в портах.Теперь texinfo не является базой ни для одной из поддерживаемых версий FreeBSD.
к этому ходу можно перейти, и это проще, чем
изменение страницы руководства.

Другим преимуществом, помимо согласованности, является меньшее количество исправлений: все инструменты сборки, но
cmake ожидают, что информационные файлы будут находиться в разделах share / info и cmake (исправлено здесь)
было исключение для BSD, поэтому патч делает FreeBSD менее
специально для них

Bump ревизия всех затронутых портов

PR: 232907
exp-управляется: антуан
Дифференциальная редакция: https: // отзывы.freebsd.org/D17816 
29 июл 2018 22:18:46
5f2_7

джеральд
 Bump PORTREVISION для портов в зависимости от канонической версии GCC
в дереве портов (через Mk / bsd.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 default-versions.mk и lang / gcc),
теперь по умолчанию переместился с GCC 6 на GCC 7.

Сюда входят порты
 - с USE_GCC = yes или USE_GCC = any,
 - с использованием USES = fortran,
 - используя Mk / bsd.octave.mk, который, в свою очередь, содержит USES = fortran и те
 - с USES = compiler, указав один из openmp, nestedfct, c11, c ++ 0x,
   c ++ 11-lib, c ++ 11-lang, c ++ 14-lang, c ++ 17-lang или gcc-c ++ 11-lib.PR: 222542 
10 марта 2018 17:46:06
5f2_6

джеральд
 Bump PORTREVISIONs всех пользователей math / mpc, которые мы только что обновили до
версия 1.1.0 (через ревизию 464079). 
30 ноя 2017 06:13:35
5f2_5

линимон
 Для портов, которые помечены как BROKEN на armv6, а также не могут использоваться
armv7, отметьте их так.Это вторая часть многостороннего коммита по обеспечению паритета портов armv7.
с armv6.

Утверждено: portmgr (одеяло tier-2)
Получено с: lonesome.com -exp run 
10 сен 2017 20:55:39
5f2_5

джеральд
 Bump PORTREVISION для портов в зависимости от канонической версии GCC
(через Mk / bsd.default-versions.mk и lang / gcc), который был перемещен из
GCC 5.4 - GCC 6.4 в большинстве случаев.

Сюда входят порты
 - с USE_GCC = yes или USE_GCC = any,
 - с USES = fortran,
 - с использованием Mk / bsd.octave.mk, который, в свою очередь, содержит USES = fortran и
 - с USES = compiler с указанием openmp, nestedfct, c ++ 11-lib, c ++ 11-lang,
   c ++ 14-lang, c ++ 0x, c11 или gcc-c ++ 11-lib.

PR: 219275 
27 июня 2017 г. 13:46:53
5f2_4

солнечный поэт
 Обновить devel / readline до версии 7.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 0, патч 3

- Bump PORTREVISION для смены шлиба

Изменения: https://cnswww.cns.cwru.edu/php/chet/readline/CHANGES
https://lists.gnu.org/archive/html/bug-bash/2016-09/msg00107.html
https://lists.gnu.org/archive/html/bug-readline/2017-01/msg00002.html
Дифференциальная версия: https://reviews.freebsd.org/D11172
PR: 219947
Экспертиза: антуан 
02 мая 2017 22:23:52
5f2_3

линимон
 Отметить некоторые порты, которые не работают на aarch64, и, в некоторых случаях, на другом уровне 2
арки.

Пока здесь, любимчик портлинт.

Утверждено: portmgr (tier-2 blanket) 
01 апр 2017 15:23:32
5f2_3

джеральд
 Bump PORTREVISIONs для портов в зависимости от канонической версии GCC и
lang / gcc, которые перешли из GCC 4.9.4 в GCC 5.4 (по крайней мере, в некоторых
обстоятельства, такие как версии FreeBSD или платформ).

Сюда входят порты
 - с USE_GCC = yes или USE_GCC = any,
 - с USES = fortran,
 - используя Mk / bsd.octave.mk, который, в свою очередь, имеет USES = fortran, и
 - с USES = compiler с указанием openmp, nestedfct, c ++ 11-lib, c ++ 14-lang,
   c ++ 11-lang, c ++ 0x, c11 или gcc-c ++ 11-lib.

PR: 216707 
20 ноя 2016 09:38:09
5f2_2

джеральд
 Bump PORTREVISIONS для портов в зависимости от канонической версии GCC и
lang / gcc, которые перешли из GCC 4.8.5 до GCC 4.9.4 (по крайней мере, в некоторых
обстоятельства, такие как версии FreeBSD или платформ).

В частности, это порты с USE_GCC = yes, USE_GCC = any или одним из
gcc-c ++ 11-lib, openmp, nestedfct, c ++ 11-lib, а также c ++ 14-lang,
c ++ 11-lang, c ++ 0x, c11 запрошено через компилятор USES =. 
21 апр 2016 16:43:15
5f2_1

помоев
 много портов: пометка сломана на powerpc64 
19 августа 2015 16:40:58
5f2_1

миль
 Перестаньте избегать реализации gmalloc, связанной с кодом, в надежде, что
это поможет избавиться от случайных сбоев (сообщалось в апстриме за 6 месяцев).Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 
назад безрезультатно).Исправьте список, как указано в:

PR: 202489
Прислал: amdmi3 
16 августа 2015 11:15:39
5f2

данфе
 Отменить r3: оптимизация MASTER_SITE_SUBDIR фактически делает порт
более хрупкий по отношению к следующим обновлениям. Хотя он также скрывает момент
в следующем обновлении версии, как правило, мы должны стараться сохранять порты доступными для извлечения
всегда (и, следовательно, более надежный).

Это также отменяет расширение логина свободного падения в заголовке Makefile: несмотря на его
здравомыслие и заслуги, это случайно противоречит одному из "правил" PHB, которое
недавно преследовал Справочник.Правильным исправлением было бы исправление последнего,
но на данный момент именно этот вопрос вызывает слишком много драмы в списках.

Запрошено: mat 
15 августа 2015 15:16:38
5f2

данфе
 - Избавьтесь от MASTER_SITE_SUBDIR (фактически, подкаталог OLD не содержит
  текущие дистрибутивы)
- Разверните заголовок Makefile, пока здесь 
27 янв 2015 08:40:35
5f2

миль
 Обновление с 5f1 до 5f2.Плохие новости:

1. gcc по-прежнему требуется - clang может собирать двоичные файлы, но
некоторые самотестирование не сработают, если вся оптимизация
           отключен. Вероятно, это связано с каким-то подозрительным кодом в
           bytenumb.c - неплохо бы разобраться.
2. Параллельная сборка этого порта по-прежнему невозможна -
Makefile слишком запутанный, и те же исходники перекомпилированы.
несколько раз с разными заданными #defines.

Хорошие новости:

1. Разрешите большое количество предупреждений.
2. Фикс сборки на ia64 и sparc64 (проверено на pluto и flame
           соответственно).Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 Другие платформы (альфа, powerpc?) Имеют
больше шансов работать сейчас ... 
27 октября 2014 г. 15:23:31
5f1_1

крест
 Очистить список 
14 июня 2014 г. 05:49:29
5f1_1

miwi
 - Исправить сборку с i386

PR: 1
Прислал: ports fury
10 марта 2014 г. 16:01:36
5f1

крест
 Преобразовать l * в USES = zip 
20 сен 2013 19:53:10
5f1

крест
 Добавьте NO_STAGE повсюду при подготовке к промежуточной поддержке (cat:
lang) 
28 мая 2013 13:46:00
5f1

miwi
 - Обновление до 5f1

PR: 178869
Прислал: ports fury 
03 июля 2011 13:45:36
5e7
Охауер
 - удалить MD5 
18 сен 2010 15:57:50
5e7
makc
 Обновление до версии 5e7

PR: порты / 150668
Прислал: КАТО Цугуру  
01 апр 2010 05:16:19
5e6
линимон
 Пометить различные порты как сломанные или игнорировать на powerpc.

Пока здесь удалите остатки альфы. 
22 ноября 2009 г.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 19:49:43
5e6
пав
 - Отметить MAKE_JOBS_UNSAFE

Сообщил: pointyhat 
08 августа 2009 06:24:17
5e6
miwi
 - Обновление до 5e6

PR: 137530
Прислал: Ports Fury 
19 апреля 2008 г. 17:56:05
5e5

miwi
 - Удалить ненужную зависимость из gtk12 / gtk20 [1]
- Удалите USE_XLIB / USE_X_PREFIX / USE_XPM в пользу USE_XORG
- Убрать поддержку X11BASE в пользу LOCALBASE или PREFIX.
- Используйте USE_LDCONFIG вместо INSTALLS_SHLIB
- Удалите ненужный USE_GCC 3.4+

Спасибо всем помощникам:
        Дмитрий Маракасов, Chess Griffin, beech @, dinoex, rafan, gahr,
        ehaupt, nox, itetcu, flz, pav

PR: 116263
Проверено на: pointyhat
Утверждено: portmgr (pav) 
18 февраля 2008 г. 22:15:00
5e5
miwi
 - Обновление до версии 5e5

PR: 5e5
Прислал: КАТО Цугуру  
20 января 2008 21:55:57
5e4
miwi
 - Обновление до 5e4

PR: 119724
Прислал: КАТО Цугуру  
09 янв 2007 22:51:14
5e3
miwi
 - Обновление до 5e3

PR: порты / 107631
Прислал: КАТО Цугуру  
30 ноября 2006 г. 23:42:04
5e2
крис
 BROKEN на ia64 и sparc64: не компилируется 
17 сен 2006 19:53:20
5e2
крис
 Теперь это можно построить на amd64, предполагая, что он строится на других
арки тоже.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 
21 августа 2006 г. 10:16:12
5e2
miwi
 - Добавить резервную копию MASTER_SITES

Прислал: pointyhat через почту Криса
Утвердил: krion (наставник) 
24 июня 2006 г. 20:08:56
5e2
miwi
 Обновление до 5e2

Прислал: miwi
Утвердил: markus (помощник) 
09 мая 2006 г. 20:52:24
5e1
Эдвин
 Удалить USE_REINPLACE из категорий, начинающихся с L 
25 ноя 2005 00:33:45
5e1
пав
 - Добавить SHA256 
06 июл 2005 15:53:10
5e1
пав
 - Обновление до 5e1

PR: порты / 82940
Прислал: КАТО Цугуру  
12 декабря 2004 г. 15:32:47
5d9_1
сем
 - Разбить на 5.3+

PR: порты / 71684
Прислал: Флоран Туми  
26 сен 2004 03:05:29
5d9_1
крис
 BROKEN on 5.x: Segfault во время сборки

Утвердил: portmgr (self) 
10 апреля 2004 г. 17:11:02
5d9_1
тревор
 Втиснуть в 80 столбцов по 24 строки.
17 марта 2004 г. 18:29:46
5d9_1
тревор
 РАЗМЕРУточнить.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24  
23 февраля 2004 г. 05:21:24
5d9_1
крис
 BROKEN on! I386: не компилируется 
04 фев 2004 05:21:48
5d9_1
Маркус
 Включите PORTREVISION на всех портах, зависящих от gettext, чтобы облегчить обновление.(Часть 2) 
09 декабря 2003 19:48:13
5d9
крион
 - Обновление до версии 5d9

PR: 60070
Прислал: Ports Fury 
28 августа 2003 г. 00:09:58
5d8
Эдвин
 Используйте новую виртуальную категорию «схема»

        - Добавить виртуальную категорию «схема» в сиротские порты.
        - Исправить скрипт csc курицы
        - Незначительные чистки портлинта

PR: порты / 55265
Прислал: Кимура Фуюки  
09 августа 2003 13:32:16
5d8
крион
 - Обновление до версии 5d8

PR: 55420
Прислал: Ports Fury 
20 февраля 2003 г. 18:38:02
5d7
кну
 De-pkg-comment. 
02 января 2003 17:46:48
5d7
ijliao
 обновить до 5d7

PR: 45855
Прислал: Ports Fury 
11 августа 2002 г. 05:08:23
5d6_1
ijliao
 исправить опечатку, ПОРТРЕВЕРСИЯ -> ПОРТРЕВИЗИЯ

Прислал: kcwu @ ck.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 tp.edu.tw 
21 июня 2002 г. 16:20:23
5d6
ijliao
 Замените $ {PERL} на $ {REINPLACE_CMD}

PR: 39605
Прислал: Оливер Браун  
05 июня 2002 00:43:23
5d6
Петеф
 Разрешить scm загружать модули.

PR: 38882
Прислал: Хироюки Уне  
30 мая 2002 г. 04:05:38
5d6
пат
 Обновить до 5d6

PR: 38702
Прислал: Оливер Браун  
09 апр 2002 07:46:10
5d5_1
ijliao
 - Добавить поддержку загружаемого модуля

PR: 36893
Прислал: Ports Fury 
12 марта 2002 00:47:02 пат
 Обновление до 5d5

PR: 35792
Прислал: КАТО Цугуру  
25 августа 2001 00:30:18 DWCJR
 Обновить версию slib до 2d2 
10 апреля 2001 18:17:48 люксовый
 Обновление до версии 5d4 
24 октября 2000 16:49:55 кевло
 - Обновить версию slib до 2c9 - Исправить pkg-descr 
08 окт 2000 04:17:26 асами
 Преобразовать язык категории в новый макет.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 
17 сен 2000 12:15:43 крис
 MASTER_SITE_GNU не содержит последней версии файлов. 
18 августа 2000 17:29:21 кевло
 Обновление до версии 5d3 

Руководство пользователя схемы

MIT - Компиляция программ

Руководство пользователя схемы MIT - Компиляция программ

Перейти к первому, предыдущему, следующему, последнему разделу оглавления.


Примечание: процедуры, описанные в этом разделе, доступны только в том случае, если
компилятор загружен, как в образе мира "compiler.com".
Кроме того, cf доступен только на машинах, поддерживающих
компиляция нативного кода.

процедура +: cf имя файла [назначение]
Это программа, которая преобразует файл исходного кода в собственный код.
двоичная форма. Если пункт назначения не указан, как в

(ср "фу")
 

cf компилирует файл `foo.scm ', создавая файл
`foo.com '(кстати, он также создаст` foo.bin',
`foo.bci 'и, возможно,` foo.ext'). Если вы позже оцените

(загрузить "foo")
 

Будет загружен `foo.com ', а не` foo.scm'.

Если задано назначение , то указывается, куда должны идти выходные файлы.
Если этот аргумент является каталогом, они попадают в этот каталог, например:

(cf "foo" "../bar/")
 

возьмет `foo.scm 'и сгенерирует файл` ../bar/foo.com '.
Если пункт назначения не является каталогом, это корневое имя
выход:

(cf "foo" "bar")
 

берет foo.scm и создает bar.com.

О файлах .bci: эти файлы содержат отладочную информацию.
информация, которую Scheme использует, когда вы вызываете debug для проверки
скомпилированный код.Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 Когда вы загружаете файл .com, Scheme запоминает, где
он был загружен из, и когда отладчик (или pp ) смотрит на
скомпилированный код из этого файла, он пытается найти расширение `.bci 'файл
в том же каталоге, из которого был загружен файл .com. Таким образом
Эти файлы рекомендуется хранить вместе.

Файлы .bci хранятся в сжатом формате.
Отладчик должен распаковывать файлы, когда просматривает их,
а на медленной машине это может занять значительное время.
Система предпринимает шаги, чтобы уменьшить влияние такого поведения:
отладочная информация кешируется в памяти,
а несжатые версии файлов `.bci 'хранятся.
По умолчанию создается временный файл, а
`.bci 'файл не сжат в него. Временный файл сохраняется
некоторое время после этого, и в течение этого времени, если несжатый
Требуется файл .bci, используется временный файл. Каждый такой
ссылка обновляет "время доступа", связанное с временным
файл. Сборщик мусора проверяет время доступа всех таких
временные файлы и удаляет все, к которым не обращались в течение пяти
минут или больше. Все временные файлы удаляются автоматически, когда
Схема процесса убита.

Доступны два других поведения. Один из них распаковывает .bci
файл каждый раз, когда на него ссылаются, а другой распаковывает `.bci '
файл и записывает его обратно как файл .bif.
Файл .bif остается после выхода из Scheme.
Временной интервал и поведение контролируются переменными.

переменная +: * сохранить несжатые файлы? *
Эта переменная влияет на то, что происходит, когда файлы `.bci '
несжатый. Это позволяет выбирать между производительностью и дисковым пространством.Возможны три значения:

#f
Несжатые версии файлов .bci никогда не сохраняются. Каждый
когда информация необходима, файл `.bci 'не сжимается.
Этот вариант требует минимального объема дискового пространства и является наиболее подходящим.
самый медленный.

автомат
Несжатые версии файлов .Схема скм 24: Принципиальная схема и подключение селекторов каналов СК-Д-24 и СК-М-24 bci хранятся как временные файлы.
Временные файлы удаляются при выходе из Scheme, а если они не были
некоторое время использовался. Это значение по умолчанию.
#t
Файлы .bci не сжимаются в постоянные файлы .bif.
Эти файлы остаются на диске после выхода из схемы и довольно большие -
примерно в два раза больше размера соответствующих файлов .bci. если ты
выберите этот вариант, и у вас заканчивается место на диске, которое вы можете удалить
файлы .bif. Они будут регенерированы по мере необходимости.
переменная +: * время жизни несжатого файла *
Минимальный период времени, в течение которого временная несжатая версия
а `.bci 'останется на диске после последнего использования.
Время в миллисекундах; по умолчанию `300000 ' (пять
минут).
переменная +: загрузка-отладка-информация по запросу?
Если эта переменная - `#f ', то печать скомпилированной процедуры
напечатает имя процедуры, только если отладочная информация для
эта процедура уже загружена. В противном случае это заставит
загрузка отладочной информации.
Значение по умолчанию - #f .
процедура +: sf имя файла [назначение]
sf - это программа, которая преобразует файл исходного кода в двоичный
Форма SCode; он используется на машинах, которые не поддерживают собственный код
компиляция. Он выполняет множество оптимизаций, которые могут сделать ваш
программы работают значительно быстрее, чем неоптимизированный интерпретируемый код.
Кроме того, бинарные файлы, которые он генерирует, загружаются очень быстро по сравнению с
файлы исходного кода.

Самый простой способ использовать sf - просто сказать:

(SF  имя файла )
 

Это приведет к преобразованию вашего файла, и полученный двоичный файл
файл должен быть записан с тем же именем, но с типом пути
"бункер" .Если вы не укажете тип пути во входном файле,
"scm" .

Подобно загрузке , первый аргумент sf может быть списком
имена файлов, а не одно имя файла.

sf принимает необязательный второй аргумент, который является именем файла
выходной файл. Если этот аргумент - каталог, то выходной файл
имеет свое обычное имя, но вместо этого помещается в этот каталог.

В ваши программы можно добавить несколько объявлений, чтобы помочь cf и
SF сделать их более эффективными.

Стандартные названия

Обычно во всех файлах есть строка

(объявить (обычные-интеграции))
 

около их начала, что сообщает компилятору, что освобождают переменные, чьи
имена определены в system-global-environment не будет
затеняется другими определениями при загрузке программы. если ты
переопределите какое-нибудь глобальное имя в вашем коде, например car ,
cdr , и cons , вы должны указать это в декларации:

(объявить (минусы компакт-дисков с обычными интеграциями))
 

Вы можете получить отсортированный по алфавиту список имен,
обычных интеграций объявление влияет на оценку
следующее выражение:

(eval '(sort (добавить обычные-интеграции / имена-константы
                     обычные-интеграции / имена-расширения)
             (лямбда (x y)
               (строка <=? (символ-> строка x)
                          (символ-> строка y))))
      (-> среда '(оптимизатор scode)))
 

Встроенное кодирование

Еще одно полезное свойство - это возможность встроить процедуру в код.
определения.Фактически компилятор выполнит полное бета-преобразование,
с автоматическим переименованием по запросу. Вот соответствующие
декларации:

декларация +: интегрировать имя ...
Переменные name s должны быть определены в том же файле, что и этот.
декларация. Любая ссылка на одну из названных переменных, которая появляется
в том же блоке, что и объявление, или в одном из его дочерних блоков,
будет заменен соответствующим выражением значения привязки.
декларация +: интегрированный оператор имя ...
Аналогично декларации , интегрируйте декларацию , за исключением того, что она только
заменяет ссылки, которые появляются в позиции оператора
комбинация. Все остальные ссылки игнорируются.
декларация +: интегрированный внешний имя файла
Заставляет компилятор использовать интеграции верхнего уровня, предоставляемые
имя файла . filename не должен указывать тип файла, а
файл исходного кода, который он называет, должен быть предварительно обработан
компилятор.

Если имя файла является относительным именем файла (нормальный случай), это
интерпретируется как относящийся к файлу, в котором объявление
появляется. Таким образом, если объявление появляется в файле `/usr/cph/foo.scm ',
тогда компилятор ищет файл с именем `/ usr / cph / filename .ext '.

Примечание. Когда компилятор находит интеграции верхнего уровня, он собирает их.
и выводит их во вспомогательный файл с расширением `.доб.
Этот файл `.ext 'является тем, что интегрирует-внешнее объявление
относится к.

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

(определить-интегрируемый (foo-bar foo bar)
  (vector-ref (vector-ref foo bar) 3))
 

Вот как вы делаете то же самое без этой специальной формы: там
должен быть интегрирующим оператором декларацией для процедуры
имя и (внутри определения процедуры) интегрировать
объявление для каждого из параметров процедуры, например:

(объявить (интегрировать оператор foo-bar))

(определите foo-bar
  (лямбда (foo bar)
    (объявить (интегрировать панель foo))
    (vector-ref (vector-ref foo bar) 3)))
 

Причина этого осложнения следующая:
интегрировать оператор декларация находит все ссылки на
foo-bar и заменяет их лямбда-выражением из
определение.Затем интегрируют объявления , потому что
комбинация, в которой произошла ссылка на foo-bar
предоставляет код, который заменяется по всему телу процедуры
определение. Например:

(foo-bar (car baz) (cdr baz))
 

Сначала используйте объявление интегрированного оператора :

((лямбда (foo bar)
   (объявить (интегрировать панель foo))
   (vector-ref (vector-ref foo bar) 3))
 (автомобильная база)
 (cdr baz))
 

Затем используйте внутреннюю декларацию интегрировать :

((лямбда (foo bar)
   (vector-ref (vector-ref (car baz) (cdr baz)) 3))
 (автомобильная база)
 (cdr baz))
 

Затем обратите внимание, что переменные foo и bar не используются,
и устранить их:

((лямбда ()
   (vector-ref (vector-ref (car baz) (cdr baz)) 3)))
 

Наконец, удалите ((lambda ()...)) производить

(vector-ref (vector-ref (car baz) (cdr baz)) 3)
 
Полезный совет

Чтобы увидеть влияние объявлений интеграции (и макросов) на
исходный файл, распечатайте файл `.bin ', как этот (будьте готовы
за большой выход).

(SF "foo.scm")
(pp (fasload "foo.bin"))
 

Замена оператора

Объявление replace-operator предназначено для информирования
компилятор, что некоторые операторы могут быть заменены другими операторами
в зависимости от количества аргументов.Например:

Декларация:

(объявить (оператор замены (карта (2 карта-2) (3 карта-3))))
 

Замены:

(карта  f   x   y   z ) ==> (карта  f   x   y   z )
(карта  f   x   y ) ==> (map-3  f   x   y )
(карта  f   x ) ==> (карта-2  f   x )
(карта  f ) ==> (карта  f )
(карта) ==> (карта)
 

Предположительно map-2 и map-3 являются эффективными версиями
карта , которые написаны ровно для двух и трех аргументов
соответственно.Все остальные случаи не раскрываются, но обрабатываются
оригинальная, общая процедура map , которая менее эффективна, потому что
он должен обрабатывать переменное количество аргументов.

объявление +: оператор замены имя ...

Синтаксис этого объявления:

(оператор замены
  ( название 
    ( нарг1   значение1 )
    ( нарг2   значение2 )
    ...))
 

куда

  • имя является символом.

  • nargs1 , nargs2 и т. Д. Являются неотрицательными целыми числами или одним из
    следующие символы: любой , иначе или иначе .

  • значение1 , значение2 и т. Д. Просты
    выражения в одной из этих форм:

    ' постоянная
    Постоянная.

    переменная
    Переменная.
    (примитив имя-примитива [ арность ])
    Примитивная процедура с именем имя-примитива . Необязательный
    элемент арность , неотрицательное целое число, определяет количество
    аргументы, которые принимает примитив.

    (общий var )
    Глобальная переменная.

Значения этих полей:

  • имя - имя сокращаемого оператора.Если это не
    затененный (например, let), то он может быть заменен по
    следующие правила.

  • Если у оператора nargsN аргументов, то он заменяется на
    вызов valueN с теми же аргументами.

  • Если количество аргументов не указано, а один из nargsN является
    любой , иначе или иначе , тогда операция
    заменяется обращением к соответствующему значению N .Только один из nargsN может иметь такую ​​форму.

  • Если количество аргументов не указано и ни один из nargsN не является
    любой , иначе или иначе , то операция не выполняется
    заменены.

Оператор Сокращение

Объявление reduce-operator предназначено для информирования
компилятор, что определенные имена являются n-арными версиями бинарных операторов.
Вот некоторые примеры:

Декларация:

(объявить (оператор сокращения (минусы * минусы)))
 

Замены:

(cons *  x   y   z   w ) ==> (cons  x  (cons  y  (cons  z   w ))),
(cons *  x   y ) ==> (cons  x   y )
(минус *  x ) ==>  x 
(cons *) ошибка -> слишком мало аргументов
 

Декларация:

(объявить (оператор сокращения (список минусов (нулевое значение '() любое))))
 

Замены:

(список  x   y   z   w ) ==> (cons  x  (cons  y  (cons  z  (cons  w  '()))))
(список  x   y ) ==> (cons  x  (cons  y  '()))
(список  x ) ==> (cons  x  '())
(список) ==> '()
 

Декларация:

(объявить (оператор уменьшения (-% - (нулевое значение 0 одиночный) (группа слева))))
 

Замены:

(-  x   y   z   w ) ==> (% - (% - (% -  x   y )  z )  w )
(-  x   y ) ==> (% -  x   y )
(-  x ) ==> (% - 0  x )
(-) ==> 0
 

Декларация:

(объявить (оператор уменьшения (+% + (нулевое значение 0 нет) (группа справа))))
 

Замены:

(+  x   y   z   w ) ==> (% +  x  (% +  y  (% +  z   w )))
(+  x   y ) ==> (% +  x   y )
(+  x ) ==>  x 
(+) ==> 0
 

Примечание: это объявление не приводит к соответствующему определению
% + (в последнем примере), чтобы появиться в вашем коде.Это просто
информирует компилятор, что некоторые оптимизации могут быть выполнены на
звонки на + , заменив их звонками на % + . Вам следует
укажите также определение % + , хотя это не обязательно.

Декларация:

(объявить (оператор сокращения (применить (примитивные минусы)
                                 (группа справа)
                                 (обертка (глобальное применение) 1))))
 

Замены:

(применить  f   x   y   z   w ) ==> ((access apply ())  f  (cons  x  (cons  y  (cons  z   w )) )))
(применить  f   x   y ) ==> ((access apply ())  f  (cons  x   y ))
(применить  f   x ) ==> (применить  f   x )
(применить  f ) ==> (применить  f )
(применить) ==> (применить)
 
объявление +: оператор сокращения имя...
Общий формат декларации (скобки обозначают необязательные
элементы):

(оператор сокращения
  ( название 
      биноп 
    [(группа , заказывающая )]
    [(нулевое значение  значение   нулевое значение )]
    [(singleton  unop )]
    [(обертка  обертка  [n])]
    [(максимум  м )]
  ))
 

куда

  • n и m - целые неотрицательные числа.

  • имя является символом.

  • binop , value , unop и wrap просты
    выражения в одной из этих форм:

    ' постоянная
    Постоянная.

    переменная
    Переменная.

    (примитив имя-примитива [ арность ])
    Примитивная процедура с именем имя-примитива .Необязательный
    элемент arity определяет количество аргументов, которые примитив
    принимает.

    (общий var )
    Глобальная переменная.
  • нулевой вариант либо всегда , любой , один ,
    одиночный , нет или пустой .

  • заказ : слева , справа , или
    ассоциативный .

Значение этих полей:

  • имя - имя сокращаемой n-арной операции.

  • binop - это двоичная операция, в которой n-арная операция должна быть
    быть уменьшенным.

  • Параметр group указывает, ассоциируется ли имя с
    право или лево.

  • Параметр с нулевым значением указывает значение для использования в следующих
    случаи:

    нет
    пустой
    Если для name не указаны аргументы, возвращается значение .
    один
    одиночный
    Когда для name предоставляется единственный аргумент, значение становится .
    второй аргумент binop .

    любой
    всегда
    binop используется в качестве «последнего» аргумента, а значение обеспечивает
    оставшийся аргумент binop .

    В приведенных выше вариантах, когда значение передается в binop , это
    поставляется слева, если группировка слева, в противном случае поставляется
    справа.

  • Параметр singleton указывает функцию unop , которая должна быть
    вызывается с единственным аргументом слева. Этот вариант заменяет
    параметр с нулевым значением , который может принимать только значение нет .

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

  • Максимальный параметр указывает, что вызовы с более чем m аргументами
    не следует уменьшать.

То, как вы пишете свои программы, может иметь большое влияние на то, насколько эффективно
скомпилированная программа запускается. Самое главное, что нужно сделать после выбора
подходящие структуры данных, следует поместить следующее объявление рядом с
начало файла.

(объявить (обычные-интеграции))
 

Без этого объявления компилятор не может распознать ни одно из общих
операторов и эффективно их компилировать.

обычных интеграций объявления обычно достаточно, чтобы получить
скомпилированный код хорошего качества.

Если вам действительно нужно выжать из кода больше производительности, тогда мы
надеюсь, что вы найдете следующую сумку с советами, подсказками и
объяснения полезные.

Стиль кодирования

Лучшие предикаты

Рассмотрим следующую реализацию map , которую можно найти в
любая вводная книга по схеме:

(определить (карта f lst)
  (если (null? lst)
      '()
      (cons (f (car lst)) (карта f (cdr lst)))))
 

Проблема с этим определением в том, что в точках, где вагон
и cdr , мы до сих пор не знаем, что lst - это пара.Компилятор должен вставить проверку типа, или, если проверки типа отключены,
программа может дать неверные результаты. Поскольку один из фундаментальных
свойства карты состоит в том, что она преобразует списки, мы должны сделать
взаимосвязь между входными парами и парами результатов более очевидна
в коде:

(определить (карта f lst)
  (cond ((пара? lst)
         (cons (f (car lst)) (карта f (cdr lst))))
        ((null? lst)
         '())
        (еще
         ...); Вы решаете - '() или ошибка?
 

Также обратите внимание, что пара ? Дело идет первым, потому что мы ожидаем, что
карта будет вызываться в списках, которые в среднем имеют длину
больше того.

Внутренние процедуры

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

(определить (map f original-lst)
  (пусть гуляют ((lst original-lst))
    (cond ((пара? lst)
           (минусы (f (автомобиль lst)) (прогулка (cdr lst))))
          ((null? lst)
           '())
          (еще
           (ошибка «Неправильный список:» original-lst)))))
 
Внутренний определяет

Внутренние определения - полезный инструмент для структурирования более крупных
процедуры.Однако некоторые внутренние определения могут помешать компилятору
оптимизации. Рассмотрим следующие две процедуры, где
compute-100 - это какая-то неизвестная процедура, которая, как мы знаем, возвращает
`100 '.

(определить (f1)
  (определите v 100)
  (лямбда () v))

(определить (f2)
  (определить v (вычислить-100))
  (лямбда () v))
 

Процедура, возвращаемая командой f1 , всегда будет давать один и тот же результат и
компилятор может это доказать. Процедура, возвращенная f2 может
возвращать разные результаты, даже если f2 вызывается только один раз.Из-за этого компилятор должен выделить ячейку памяти для v .
Как процедура может возвращать разные результаты?

Основная причина в том, что продолжение может ускользнуть во время
оценка (вычислить-100) , позволяя остальной части тела
f2 для выполнения снова :

(определить сохранить)

(определить (вычислить-100)
  (вызов-с-текущим-продолжением
   (лямбда (к)
     (установить! держать k)
     100)))

(определим p (f2))

(р) => 100
(сохранить -999) => p  переопределить v и p 
(р) => -999
 

Чтобы избежать неэффективности, вводимой для обработки общего случая,
компилятор должен доказать, что продолжение невозможно избежать.В
компилятор знает, что лямбда-выражения и константы не позволяют
продолжения ускользают, поэтому упорядочите внутренние определения так, чтобы
сначала идут определения следующих форм:

(определить x ' что-то )
(определить x (лямбда (...) ...))
(определите (f u v) ...)
 

Глобальные переменные

Скомпилированный код обычно обращается к переменным на верхнем уровне первого класса
среды через кеши переменных . Каждая скомпилированная процедура имеет
набор кешей переменных для глобальных переменных, которые он использует.Есть
три вида кэша переменных - кеши чтения для получения значения
переменная (ссылающаяся на переменную), напишите кеши для изменения
значение, и выполнить кеши для вызова процедуры, назначенной этому
Переменная.

Иногда кеши переменных содержат специальные объекты, называемые ссылками.
ловушки, указывающие на то, что операция не может продолжаться нормально, и
должны либо быть завершены системой (для сохранения кешей
когерентный) или должен сигнализировать об ошибке. Например, задание

(установить! новая строка my-better-newline)
 

заставит систему переходить к каждой скомпилированной процедуре, которая вызывает
, новая строка и обновите его кэш выполнения, чтобы вызвать новую процедуру.Очевидно, вы хотите избежать обновления сотен кешей выполнения в
критический цикл. Использование Fluid-let для временного переопределения
такая же неэффективность (но вдвое!).

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

Иногда можно доказать, что переменная (а) всегда будет связана, (б)
всегда будет назначаться и (c) никогда не будет никаких скомпилированных вызовов
к этой переменной.Компилятор не может этого доказать, потому что предполагает, что
другие, независимо скомпилированные файлы могут быть загружены, что делает недействительным
эти предположения.
Если вы знаете, что эти условия выполняются, следующие объявления могут
ускорить и уменьшить размер программы, использующей глобальные переменные.

объявление +: ловушки игнорирования ссылок переменные
Это объявление сообщает компилятору, что ему не нужно проверять
объект-ловушка при обращении к заданным переменным .Если какая-либо из переменных не связана или не назначена, тогда переменная
ссылка даст объект-ловушку ссылки, а не сигнализирует об
ошибка. Это заявление относительно безопасно: худшее, что может случиться
заключается в том, что объект ловушки ссылок попадает в структуру данных
(например, список) или в интерпретируемый код, и в этом случае он, вероятно,
заставить некоторую "несвязанную" переменную таинственным образом стать несвязанной или
не назначен.
объявление +: ловушки игнорирования-присваивания переменные
Это объявление сообщает компилятору, что ему не нужно проверять
объект-ловушка при присвоении заданным переменным .An
присвоение переменной, которая игнорирует ловушки присваивания, может привести к отличному
дело неприятностей. Если есть вызов скомпилированной процедуры где-нибудь в
system в эту переменную, кеши выполнения не будут обновляться, что приведет к
несоответствие между значением, используемым для вызова процедуры, и
значение, видимое при чтении переменной. Это зло усугубляется
тот факт, что задание может вызвать другие задания, которые были скомпилированы
с проверками, чтобы вести себя так же.

Переменные задаются выражениями из следующих
установить язык:

переменная-спецификация: набор имя...
Все явно перечисленные имена.
переменная-спецификация: все
переменная-спецификация: нет
переменная-спецификация: бесплатно
переменная-спецификация: граница
спецификация переменной: присвоено
Эти выражения называют наборы переменных. все набор всех
переменных, нет - пустое множество, свободно - все
переменные, связанные за пределами текущего блока, привязка - это все
переменные, связанные в текущем блоке, и присвоено - это все
переменные, для которых существует присвоение (т.е. набор ! ).
переменная-спецификация: штуцер набор1 набор2
спецификация переменной: пересечение set1 set2
спецификация переменной: разница set1 set2

Например, чтобы игнорировать ловушки ссылок для всех переменных, кроме
x , y и любая переменная, присвоенная

(объявить (игнорировать ссылки-ловушки
          (разница все (объединение присвоено (набор x y)))))
 

Фиксированная арифметика

Обычные арифметические операции, такие как + и <, называются
общие арифметические операции, потому что они работают для всех (подходящих)
виды числа.

fixnum - это точное целое число, достаточно маленькое, чтобы поместиться в
машинное слово. В схеме MIT фиксированные числа обычно составляют 24 или 26 бит,
в зависимости от машины; разумно предположить, что фиксированные числа находятся на
минимум 24 бита. Фикснумы подписаны; они закодированы с использованием двоек
дополнение.

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

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

Полезная область для вставки операций fixnum находится в указателе
операции в тесных петлях.

Арифметика Flonum

Получить эффективную арифметику flonum намного сложнее и труднее
чем получить эффективную арифметику fixnum.

Flonum, состоящий из

Одним из основных недостатков общей арифметики является то, что не все
виды числа помещаются в машинный регистр.
Flonums должен быть в штучной упаковке , потому что 64-битный IEEE с плавающей запятой
число (представление, которое использует схема MIT) не вписывается в
обычное машинное слово.Это верно даже для 64-битных архитектур, потому что некоторые лишние биты
необходимо, чтобы отличать числа с плавающей запятой от других объектов, таких как
пары и струны.
Значения помещаются в рамки, сохраняя их в небольшой записи в куче.
Каждое значение с плавающей запятой, которое вы видите в REPL, заключено в рамку.
Значения с плавающей запятой распаковываются только на короткие периоды времени, когда
они находятся в модуле с плавающей запятой машины и фактическом с плавающей запятой
операции выполняются.

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

Рассмотрим следующую процедуру для вычисления расстояния до точки
(x, y) от начала координат.

(определить (расстояние x y)
  (sqrt (+ (* х х) (* у у))))
 

Вызов (расстояние 0,3 0,4) возвращает новый, упакованный в коробку flonum, 0,5.
Вычисление также генерирует три промежуточных флонума в штучной упаковке. Этот
следующая версия работает только для входов flonum, генерирует только одну коробку
flonum (результат) и работает в восемь раз быстрее:

(определить (flo: расстояние x y)
  (Фло: sqrt (Фло: + (Фло: * х х) (Фло: * у у))))
 

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

векторов Flonum

Векторы Flonum - это векторы, которые содержат только значения с плавающей запятой, в
почти так же, как строка является `вектором ', содержащим только символ
значения.

У векторов Flonum есть преимущества компактного хранения (около половины
то из обычного переносчика flonum) и разумное использование flonum
векторы могут уменьшить потребление flonum.

Недостатки в том, что векторы flonum несовместимы с обычными
переносчиками, и при неосторожном использовании могут увеличить потребление flonum.Flonum
векторы - это боль в использовании, потому что они требуют от вас принятия решения
о репрезентации и придерживаться его, и это может быть нелегко
выяснить, перевешивают ли преимущества одной части программы
недостатки в другом.

К векторным операциям flonum относятся:

процедура +: flo: vector-cons n
Создайте вектор flonum длиной N .
Содержимое вектора произвольно и может быть недействительным.
числа с плавающей запятой.Содержимое не должно использоваться до инициализации.
процедура +: flo: vector-ref flonum-vector index
процедура +: flo: vector-set! значение индекса flonum-vector
процедура +: flo: vector-length flonum-vector
Эти операции аналогичны обычным векторным операциям.
Примеры

Следующая операция не вызывает потребления flonum, потому что flonum
загружается непосредственно из вектора flonum в машину с плавающей запятой
зарегистрироваться, добавить и снова сохранить.Нет необходимости во временном
коробочный flonum.

(Flo: векторный набор v 0 (flo: + (flo: vector-ref v 0) 1.2))
 

В следующем примере каждый раз, когда вызывается g , новая упаковка flonum
должен быть создан так, чтобы можно было вернуть действительный объект схемы. Если
г вызывается чаще, чем элементы v меняются
тогда обычный вектор может быть более эффективным.

(определите (g i)
  (Фло: вектор-ссылка v я))
 
Распространенные ошибки

Ловушка 1:
Убедитесь, что ваши литералы являются константами с плавающей запятой:

(определить (f1 a) (flo: + a 1))
(определить (f2 a) (flo: + a 1.))
 

f1 , скорее всего, вызовет аппаратную ошибку и обязательно даст
неправильный ответ. f2 правильный.

Ловушка 2:
Заманчиво вставить вызовы точный-> неточный для приведения значений
во флорумы. Это не всегда работает, потому что комплексные числа могут быть
точный или неточный тоже. Кроме того, текущая реализация
точный-> неточный медленный.

Ловушка 3:
При использовании стандартных математических процедур следует проявлять большую осторожность.Например, при вызове с помощью flonum и sqrt , и asin
может возвращать комплексное число (например, -1,5).


Перейти к первому, предыдущему, следующему, последнему разделу оглавления.

setuptools-scm · PyPI

setuptools_scm

setuptools_scm управляет версиями пакетов Python.
в метаданных SCM вместо объявления их в качестве аргумента версии
или в файле, управляемом SCM.

Дополнительно setuptools_scm предоставляет инструменты настройки со списком файлов, которыми управляет SCM.
(я.е. он автоматически добавляет все файлы, управляемые SCM, в sdist).
Нежелательные файлы необходимо исключить, удалив их через MANIFEST.in.

setuptools_scm из коробки поддерживает следующий scm:

использование pyproject.toml

Предпочтительный способ настройки setuptools_scm - автор
настройки в разделе tool.setuptools_scm файла pyproject.toml.

Для этой функции требуется Setuptools 42 или более поздняя версия, выпущенная в ноябре 2019 г.
Если ваш проект должен поддерживать сборку из sdist в более старых версиях
из Setuptools, вам также потребуется выполнить настройку.использование py
для этих устаревших сред.

Во-первых, убедитесь, что setuptools_scm присутствует во время проекта
build, указав его как одно из требований сборки.

 # pyproject.toml
[система сборки]
требует = ["setuptools> = 42", "wheel", "setuptools_scm [toml]> = 3.4"]
 

Обратите внимание, что дополнительно должен быть поставлен toml extra.

Этого будет достаточно, чтобы потребовать setuptools_scm для проектов
которые поддерживают PEP 518 (пункт и
pep517). Множество инструментов,
особенно те, которые вызывают настройку.ру по любой причине, может
продолжать полагаться на setup_requires. Для максимальной совместимости
с этим использованием рассмотрите также возможность включения директивы setup_requires
(описано ниже в разделах «Использование setup.py» и «setup.cfg»).

Чтобы включить вывод версии, добавьте этот раздел в свой pyproject.toml:

 # pyproject.toml
[tool.setuptools_scm]
 

В том числе этот раздел сопоставим с поставкой
use_scm_version = True в setup.py. Кроме того,
включить произвольные аргументы ключевого слова в этот раздел
передается в get_version ().Например:

 # pyproject.toml

[tool.setuptools_scm]
write_to = "pkg / version.py"
 

использование setup.py

Следующие настройки считаются устаревшими и
заменяется использованием pyproject.toml, но для максимального
совместимость, проекты также могут предоставлять конфигурацию в
это более старая форма.

Чтобы использовать setuptools_scm, просто измените файл setup.py вашего проекта.
как это:

  • Добавьте setuptools_scm в параметр setup_requires.
  • Добавьте параметр use_scm_version и установите для него значение True.

Например:

 из настройки импорта setuptools
настраивать(
    ...,
    use_scm_version = Верно,
    setup_requires = ['setuptools_scm'],
    ...,
)
 

Аргументы в get_version () (см. Ниже) могут быть переданы как словарь в
use_scm_version. Например:

 из настройки импорта setuptools
настраивать(
    ...,
    use_scm_version = {
        "корень": "..",
        "relative_to": __file__,
        "local_scheme": "узел и отметка времени"
    },
    setup_requires = ['setuptools_scm'],
    ...,
)
 

Вы можете подтвердить номер версии локально через setup.py:

 $ python setup.py --version
 

Примечание

Если вы видите необычные номера версий для пакетов, кроме python setup.py
--version сообщает ожидаемый номер версии, убедитесь, что [egg_info] установлен.
не определено в setup.cfg.

использование setup.cfg

При использовании setuptools 30.3.0
или выше, вы можете сохранить конфигурацию setup_requires в setup.cfg.
Однако use_scm_version все равно должен быть помещен в setup.ру. Например:

 # setup.py
из настройки импорта setuptools
настраивать(
    use_scm_version = Верно,
)
 
 # setup.cfg
[метаданные]
...

[опции]
setup_requires =
  setuptools_scm
...
 

Важно

Убедитесь, что ни параметр версии [метаданные], ни [egg_info]
секции определены, так как они будут мешать работе setuptools_scm.

Вам также может потребоваться определить файл pyproject.toml (PEP-0518), чтобы убедиться, что у вас есть необходимые
версия setuptools:

 # pyproject.Toml
[система сборки]
требует = ["setuptools> = 30.3.0", "wheel", "setuptools_scm"]
 

Дополнительную информацию см. В выпуске setuptools №1002.

Программное использование

Чтобы использовать setuptools_scm из кода, который находится на один каталог глубже
чем корень проекта, вы можете использовать:

 из setuptools_scm import get_version
версия = get_version (root = '..', relative_to = __ file__)
 

См. Выше в setup.py Использование этого параметра в setup.py.

Получение версии пакета во время выполнения

Если вы решили не жестко кодировать номер версии внутри пакета,
вы можете получить его во время выполнения из метаданных PEP-0566, используя
importlib.метаданные из стандартной библиотеки (добавлены в Python 3.8)
или бэкпорт importlib_metadata:

 из версии импорта importlib.metadata, PackageNotFoundError

пытаться:
    __version__ = версия ("имя-пакета")
кроме PackageNotFoundError:
    # пакет не установлен
    проходить
 

В качестве альтернативы вы можете использовать pkg_resources, который включен в
setuptools:

 из pkg_resources import get_distribution, DistributionNotFound

пытаться:
    __version__ = get_distribution ("имя-пакета").версия
кроме DistributionNotFound:
     # пакет не установлен
    проходить
 

Однако это накладывает зависимость среды выполнения от setuptools и может добавить до
несколько 100 мс накладных расходов на время импорта пакета.

Использование из Sphinx

Не рекомендуется использовать setuptools_scm из самого Sphinx,
вместо этого используйте pkg_resources после редактируемой / реальной установки:

 # содержимое docs / conf.py
из pkg_resources импортировать get_distribution
релиз = get_distribution ('мойпроект').версия
# например взять мажор / минор
версия = '.'. join (release.split ('.') [: 2])
 

Основная причина в том, что такие службы, как Read the Docs , иногда меняют
рабочий каталог по уважительным причинам и с использованием установленных метаданных
предотвращает использование там ненужных изменчивых данных.

Известные плагины

setuptools_scm_git_archive
Обеспечивает частичную поддержку получения версий из архивов git, которые
относятся к помеченным версиям. Единственная причина не включать его в
сам setuptools_scm - это Git / GitHub, не поддерживающий достаточные метаданные
для немаркированных / последующих коммитов, что мешает согласованному UX.

Схема управления версиями по умолчанию

В стандартной конфигурации setuptools_scm учитывает три вещи:

  1. последний тег (с номером версии)
  2. расстояние до этого тега (например, количество ревизий с момента последнего тега)
  3. состояние рабочего каталога (например, незафиксированные изменения с момента последнего тега)

и использует примерно следующую логику для рендеринга версии:

без расстояния и чисто:
{tag}
дальний и чистый:
{next_version}.dev {distance} + {scm letter} {хэш версии}
без расстояния и не чисто:
{tag} + dYYYYMMDD
дальний и не чистый:
{next_version} .dev {distance} + {scm letter} {хэш версии} .dYYYYMMDD

Следующая версия рассчитывается путем прибавления 1 к последнему числовому компоненту
тег.

Для проектов Git версия полагается на git describe,
так что вы увидите добавление g к хешу {revision hash}.

Семантическое управление версиями (SemVer)

Из-за поведения по умолчанию необходимо всегда включать
версия патча (3 в 1.2.3), или автоматическое угадывание
будет увеличивать неправильную часть SemVer (например, тег 2.0 приводит к
2.1.devX вместо 2.0.1.devX). Поэтому не забудьте пометить
соответственно.

Примечание

Будущие версии setuptools_scm по умолчанию переключатся на SemVer, скрывая старое поведение как
настраиваемый вариант.

Встроенные механизмы получения номеров версий

  1. сам SCM (git / hg)
  2. .hg_archival файлы (архивы Mercurial)
  3. PKG-INFO

Примечание

Архивы Git не поддерживаются из-за недостатков Git

Хук

File finders делает большую часть MANIFEST.в ненужном

setuptools_scm реализует file_finders
точка входа, которая возвращает все файлы, отслеживаемые вашим SCM. Это устраняет
необходимость создания MANIFEST.in вручную в большинстве случаев, когда это
потребуется, если не используется setuptools_scm, а именно:

  • Чтобы гарантировать, что все соответствующие файлы упакованы при запуске команды sdist.
  • При использовании include_package_data
    для включения данных пакета как части сборки или bdist_wheel.

МАНИФЕСТ.in все еще может использоваться: все, что там определено, отменяет ловушку.
Это в основном полезно для исключения файлов, отслеживаемых в вашем SCM, из пакетов,
хотя в принципе его можно использовать для явного включения не отслеживаемых файлов
тоже.

Параметры конфигурации

Чтобы настроить способ работы use_scm_version, вы можете предоставить
отображение с параметрами вместо логического значения.

В настоящее время поддерживаются следующие ключи конфигурации:

root:

Относительный путь к cwd, используемый для поиска корня SCM; по умолчанию.

version_scheme:

Настраивает способ построения локального номера версии; либо
имя точки входа или вызываемый.

local_scheme:

Настраивает создание локального компонента версии; либо
имя точки входа или вызываемый.

write_to:

Путь к файлу, который заменяется файлом, содержащим текущий
версия. Идеально подходит для создания версии.py файл в
пакет, обычно используемый, чтобы избежать использования pkg_resources.get_distribution
(что добавляет некоторые накладные расходы).

Предупреждение

Только файлы с расширениями .py и .txt имеют встроенную
шаблоны, для других типов файлов необходимо предоставить
write_to_template .

write_to_template:

Строка формата нового стиля, в которой текущая версия
аргумент ключевого слова версии для форматирования.

relative_to:

Файл, из которого можно определить корень.
Обычно вызывается скриптом или модулем, который не находится в корне
репозиторий, чтобы указать setuptools_scm в корне репозитория с помощью
поставка __file__.

tag_regex:
Строка регулярного выражения Python для извлечения части версии из любого тега SCM.

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

По умолчанию используется значение setuptools_scm.config.DEFAULT_TAG_REGEX
(см. config.py).

parentdir_prefix_version:

Если обычные методы определения версии (версия SCM,
sdist metadata) терпят неудачу, а имя родительского каталога начинается с
parentdir_prefix_version, то этот префикс удаляется, а остальная часть
имя родительского каталога сопоставляется с tag_regex, чтобы получить версию
нить. Если этот параметр не задан (по умолчанию), то этот запасной вариант
не используется.

Это предназначено для покрытия «архивов релизов» GitHub, которые распаковываются в
каталоги с именем projectname-tag / (в этом случае
parentdir_prefix_version может быть установлен, например к имени проекта-).

fallback_version:

Строка версии, которая будет использоваться, если нет другого метода для обнаружения
версия работала (например, при использовании тарбола без метаданных). Если это
unset (по умолчанию), setuptools_scm выдаст ошибку, если не обнаружит
версия.

parse:

Функция, которая будет использоваться вместо обнаруженного SCM для анализа
версия.
Используйте с осторожностью, это функция для расширенного использования, и вы должны быть
знакомы с внутренним устройством setuptools_scm, чтобы использовать его.

git_describe_command:

Эта команда будет использоваться вместо команды git description по умолчанию.
Используйте с осторожностью, это функция для расширенного использования, и вы должны
знаком с внутренним устройством setuptools_scm, чтобы использовать его.

По умолчанию используется значение, установленное setuptools_scm.git.DEFAULT_DESCRIBE
(см. git.py).

Чтобы использовать setuptools_scm в другом коде Python, вы можете использовать get_version
функция:

 из setuptools_scm import get_version
my_version = get_version ()
 

Опционально принимает ключи параметра use_scm_version как
аргументы ключевого слова.

Пример конфигурации в формате setup.py:

 из настройки импорта setuptools

настраивать(
    use_scm_version = {
        'write_to': 'версия.\ +] +) (? P <суффикс>. *)? $ ',
    }
)
 

Переменные среды

SETUPTOOLS_SCM_PRETEND_VERSION:

если задано и не пусто,
он используется в качестве основного источника для номера версии
в этом случае это будет неанализируемая строка

SETUPTOOLS_SCM_PRETEND_VERSION_FOR _ $ {UPPERCASED_DIST_NAME}:

если задано и не пусто,
он используется в качестве основного источника для номера версии
в этом случае это будет неанализируемая строка

имеет приоритет над SETUPTOOLS_SCM_PRETEND_VERSION

SETUPTOOLS_SCM_DEBUG:

если определено и не пусто,
много отладочной информации будет напечатано как часть setuptools_scm
операционная

SOURCE_DATE_EPOCH:

, если определено, используется в качестве метки времени, с которой
локальные части node-and-date и node-and-timestamp
производный, в противном случае используется текущее время
(https: // воспроизводимые сборки.org / docs / source-date-epoch /)

SETUPTOOLS_SCM_IGNORE_VCS_ROOTS:

, если определено, список, разделенный os.pathsep
имен каталогов, игнорируемых для поиска корня

Кодекс поведения

У всех, кто взаимодействует с кодовыми базами проекта setuptools_scm, возникает проблема
трекеры, чаты и списки рассылки должны следовать
Кодекс поведения PSF.

Руководство по процессу компиляции CHICKEN

Руководство по процессу компиляции CHICKEN

Этот документ описывает процесс компиляции, используемый компилятором схемы CHICKEN в C, объясняя различные этапы компиляции на простом примере программы.

CHICKEN использует стратегию компиляции под названием Cheney-on-the-MTA по статье Генри Бейкера [1]. Основная идея довольно проста: скомпилировать схему на C, сначала преобразовав программу в Continuation Passing Style (CPS), а затем напрямую сгенерировать код C в CPS как функции, которые никогда не возвращаются и вместо этого вызывают запись продолжения, выделенную стеком (что также содержит указатель на код процедуры продолжения). Распределение выполняется просто путем создания структур данных в стеке - поскольку функции никогда не возвращаются, выделенные данные останутся «живыми».Поскольку при этом кадры стека будут накапливаться бесконечно, указатель стека регулярно проверяется (в настоящее время для каждой записи функции), достигается ли заранее определенный предел, и как только предел превышен, текущие аргументы и продолжение сохраняются, а все живые данные копируется в кучу (фактически второе поколение кучи в схеме генерации мусора). Это копирование пересекает все данные, которые могут быть достигнуты из текущего динамического состояния программы (которое является просто продолжением, аргументы, переданные в текущую процедуру, плюс текущее закрытие).Недоступные данные никогда не обрабатываются, и поэтому время, необходимое для копирования, пропорционально количеству текущих данных в стеке.

Распределение может быть чрезвычайно быстрым, поскольку мы в принципе можем использовать указатель стека машины как специальный регистр указателя распределения. Еще одно преимущество состоит в том, что благодаря преобразованию CPS (в сочетании с представлением замыкания плоского ) сохраняется минимум мусора: только данные в свободных переменных, которые гарантированно будут использоваться, сохраняются в записях замыкания продолжения на уровне подпроцедур.Поскольку продолжения являются явными и неотъемлемыми для этой стратегии, код, который сильно использует продолжения, не снижает производительности. Это особенно важно, когда потоки реализуются поверх продолжений.

Недостатком является то, что происходит много распределений и что представление CPS накладывает определенные ограничения на взаимодействие с внешним кодом (особенно когда задействованы обратные вызовы).

Хорошо, начнем с примера: хорошо известная проблема N-ферзей .Мы представляем код в том виде, в каком он преобразован на различных этапах компиляции:

Источник

( определить  (nqueens n)

  ( определить  (десятичное число)
    ( пусть   петля  ((i n) (l '()))
      (, если  (= i 0) l ( петля  (- i 1) (cons i l)))))

  ( определить  (попробуйте x y z)
    (, если  (ноль? X)
      (, если  (null? Y)
        1
        0)
      (+ (, если  (хорошо? (Автомобиль x) 1 z)
           (попробуйте (добавить (cdr x) y) '() (cons (car x) z))
           0)
         (попробуйте (cdr x) (cons (car x) y) z))))

  ( определить  (хорошо? Расстояние между строками)
    (, если  (ноль? Размещен)
      #t
      (и (not (= (машина размещена) (+ расстояние ряда)))
           (not (= (машина размещена) (- расстояние ряда)))
           (ок? row (+ dist 1) (cdr размещен)))))

  (попробуйте (dec-to n) '()' ()))

(nqueens 8) 

канонизированный

Сначала идет канонизация , что означает расширение макросов и некоторую базовую нормализацию исходного кода.Получите этот вывод с помощью csc -debug 2:

 (## core # callunit "библиотека")
(## core # callunit "eval")
(## core # callunit "дополнительные")
(## core # undefined)
(## core # undefined)
(установить! nqueens
  ( лямбда  (n0)
    ( let  ((dec-to1 (## core # undefined))
          (try2 (## core # undefined))
          (ок? 3 (## core # undefined)))
      ( let  ((t15 (set! Dec-to1
                   ( лямбда  (n4)
                     (## core # app
                       ( пусть  ((loop5 (## core # undefined)))
                         ( пусть  ((t8 (set! Loop5
                                     ( лямбда  (i6 l7)
                                       (, если  (= i6 '0) l7 (loop5 (- i6' 1) (cons i6 l7)))))))
                           ( пусть  () loop5)))
                       n4
                       '())))))
        ( let  ((t16 (set! Try2
                     ( лямбда  (x9 y10 z11)
                       (, если  (ноль? X9)
                         (, если  (null? Y10) '1' 0)
                         (+ (, если  (хорошо? 3 (автомобиль x9) '1 z11)
                              (попробуйте2 (добавить (cdr x9) y10)
                                    '()
                                    (минусы (машина x9) z11))
                              '0)
                            (попробуйте2 (cdr x9) (cons (car x9) y10) z11)))))))
          ( let  ((t17 (set! Ok? 3
                       ( лямбда  (row12 dist13 размещено14)
                         (, если  (ноль? Размещен14)
                           '#t
                           (, если  (not (= (автомобиль размещен14) (+ row12 dist13)))
                             (, если  (not (= (автомобиль размещен14) (- row12 dist13)))
                               (ок? 3 row12 (+ dist13 '1) (cdr размещен14))
                               '#f)
                             '#f))))))
            (попробуйте2 (dec-to1 n0) '()' ())))))))
(8 королев)
((## sys # неявный обработчик выхода))
(## core # undefined) 

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

CPS преобразовано

Следующим шагом является преобразование в CPS - вы видите, что это генерирует довольно много кода - код был немного переформатирован, чтобы поместиться на этой странице. Обратите внимание, что компилятор теперь работает с абстрактным синтаксическим деревом, нотацию s-выражения можно восстановить, введя csc -debug 3:

 ( лямбда  (k26)
  ( пусть  ((k27 (## core # lambda (r28)
  ( лет  ((t19 r28))
  ( пусть  ((k30 (## core # lambda (r31)
  ( лет  ((t20 r31))
  ( let  ((k33 (## core # lambda (r34)
  ( лет  ((t21 r34))
  ( let  ((t36 (set! Nqueens
  ( лямбда  (k38 n0)
  ( пусть  ((dec-to1 (## core # undefined)))
  ( пусть  ((try2 (## core # undefined)))
  ( пусть  ((ок? 3 (## core # undefined)))
  ( let  ((t39 (set! Dec-to1
  ( лямбда  (k41 n4)
  ( пусть  ((k42 (## core # lambda (r43) (k41 r43))))
  ( пусть  ((loop5 (## core # undefined)))
  ( пусть  ((t45 (set! Loop5
  ( лямбда  (k47 i6 l7)
  ( пусть  ((k48 (## core # lambda (r49) (k47 r49))))
  ( let  ((k51 (## core # lambda (r52)
  (, если  r52
  (k48 l7)
  ( пусть  ((k54 (## core # lambda (r55) (k48 r55))))
  ( пусть  ((k58 (## core # lambda (r59)
  ( лет  ((a57 r59))
  ( let  ((k62 (## core # lambda (r63)
  ( пусть  ((a61 r63)) (loop5 k54 a57 a61)))))
  (минусы к62 i6 l7))))))
  (- k58 i6 '1)))))))
  (= k51 i6 '0)))))))
  ( пусть  ((t8 t45)) (loop5 k42 n4 '())))))))))
  ( лет  ((t15 t39))
  ( let  ((t65 (set! Try2
  ( лямбда  (k67 x9 y10 z11)
  ( пусть  ((k68 (## core # lambda (r69) (k67 r69))))
  ( пусть  ((k71 (## core # lambda (r72)
  (, если  r72
  ( пусть  ((k74 (## core # lambda (r75) (k68 r75))))
  ( пусть  ((k77 (## core # lambda (r78) ( if  r78 (k74 '1) (k74' 0)))))
  (null? k77 y10)))
  ( пусть  ((k80 (## core # lambda (r81) (k68 r81))))
  ( let  ((k84 (## core # lambda (r85)
  ( лет  ((a83 r85))
  ( пусть  ((k88 (## core # lambda (r89)
  ( пусть  ((a87 r89)) (+ k80 a83 a87)))))
  ( пусть  ((k92 (## core # lambda (r93)
  ( лет  ((a91 r93))
  ( let  ((k96 (## core # lambda (r97)
  ( пусть  ((a95 r97)) (try2 k88 a91 a95 z11)))))
  ( let  ((k100 (## core # lambda (r101)
  ( пусть  ((a99 r101)) (cons k96 a99 y10)))))
  (машина к100 х9)))))))
  (cdr k92 x9)))))))
  ( let  ((k103 (## core # lambda (r104)
  (, если  r104
  ( пусть  ((k106 (## core # lambda (r107) (k84 r107))))
  ( пусть  ((k110 (## core # lambda (r111)
  ( лет  ((a109 r111))
  ( let  ((k114 (## core # lambda (r115)
  ( пусть  ((a113 r115)) (try2 k106 a109 '() a113)))))
  ( let  ((k118 (## core # lambda (r119)
  ( пусть  ((a117 r119)) (cons k114 a117 z11)))))
  (машина к118 х9)))))))
  ( let  ((k122 (## core # lambda (r123)
  ( пусть  ((a121 r123)) (добавить k110 a121 y10)))))
  (cdr k122 x9))))
  (k84 '0)))))
  ( let  ((k126 (## core # lambda (r127)
  ( пусть  ((a125 r127)) (ок? 3 k103 a125 '1 z11)))))
  (машина к126 х9)))))))))
  (ноль? к71 х9)))))))
  ( лет  ((t16 t65))
  ( let  ((t129 (set! Ok? 3
  ( лямбда  (k131 row12 dist13 размещено14)
  ( пусть  ((k132 (## core # lambda (r133) (k131 r133))))
  ( let  ((k135 (## core # lambda (r136)
  (, если  r136
  (k132 '#t)
  ( пусть  ((k138 (## core # lambda (r139) (k132 r139))))
  ( let  ((k141 (## core # lambda (r142)
  (, если  r142
  ( пусть  ((k144 (## core # lambda (r145) (k138 r145))))
  ( let  ((k147 (## core # lambda (r148)
  (, если  r148
  ( пусть  ((k150 (## core # lambda (r151) (k144 r151))))
  ( let  ((k154 (## core # lambda (r155)
  ( лет  ((a153 r155))
  ( let  ((k158 (## core # lambda (r159)
  ( пусть  ((a157 r159)) (ок? 3 k150 row12 a153 a157)))))
  (cdr k158 размещен14))))))
  (+ k154 dist13 '1)))
  (k144 '#f)))))
  ( let  ((k162 (## core # lambda (r163)
  ( пусть  ((a161 r163)) (не k147 a161)))))
  ( let  ((k166 (## core # lambda (r167)
  ( лет  ((a165 r167))
  ( let  ((k170 (## core # lambda (r171)
  ( пусть  ((a169 r171)) (= k162 a165 a169)))))
  (- k170 row12 dist13))))))
  (машина к166 поставлена14)))))
  (k138 '#f)))))
  ( let  ((k174 (## core # lambda (r175)
  ( пусть  ((a173 r175)) (не k141 a173)))))
  ( let  ((k178 (## core # lambda (r179)
  ( лет  ((a177 r179))
  ( let  ((k182 (## core # lambda (r183)
  ( пусть  ((a181 r183)) (= k174 a177 a181)))))
  (+ k182 row12 dist13))))))
  (машина к178 поставлена14)))))))))
  (null? k135 размещено14)))))))
  ( лет  ((t17 t129))
  ( пусть  ((k185 (## core # lambda (r186) (k38 r186))))
  ( let  ((k189 (## core # lambda (r190)
  ( пусть  ((a188 r190)) (try2 k185 a188 '()' ())))))
  (dec-to1 k189 n0))))))))))))))))
  ( лет  ((t22 t36))
  ( let  ((k192 (## core # lambda (r193)
  ( лет  ((t23 r193))
  ( let  ((k195 (## core # lambda (r196)
  ( пусть  ((t24 r196)) (k26 (## core # undefined))))))
  ( пусть  ((k198 (## core # lambda (r199) (r199 k195))))
  (## sys # неявный обработчик выхода k198)))))))
  (nqueens k192 '8))))))))
  (## core # callunit "extras" k33))))))
  (## core # callunit "eval" k30))))))
  (## core # callunit "библиотека" k27))) 

## core # lambda относится к лямбда-формам, введенным преобразованием CPS.## core # undefined - это внутренний вариант void.

Оптимизация (1)

Оптимизация теперь выполняется итеративно до тех пор, пока программа не станет стабильной: два вхождения not были удалены путем обмена ветвями условного оператора (if).

 ( лямбда  (k26)
  ( пусть  ((k27 (## core # lambda (r28)
  ( лет  ((t19 r28))
  ( пусть  ((k30 (## core # lambda (r31)
  ( лет  ((t20 r31))
  ( let  ((k33 (## core # lambda (r34)
  ( лет  ((t21 r34))
  ( let  ((t36 (set! Nqueens
  ( лямбда  (k38 n0)
  ( пусть  ((dec-to1 (## core # undefined)))
  ( пусть  ((try2 (## core # undefined)))
  ( пусть  ((ок? 3 (## core # undefined)))
  ( let  ((t39 (set! Dec-to1
  ( лямбда  (k41 n4)
  ( пусть  ((k42 (## core # lambda (r43) (k41 r43))))
  ( пусть  ((loop5 (## core # undefined)))
  ( пусть  ((t45 (set! Loop5
  ( лямбда  (k47 i6 l7)
  ( пусть  ((k48 (## core # lambda (r49) (k47 r49))))
  ( let  ((k51 (## core # lambda (r52)
  (, если  r52
  (k48 l7)
  ( пусть  ((k54 (## core # lambda (r55) (k48 r55))))
  ( пусть  ((k58 (## core # lambda (r59)
  ( лет  ((a57 r59))
  ( let  ((k62 (## core # lambda (r63)
  ( пусть  ((a61 r63)) (loop5 k54 a57 a61)))))
  (минусы к62 i6 l7))))))
  (- k58 i6 '1)))))))
  (= k51 i6 '0)))))))
  ( пусть  ((t8 t45)) (loop5 k42 n4 '())))))))))
  ( лет  ((t15 t39))
  ( let  ((t65 (set! Try2
  ( лямбда  (k67 x9 y10 z11)
  ( пусть  ((k68 (## core # lambda (r69) (k67 r69))))
  ( пусть  ((k71 (## core # lambda (r72)
  (, если  r72
  ( пусть  ((k74 (## core # lambda (r75) (k68 r75))))
  ( пусть  ((k77 (## core # lambda (r78) ( if  r78 (k74 '1) (k74' 0)))))
  (null? k77 y10)))
  ( пусть  ((k80 (## core # lambda (r81) (k68 r81))))
  ( let  ((k84 (## core # lambda (r85)
  ( лет  ((a83 r85))
  ( пусть  ((k88 (## core # lambda (r89)
  ( пусть  ((a87 r89)) (+ k80 a83 a87)))))
  ( пусть  ((k92 (## core # lambda (r93)
  ( лет  ((a91 r93))
  ( let  ((k96 (## core # lambda (r97)
  ( пусть  ((a95 r97)) (try2 k88 a91 a95 z11)))))
  ( let  ((k100 (## core # lambda (r101)
  ( пусть  ((a99 r101)) (cons k96 a99 y10)))))
  (машина к100 х9)))))))
  (cdr k92 x9)))))))
  ( let  ((k103 (## core # lambda (r104)
  (, если  r104
  ( пусть  ((k106 (## core # lambda (r107) (k84 r107))))
  ( пусть  ((k110 (## core # lambda (r111)
  ( лет  ((a109 r111))
  ( let  ((k114 (## core # lambda (r115)
  ( пусть  ((a113 r115)) (try2 k106 a109 '() a113)))))
  ( let  ((k118 (## core # lambda (r119)
  ( пусть  ((a117 r119)) (cons k114 a117 z11)))))
  (машина к118 х9)))))))
  ( let  ((k122 (## core # lambda (r123)
  ( пусть  ((a121 r123)) (добавить k110 a121 y10)))))
  (cdr k122 x9))))
  (k84 '0)))))
  ( let  ((k126 (## core # lambda (r127)
  ( пусть  ((a125 r127)) (ок? 3 k103 a125 '1 z11)))))
  (машина к126 х9)))))))))
  (ноль? к71 х9)))))))
  ( лет  ((t16 t65))
  ( let  ((t129 (set! Ok? 3
  ( лямбда  (k131 row12 dist13 размещено14)
  ( пусть  ((k132 (## core # lambda (r133) (k131 r133))))
  ( let  ((k135 (## core # lambda (r136)
  (, если  r136
  (k132 '#t)
  ( пусть  ((k138 (## core # lambda (r139) (k132 r139))))
  ( let  ((k141 (## core # lambda (r142)
  (, если  r142
  (k138 '#f)
  ( пусть  ((k144 (## core # lambda (r145) (k138 r145))))
  ( let  ((k147 (## core # lambda (r148)
  (, если  r148
  (k144 '#f)
  ( пусть  ((k150 (## core # lambda (r151) (k144 r151))))
  ( let  ((k154 (## core # lambda (r155)
  ( лет  ((a153 r155))
  ( let  ((k158 (## core # lambda (r159)
  ( пусть  ((a157 r159)) (ок? 3 k150 row12 a153 a157)))))
  (cdr k158 размещен14))))))
  (+ k154 dist13 '1)))))))
  ( let  ((k162 (## core # lambda (r163)
  ( пусть  ((a161 r163)) (k147 a161)))))
  ( let  ((k166 (## core # lambda (r167)
  ( лет  ((a165 r167))
  ( let  ((k170 (## core # lambda (r171)
  ( пусть  ((a169 r171)) (= k162 a165 a169)))))
  (- k170 row12 dist13))))))
  (машина к166 поставлена14)))))))))
  ( let  ((k174 (## core # lambda (r175)
  ( пусть  ((a173 r175)) (k141 a173)))))
  ( let  ((k178 (## core # lambda (r179)
  ( лет  ((a177 r179))
  ( let  ((k182 (## core # lambda (r183)
  ( пусть  ((a181 r183)) (= k174 a177 a181)))))
  (+ k182 row12 dist13))))))
  (машина к178 поставлена14)))))))))
  (null? k135 размещено14)))))))
  ( лет  ((t17 t129))
  ( пусть  ((k185 (## core # lambda (r186) (k38 r186))))
  ( let  ((k189 (## core # lambda (r190)
  ( пусть  ((a188 r190)) (try2 k185 a188 '()' ())))))
  (dec-to1 k189 n0))))))))))))))))
  ( лет  ((t22 t36))
  ( let  ((k192 (## core # lambda (r193)
  ( лет  ((t23 r193))
  ( let  ((k195 (## core # lambda (r196)
  ( пусть  ((t24 r196)) (k26 (## core # undefined))))))
  ( пусть  ((k198 (## core # lambda (r199) (r199 k195))))
  (## sys # неявный обработчик выхода k198)))))))
  (nqueens k192 '8))))))))
  (## core # callunit "extras" k33))))))
  (## core # callunit "eval" k30))))))
  (## core # callunit "библиотека" k27))) 

Оптимизация (2)

Следующий раунд.На этот раз k141, k147 и dec-to1 были сужены , что означает встраивание процедур, которые вызываются только один раз (оптимизация, которая гарантирует, что программа не будет расти). Некоторые переменные и привязки были удалены, поскольку они не нужны:

 ( лямбда  (k26)
  ( пусть  ((k27 (## core # lambda (r28)
  ( пусть  ((k30 (## core # lambda (r31)
  ( let  ((k33 (## core # lambda (r34)
  ( let  ((t36 (set! Nqueens
  ( лямбда  (k38 n0)
  ( пусть  ((try2 (## core # undefined)))
  ( пусть  ((ок? 3 (## core # undefined)))
  ( пусть  ((t39 (## core # undefined)))
  ( let  ((t65 (set! Try2
  ( лямбда  (k67 x9 y10 z11)
  ( пусть  ((k71 (## core # lambda (r72)
  (, если  r72
  ( пусть  ((k77 (## core # lambda (r78) ( if  r78 (k67 '1) (k67' 0)))))
  (null? k77 y10))
  ( let  ((k84 (## core # lambda (r85)
  ( пусть  ((k88 (## core # lambda (r89) (+ k67 r85 r89))))
  ( пусть  ((k92 (## core # lambda (r93)
  ( пусть  ((k96 (## core # lambda (r97) (try2 k88 r93 r97 z11))))
  ( пусть  ((k100 (## core # lambda (r101) (cons k96 r101 y10))))
  (машина к100 х9))))))
  (cdr k92 x9))))))
  ( let  ((k103 (## core # lambda (r104)
  (, если  r104
  ( пусть  ((k110 (## core # lambda (r111)
  ( пусть  ((k114 (## core # lambda (r115) (try2 k84 r111 '() r115))))
  ( пусть  ((k118 (## core # lambda (r119) (cons k114 r119 z11))))
  (машина к118 х9))))))
  ( let  ((k122 (## core # lambda (r123) (добавить k110 r123 y10))))
  (cdr k122 x9)))
  (k84 '0)))))
  ( пусть  ((k126 (## core # lambda (r127) (ok? 3 k103 r127 '1 z11))))
  (машина к126 х9))))))))
  (ноль? к71 х9))))))
  ( let  ((t129 (set! Ok? 3
  ( лямбда  (k131 row12 dist13 размещено14)
  ( let  ((k135 (## core # lambda (r136)
  (, если  r136
  (k131 '#t)
  ( let  ((k174 (## core # lambda (r175)
  ( лет  ((r142 r175))
  (, если  r142
  (k131 '#f)
  ( let  ((k162 (## core # lambda (r163)
  ( лет  ((r148 r163))
  (, если  r148
  (k131 '#f)
  ( let  ((k154 (## core # lambda (r155)
  ( let  ((k158 (## core # lambda (r159)
  (ок? 3 k131 row12 r155 r159))))
  (cdr k158 размещен14)))))
  (+ k154 dist13 '1)))))))
  ( let  ((k166 (## core # lambda (r167)
  ( пусть  ((k170 (## core # lambda (r171) (= k162 r167 r171))))
  (- k170 row12 dist13)))))
  (машина к166 поставлена14))))))))
  ( let  ((k178 (## core # lambda (r179)
  ( пусть  ((k182 (## core # lambda (r183) (= k174 r179 r183))))
  (+ k182 row12 dist13)))))
  (машина к178 поставлена14)))))))
  (null? k135 размещен14))))))
  ( пусть  ((k189 (## core # lambda (r190) (try2 k38 r190 '()' ()))))
  ( лет  ((k41 k189))
  ( лет  ((n4 n0))
  ( пусть  ((loop5 (## core # undefined)))
  ( пусть  ((t45 (set! Loop5
  ( лямбда  (k47 i6 l7)
  ( let  ((k51 (## core # lambda (r52)
  (, если  r52
  (k47 l7)
  ( пусть  ((k58 (## core # lambda (r59)
  ( пусть  ((k62 (## core # lambda (r63) (loop5 k47 r59 r63))))
  (минусы к62 i6 l7)))))
  (- k58 i6 '1))))))
  (= k51 i6 '0))))))
  (loop5 k41 n4 '())))))))))))))))
  ( let  ((k192 (## core # lambda (r193)
  ( пусть  ((k195 (## core # lambda (r196) (k26 (## core # undefined)))))
  ( пусть  ((k198 (## core # lambda (r199) (r199 k195))))
  (## sys # неявный обработчик выхода k198))))))
  (nqueens k192 '8))))))
  (## core # callunit "extras" k33)))))
  (## core # callunit "eval" k30)))))
  (## core # callunit "библиотека" k27))) 

Оптимизация (3)

Больше исключений локальных переменных:

 ( лямбда  (k26)
  ( пусть  ((k27 (## core # lambda (r28)
  ( пусть  ((k30 (## core # lambda (r31)
  ( let  ((k33 (## core # lambda (r34)
  ( let  ((t36 (set! Nqueens
  ( лямбда  (k38 n0)
  ( пусть  ((try2 (## core # undefined)))
  ( пусть  ((ок? 3 (## core # undefined)))
  ( let  ((t65 (set! Try2
  ( лямбда  (k67 x9 y10 z11)
  ( пусть  ((k71 (## core # lambda (r72)
  (, если  r72
  ( пусть  ((k77 (## core # lambda (r78) ( if  r78 (k67 '1) (k67' 0)))))
  (null? k77 y10))
  ( let  ((k84 (## core # lambda (r85)
  ( пусть  ((k88 (## core # lambda (r89) (+ k67 r85 r89))))
  ( пусть  ((k92 (## core # lambda (r93)
  ( пусть  ((k96 (## core # lambda (r97) (try2 k88 r93 r97 z11))))
  ( пусть  ((k100 (## core # lambda (r101) (cons k96 r101 y10))))
  (машина к100 х9))))))
  (cdr k92 x9))))))
  ( let  ((k103 (## core # lambda (r104)
  (, если  r104
  ( пусть  ((k110 (## core # lambda (r111)
  ( пусть  ((k114 (## core # lambda (r115) (try2 k84 r111 '() r115))))
  ( пусть  ((k118 (## core # lambda (r119) (cons k114 r119 z11))))
  (машина к118 х9))))))
  ( let  ((k122 (## core # lambda (r123) (добавить k110 r123 y10))))
  (cdr k122 x9)))
  (k84 '0)))))
  ( пусть  ((k126 (## core # lambda (r127) (ok? 3 k103 r127 '1 z11))))
  (машина к126 х9))))))))
  (ноль? к71 х9))))))
  ( let  ((t129 (set! Ok? 3
  ( лямбда  (k131 row12 dist13 размещено14)
  ( let  ((k135 (## core # lambda (r136)
  (, если  r136
  (k131 '#t)
  ( let  ((k174 (## core # lambda (r175)
  ( если  r175
  (k131 '#f)
  ( let  ((k162 (## core # lambda (r163)
  (, если  r163
  (k131 '#f)
  ( let  ((k154 (## core # lambda (r155)
  ( let  ((k158 (## core # lambda (r159)
  (ок? 3 k131 row12 r155 r159))))
  (cdr k158 размещен14)))))
  (+ k154 dist13 '1))))))
  ( let  ((k166 (## core # lambda (r167)
  ( пусть  ((k170 (## core # lambda (r171) (= k162 r167 r171))))
  (- k170 row12 dist13)))))
  (машина к166 поставлена14)))))))
  ( let  ((k178 (## core # lambda (r179)
  ( пусть  ((k182 (## core # lambda (r183) (= k174 r179 r183))))
  (+ k182 row12 dist13)))))
  (машина к178 поставлена14)))))))
  (null? k135 размещено14))))))
  ( пусть  ((k189 (## core # lambda (r190) (try2 k38 r190 '()' ()))))
  ( пусть  ((loop5 (## core # undefined)))
  ( пусть  ((t45 (set! Loop5
  ( лямбда  (k47 i6 l7)
  ( let  ((k51 (## core # lambda (r52)
  (, если  r52
  (k47 l7)
  ( пусть  ((k58 (## core # lambda (r59)
  ( пусть  ((k62 (## core # lambda (r63) (loop5 k47 r59 r63))))
  (минусы к62 i6 l7)))))
  (- k58 i6 '1))))))
  (= k51 i6 '0))))))
  (loop5 k189 n0 '()))))))))))))
  ( let  ((k192 (## core # lambda (r193)
  ( пусть  ((k195 (## core # lambda (r196) (k26 (## core # undefined)))))
  ( пусть  ((k198 (## core # lambda (r199) (r199 k195))))
  (## sys # неявный обработчик выхода k198))))))
  (nqueens k192 '8))))))
  (## core # callunit "extras" k33)))))
  (## core # callunit "eval" k30)))))
  (## core # callunit "библиотека" k27))) 

Оптимизация (4)

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

 ( лямбда  (k26)
  ( пусть  ((k27 (## core # lambda (r28)
  ( пусть  ((k30 (## core # lambda (r31)
  ( let  ((k33 (## core # lambda (r34)
  ( let  ((t36 (set! Nqueens
  ( лямбда  (k38 n0)
  ( пусть  ((try2 (## core # undefined)))
  ( пусть  ((ок? 3 (## core # undefined)))
  ( let  ((t65 (set! Try2
  ( лямбда  (k67 x9 y10 z11)
  ( пусть  ((k71 (## core # lambda (r72)
  (, если  r72
  ( let  ((k77 (## core # lambda (r78)
  (k67 (## core # cond r78 '1' 0)))))
  (k77 (## core # inline "C_i_nullp" y10)))
  ( let  ((k84 (## core # lambda (r85)
  ( пусть  ((k88 (## core # lambda (r89)
  (k67 (## core # inline_allocate "C_a_i_plus" 4 r85 r89)))))
  ( пусть  ((k92 (## core # lambda (r93)
  ( пусть  ((k96 (## core # lambda (r97) (try2 k88 r93 r97 z11))))
  ( let  ((k100 (## core # lambda (r101)
  (k96 (## core # inline_allocate "C_a_i_cons" 3 r101 y10)))))
  (k100 (## core # inline "C_i_car" x9)))))))
  (k92 (## core # inline "C_i_cdr" x9)))))))
  ( let  ((k103 (## core # lambda (r104)
  (, если  r104
  ( пусть  ((k110 (## core # lambda (r111)
  ( пусть  ((k114 (## core # lambda (r115) (try2 k84 r111 '() r115))))
  ( let  ((k118 (## core # lambda (r119)
  (k114 (## core # inline_allocate "C_a_i_cons" 3 r119 z11)))))
  (k118 (## core # inline "C_i_car" x9)))))))
  ( let  ((k122 (## core # lambda (r123) (добавить k110 r123 y10))))
  (k122 (## core # inline "C_i_cdr" x9))))
  (k84 '0)))))
  ( пусть  ((k126 (## core # lambda (r127) (ok? 3 k103 r127 '1 z11))))
  (k126 (## core # inline "C_i_car" x9)))))))))
  (k71 (## core # inline "C_i_nullp" x9)))))))
  ( let  ((t129 (set! Ok? 3
  ( лямбда  (k131 row12 dist13 размещено14)
  ( let  ((k135 (## core # lambda (r136)
  (, если  r136
  (k131 '#t)
  ( let  ((k174 (## core # lambda (r175)
  ( если  r175
  (k131 '#f)
  ( let  ((k162 (## core # lambda (r163)
  (, если  r163
  (k131 '#f)
  ( let  ((k154 (## core # lambda (r155)
  ( let  ((k158 (## core # lambda (r159)
  (ок? 3 k131 row12 r155 r159))))
  (k158 (## core # inline "C_i_cdr" размещен14))))))
  (k154 (## core # inline_allocate "C_a_i_plus" 4 dist13 '1)))))))
  ( let  ((k166 (## core # lambda (r167)
  ( let  ((k170 (## core # lambda (r171)
  (k162 (## core # inline "C_i_nequalp" r167 r171)))))
  (k170 (## core # inline_allocate "C_a_i_minus" 4 row12 dist13))))))
  (k166 (## core # inline "C_i_car" размещен14))))))))
  ( let  ((k178 (## core # lambda (r179)
  ( let  ((k182 (## core # lambda (r183)
  (k174 (## core # inline "C_i_nequalp" r179 r183)))))
  (k182 (## core # inline_allocate "C_a_i_plus" 4 row12 dist13))))))
  (k178 (## core # inline "C_i_car" размещен14))))))))
  (k135 (## core # inline "C_i_nullp" размещен14)))))))
  ( пусть  ((k189 (## core # lambda (r190) (try2 k38 r190 '()' ()))))
  ( пусть  ((loop5 (## core # undefined)))
  ( пусть  ((t45 (set! Loop5
  ( лямбда  (k47 i6 l7)
  ( let  ((k51 (## core # lambda (r52)
  (, если  r52
  (k47 l7)
  ( пусть  ((k58 (## core # lambda (r59)
  ( пусть  ((k62 (## core # lambda (r63) (loop5 k47 r59 r63))))
  (k62 (## core # inline_allocate "C_a_i_cons" 3 i6 l7))))))
  (k58 (## core # inline_allocate "C_a_i_minus" 4 i6 '1)))))))
  (k51 (## core # inline "C_i_nequalp" i6 '0)))))))
  (loop5 k189 n0 '()))))))))))))
  ( let  ((k192 (## core # lambda (r193)
  ( пусть  ((k195 (## core # lambda (r196) (k26 (## core # undefined)))))
  ( пусть  ((k198 (## core # lambda (r199) (r199 k195))))
  (## sys # неявный обработчик выхода k198))))))
  (nqueens k192 '8))))))
  (## core # callunit "extras" k33)))))
  (## core # callunit "eval" k30)))))
  (## core # callunit "библиотека" k27))) 

Оптимизация (5)

Дополнительные сокращения, которые теперь были разрешены предыдущими оптимизациями, кроме того, некоторые привязки могут быть удалены:

 ( лямбда  (k26)
  ( пусть  ((k27 (## core # lambda (r28)
  ( пусть  ((k30 (## core # lambda (r31)
  ( let  ((k33 (## core # lambda (r34)
  ( let  ((t36 (set! Nqueens
  ( лямбда  (k38 n0)
  ( пусть  ((try2 (## core # undefined)))
  ( пусть  ((ок? 3 (## core # undefined)))
  ( let  ((t65 (set! Try2
  ( лямбда  (k67 x9 y10 z11)
  (, если  (## core # inline "C_i_nullp" x9)
  ( let  ((r78 (## core # inline "C_i_nullp" y10)))
  (k67 (## core # cond r78 '1' 0)))
  ( let  ((k84 (## core # lambda (r85)
  ( пусть  ((k88 (## core # lambda (r89)
  (k67 (## core # inline_allocate "C_a_i_plus" 4 r85 r89)))))
  ( пусть  ((r93 (## core # inline "C_i_cdr" x9)))
  ( let  ((r101 (## core # inline "C_i_car" x9)))
  ( let  ((r97 (## core # inline_allocate "C_a_i_cons" 3 r101 y10)))
  (попробуй2 k88 r93 r97 z11))))))))
  ( let  ((k103 (## core # lambda (r104)
  (, если  r104
  ( пусть  ((k110 (## core # lambda (r111)
  ( let  ((r119 (## core # inline "C_i_car" x9)))
  ( let  ((r115 (## core # inline_allocate "C_a_i_cons" 3 r119 z11)))
  (попробуйте2 k84 r111 '() r115))))))
  ( пусть  ((r123 (## core # inline "C_i_cdr" x9)))
  (добавить k110 r123 y10)))
  (k84 '0)))))
  ( let  ((r127 (## core # inline "C_i_car" x9)))
  (ок? 3 k103 r127 '1 z11)))))))))
  ( let  ((t129 (set! Ok? 3
  ( лямбда  (k131 row12 dist13 размещено14)
  (, если  (размещено ## core # inline "C_i_nullp" 14)
  (k131 '#t)
  ( let  ((r179 (## core # inline "C_i_car" размещен14)))
  ( let  ((r183 (## core # inline_allocate "C_a_i_plus" 4 row12 dist13)))
  (, если  (## core # inline "C_i_nequalp" r179 r183)
  (k131 '#f)
  ( let  ((r167 (## core # inline "C_i_car" размещен14)))
  ( let  ((r171 (## core # inline_allocate "C_a_i_minus" 4 row12 dist13)))
  (, если  (## core # inline "C_i_nequalp" r167 r171)
  (k131 '#f)
  ( let  ((r155 (## core # inline_allocate "C_a_i_plus" 4 dist13 '1)))
  ( let  ((r159 (## core # inline "C_i_cdr" размещено14)))
  (ок? 3 k131 row12 r155 r159))))))))))))))
  ( пусть  ((k189 (## core # lambda (r190) (try2 k38 r190 '()' ()))))
  ( пусть  ((loop5 (## core # undefined)))
  ( пусть  ((t45 (set! Loop5
  ( лямбда  (k47 i6 l7)
  (, если  (## core # inline "C_i_nequalp" i6 '0)
  (k47 l7)
  ( let  ((r59 (## core # inline_allocate "C_a_i_minus" 4 i6 '1)))
  ( let  ((r63 (## core # inline_allocate "C_a_i_cons" 3 i6 l7)))
  (loop5 k47 r59 r63))))))))
  (loop5 k189 n0 '()))))))))))))
  ( let  ((k192 (## core # lambda (r193)
  ( пусть  ((k195 (## core # lambda (r196) (k26 (## core # undefined)))))
  ( пусть  ((k198 (## core # lambda (r199) (r199 k195))))
  (## sys # неявный обработчик выхода k198))))))
  (nqueens k192 '8))))))
  (## core # callunit "extras" k33)))))
  (## core # callunit "eval" k30)))))
  (## core # callunit "библиотека" k27))) 

Закрытие преобразование

Теперь процедуры преобразованы в явное создание и код доступа для закрытий:

 (## core # закрытие (2)
  ( лямбда  (c239 k26)
  ( пусть  ((k27 (## core # closure (2)
  (## ядро ​​# лямбда (c241 r28)
  ( пусть  ((k30 (## core # closure (2)
  (## ядро ​​# лямбда (c243 r31)
  ( let  ((k33 (## core # closure (2)
  (## core # lambda (c245 r34)
  ( let  ((t36 (set! Nqueens
  (## core # закрытие (2)
  ( лямбда  (c247 k38 n0)
  ( пусть  ((try2248 (## core # undefined)))
  ( пусть  ((try2 (## core # box try2248)))
  ( пусть  ((ок? 3249 (## core # undefined)))
  ( пусть  ((ок? 3 (## core # box ok? 3249)))
  ( let  ((t65 (## core # updatebox
  try2
  (## core # закрытие (4)
  ( лямбда  (c251 k67 x9 y10 z11)
  (, если  (## core # inline "C_i_nullp" x9)
  ( let  ((r78 (## core # inline "C_i_nullp" y10)))
  (k67 (## core # cond r78 '1' 0)))
  ( let  ((k84 (## core # closure (6)
  (## ядро ​​# лямбда (c254 r85)
  ( let  ((k88 (## core # closure (3)
  (## ядро ​​# лямбда (c256 r89)
  ((## core # ref c256 (2))
  (## core # inline_allocate "C_a_i_plus" 4 (## core # ref c256 (1)) r89)))
  r85
  (## core # ref c254 (5)))))
  ( let  ((r93 (## core # inline "C_i_cdr" (## core # ref c254 (4)))))
  ( let  ((r101 (## core # inline "C_i_car" (## core # ref c254 (4)))))
  ( let  ((r97 (## core # inline_allocate "C_a_i_cons" 3 r101 (## core # ref c254 (3)))))
  ((## core # unbox (## core # ref c254 (2)) ())
  k88
  r93
  r97
  (## core # ref c254 (1))))))))
  z11
  (## core # ref c251 (2))
  y10
  x9
  к67)))
  ( let  ((k103 (## core # closure (6)
  (## ядро ​​# лямбда (c261 r104)
  (, если  r104
  ( let  ((k110 (## core # closure (5)
  (## ядро ​​# лямбда (c263 r111)
  ( let  ((r119 (## core # inline "C_i_car" (## core # ref c263 (4)))))
  ( let  ((r115 (## core # inline_allocate "C_a_i_cons" 3 r119 (## core # ref c263 (3)))))
  ((## core # unbox (## core # ref c263 (2)) ())
  (## core # ref c263 (1))
  r111
  '()
  r115))))
  (## core # ref c261 (2))
  (## core # ref c261 (3))
  (## core # ref c261 (4))
  (## core # ref c261 (5)))))
  ( let  ((r123 (## core # inline "C_i_cdr" (## core # ref c261 (5)))))
  (добавить k110 r123 (## core # ref c261 (1)))))
  ((## core # ref c261 (2)) '0)))
  y10
  k84
  (## core # ref c251 (2))
  z11
  х9)))
  ( let  ((r127 (## core # inline "C_i_car" x9)))
  ((## core # unbox (## core # ref c251 (1)) ())
  k103
  r127
  '1
  z11))))))
  хорошо? 3
  try2
  '# < lambda  info (попробуйте x9 y10 z11) #>))))
  ( let  ((t129 (## core # updatebox
  хорошо? 3
  (## core # закрытие
  (3)
  ( лямбда  (c269 k131 row12 dist13 размещено14)
  (, если  (размещено ## core # inline "C_i_nullp" 14)
  (k131 '#t)
  ( let  ((r179 (## core # inline "C_i_car" размещен14)))
  ( let  ((r183 (## core # inline_allocate "C_a_i_plus" 4 row12 dist13)))
  (, если  (## core # inline "C_i_nequalp" r179 r183)
  (k131 '#f)
  ( let  ((r167 (## core # inline "C_i_car" размещен14)))
  ( let  ((r171 (## core # inline_allocate "C_a_i_minus" 4 row12 dist13)))
  (, если  (## core # inline "C_i_nequalp" r167 r171)
  (k131 '#f)
  ( let  ((r155 (## core # inline_allocate "C_a_i_plus" 4 dist13 '1)))
  ( let  ((r159 (## core # inline "C_i_cdr" размещено14)))
  ((## core # unbox (## core # ref c269 (1)) ())
  k131
  row12
  r155
  r159)))))))))))
  хорошо? 3
  '# < lambda  info (ok? Row12 dist13 размещено14) #>))))
  ( let  ((k189 (## core # closure (3)
  (## ядро ​​# лямбда (c277 r190)
  ((## core # unbox (## core # ref c277 (2)) ())
  (## core # ref c277 (1))
  r190
  '()
  '()))
  k38
  попробуй2)))
  ( пусть  ((loop5278 (## core # undefined)))
  ( пусть  ((loop5 (## core # box loop5278)))
  ( let  ((t45 (## core # updatebox
  loop5
  (## core # закрытие (3)
  ( лямбда  (c280 k47 i6 l7)
  (, если  (## core # inline "C_i_nequalp" i6 '0)
  (k47 l7)
  ( let  ((r59 (## core # inline_allocate "C_a_i_minus" 4 i6 '1)))
  ( let  ((r63 (## core # inline_allocate "C_a_i_cons" 3 i6 l7)))
  ((## core # unbox (## core # ref c280 (1)) ())
  k47
  r59
  r63)))))
  loop5
  '# < лямбда  info ( цикл  i6 l7) #>))))
  ((## core # unbox loop5 ()) k189 n0 '()))))))))))))
  '# < лямбда  info (nqueens n0) #>))))
  ( пусть  ((k192 (## core # closure (2)
  (## ядро ​​# лямбда (c284 r193)
  ( let  ((k195 (## core # closure (2)
  (## ядро ​​# лямбда (c286 r196)
  ((## core # ref c286 (1)) (## core # undefined)))
  (## core # ref c284 (1)))))
  ( let  ((k198 (## core # closure (2)
  (## ядро ​​# лямбда (c288 r199)
  (r199 (## core # ref c288 (1))))
  к195)))
  (## sys # неявный обработчик выхода k198))))
  (## core # ref c245 (1)))))
  (nqueens k192 '8))))
  (## core # ref c243 (1)))))
  (## core # callunit "extras" k33)))
  (## core # ref c241 (1)))))
  (## core # callunit "eval" k30)))
  к26)))
  (## core # callunit "библиотека" k27)))
'# < лямбда  info (верхний уровень) #>) 

Генерация кода

Вот выход компилятора во всей красе.Сначала заголовок:

#include "chicken.h" 

Теперь прототипы функций для библиотеки единиц , которые мы используем, следуют ниже (это единиц библиотеки по умолчанию, которые используются ):

 статический C_PTABLE_ENTRY * create_ptable (void);
C_noret_decl (C_library_toplevel)
C_externimport void C_ccall C_library_toplevel (C_word c, C_word d, C_word k) C_noret;
C_noret_decl (C_eval_toplevel)
C_externimport void C_ccall C_eval_toplevel (C_word c, C_word d, C_word k) C_noret;
C_noret_decl (C_extras_toplevel)
C_externimport void C_ccall C_extras_toplevel (C_word c, C_word d, C_word k) C_noret; 

Статический глобальный lf содержит литеральные (постоянные) данные, которые не должны собираться сборщиком мусора и используются в скомпилированной программе.Он также содержит неэкспортированные ( скрытые ) переменные верхнего уровня:

 статический C_TLS C_word lf [8]; 

Больше прототипов, на этот раз для созданных функций:

 C_noret_decl (C_toplevel)
C_externexport void C_ccall C_toplevel (C_word c, C_word t0, C_word t1) C_noret;
C_noret_decl (f_29)
статическая пустота C_ccall f_29 (C_word c, C_word t0, C_word t1) C_noret;
C_noret_decl (f_32)
статическая пустота C_ccall f_32 (C_word c, C_word t0, C_word t1) C_noret;
C_noret_decl (f_35)
статическая пустота C_ccall f_35 (C_word c, C_word t0, C_word t1) C_noret;
C_noret_decl (f_194)
статическая пустота C_ccall f_194 (C_word c, C_word t0, C_word t1) C_noret;
C_noret_decl (f_200)
статическая пустота C_ccall f_200 (C_word c, C_word t0, C_word t1) C_noret;
C_noret_decl (f_197)
статическая пустота C_ccall f_197 (C_word c, C_word t0, C_word t1) C_noret;
C_noret_decl (f_37)
статическая пустота C_ccall f_37 (C_word c, C_word t0, C_word t1, C_word t2) C_noret;
C_noret_decl (f_46)
статическая пустота C_fcall f_46 (C_word t0, C_word t1, C_word t2, C_word t3) C_noret;
C_noret_decl (f_191)
статическая пустота C_ccall f_191 (C_word c, C_word t0, C_word t1) C_noret;
C_noret_decl (f_130)
статическая пустота C_fcall f_130 (C_word t0, C_word t1, C_word t2, C_word t3, C_word t4) C_noret;
C_noret_decl (f_66)
статическая пустота C_fcall f_66 (C_word t0, C_word t1, C_word t2, C_word t3, C_word t4) C_noret;
C_noret_decl (f_105)
статическая пустота C_ccall f_105 (C_word c, C_word t0, C_word t1) C_noret;
C_noret_decl (f_112)
статическая пустота C_ccall f_112 (C_word c, C_word t0, C_word t1) C_noret;
C_noret_decl (f_86)
статическая пустота C_ccall f_86 (C_word c, C_word t0, C_word t1) C_noret;
C_noret_decl (f_90)
статическая пустота C_ccall f_90 (C_word c, C_word t0, C_word t1) C_noret; 

Здесь объявлены и определены батуты .Для каждой сгенерированной функции C из представления CPS нам нужна функция трамплина, которая имеет фиксированное соглашение о вызовах и может быть передана сборщику мусора, когда стек исчерпан (предел выделения, который мы упоминали выше). Батут для данной функции вызовет исходную функцию с восстановленными аргументами, продолжением и закрытием записи. Батуты, начинающиеся с trf_, - это custom : связанные функции были обнаружены во время оптимизации как настраиваемые и следуют немного другому соглашению о вызовах и, следовательно, нуждаются в конкретном батуте.Батуты, начинающиеся с tr_, являются общими и могут быть повторно использованы для всех функций с соответствующим количеством аргументов.

 C_noret_decl (trf_46)
static void C_fcall trf_46 (void * dummy) C_regparm C_noret;
C_regparm static void C_fcall trf_46 (void * dummy) {

C_word t3 = C_pick (0);
C_word t2 = C_pick (1);
C_word t1 = C_pick (2);
C_word t0 = C_pick (3);

C_adjust_stack (-4);
f_46 (t0, t1, t2, t3);}

C_noret_decl (trf_130)
static void C_fcall trf_130 (void * dummy) C_regparm C_noret;
C_regparm static void C_fcall trf_130 (void * dummy) {
C_word t4 = C_pick (0);
C_word t3 = C_pick (1);
C_word t2 = C_pick (2);
C_word t1 = C_pick (3);
C_word t0 = C_pick (4);
C_adjust_stack (-5);
f_130 (t0, t1, t2, t3, t4);}

C_noret_decl (trf_66)
static void C_fcall trf_66 (void * dummy) C_regparm C_noret;
C_regparm static void C_fcall trf_66 (void * dummy) {
C_word t4 = C_pick (0);
C_word t3 = C_pick (1);
C_word t2 = C_pick (2);
C_word t1 = C_pick (3);
C_word t0 = C_pick (4);
C_adjust_stack (-5);
f_66 (t0, t1, t2, t3, t4);}

C_noret_decl (tr3)
статическая пустота C_fcall tr3 (C_proc3 k) C_regparm C_noret;
C_regparm static void C_fcall tr3 (C_proc3 k) {
C_word t2 = C_pick (0);
C_word t1 = C_pick (1);
C_word t0 = C_pick (2);
C_adjust_stack (-3);
(k) (3, t0, t1, t2);}

C_noret_decl (tr2)
статическая пустота C_fcall tr2 (C_proc2 k) C_regparm C_noret;
C_regparm static void C_fcall tr2 (C_proc2 k) {
C_word t1 = C_pick (0);
C_word t0 = C_pick (1);
C_adjust_stack (-2);
(k) (2, t0, t1);} 

Здесь идет toplevel , процедура, содержащая скомпилированные выражения верхнего уровня, которые не содержатся в пользовательских процедурах.

Но сначала батут для верхнего уровня:

статический C_TLS int toplevel_initialized = 0;
C_main_entry_point
C_noret_decl (трамплин верхнего уровня)
статическая пустота C_fcall toplevel_trampoline (void * dummy) C_regparm C_noret;
C_regparm static void C_fcall toplevel_trampoline (void * dummy) {

C_toplevel (2, C_SCHEME_UNDEFINED, C_restore);} 

А теперь корпус:

 void C_ccall C_toplevel (C_word c, C_word t0, C_word t1) {
C_word tmp;
C_word t2;
C_word t3;
C_word * a;

если (toplevel_initialized) C_kontinue (t1, C_SCHEME_UNDEFINED);

иначе C_toplevel_entry (C_text ("верхний уровень"));

C_resize_stack (131072);

C_check_nursery_minimum (3);

if (! C_demand (3)) {
  
C_save (t1);
C_reclaim ((void *) toplevel_trampoline, NULL);}

toplevel_initialized = 1;

if (! C_demand_2 (30)) {
  
C_save (t1);
C_rereclaim2 (30 * sizeof (C_word), 1);

t1 = C_restore;}

а = C_alloc (3);

C_initialize_lf (lf, 8);

lf [0] = C_h_intern (& lf [0], 7, "nqueens");
lf [1] = C_h_intern (& lf [1], 6, "добавить");

lf [2] = C_static_lambda_info (C_heaptop, 16, "(попробуйте x9 y10 z11)");
lf [3] = C_static_lambda_info (C_heaptop, 27, "(ок \ 077 row12 dist13 размещено14)");
lf [4] = C_static_lambda_info (C_heaptop, 12, "(цикл i6 l7)");
lf [5] = C_static_lambda_info (C_heaptop, 12, "(nqueens n0)");
lf [6] = C_h_intern (& lf [6], 25, «\ 003sysimplicit-exit-handler»);
lf [7] = C_static_lambda_info (C_heaptop, 10, "(верхний уровень)");

C_register_lf2 (lf, 8, create_ptable ());

t2 = (* a = C_CLOSURE_TYPE | 2, a [1] = (C_word) f_29, a [2] = t1, tmp = (C_word) a, a + = 3, tmp);

C_library_toplevel (2, C_SCHEME_UNDEFINED, t2);} 

Далее код для пользовательских процедур и закрытий продолжения, введенных преобразованием CPS:

static void C_ccall f_29 (C_word c, C_word t0, C_word t1) {
C_word tmp;
C_word t2;
C_word t3;
C_word ab [3], * a = ab;

C_check_for_interrupt;

if (! C_stack_probe (& a)) {
  
C_save_and_reclaim ((void *) tr2, (void *) f_29,2, t0, t1);}

t2 = (* a = C_CLOSURE_TYPE | 2, a [1] = (C_word) f_32, a [2] = ((C_word *) t0) [2], tmp = (C_word) a, a + = 3, tmp);
C_eval_toplevel (2, C_SCHEME_UNDEFINED, t2);}


static void C_ccall f_32 (C_word c, C_word t0, C_word t1) {
C_word tmp;
C_word t2;
C_word t3;
C_word ab [3], * a = ab;

C_check_for_interrupt;
if (! C_stack_probe (& a)) {
C_save_and_reclaim ((void *) tr2, (void *) f_32,2, t0, t1);}
t2 = (* a = C_CLOSURE_TYPE | 2, a [1] = (C_word) f_35, a [2] = ((C_word *) t0) [2], tmp = (C_word) a, a + = 3, tmp);
C_extras_toplevel (2, C_SCHEME_UNDEFINED, t2);}


static void C_ccall f_35 (C_word c, C_word t0, C_word t1) {
C_word tmp;
C_word t2;
C_word t3;
C_word t4;
C_word ab [6], * a = ab;
C_check_for_interrupt;
if (! C_stack_probe (& a)) {
C_save_and_reclaim ((void *) tr2, (void *) f_35,2, t0, t1);}

t2 = C_mutate ((C_word *) lf [0] +1, (* a = C_CLOSURE_TYPE | 2, a [1] = (C_word) f_37, a [2] = lf [5],
                              tmp = (C_word) a, a + = 3, tmp));

t3 = (* a = C_CLOSURE_TYPE | 2, a [1] = (C_word) f_194, a [2] = ((C_word *) t0) [2], tmp = (C_word) a, a + = 3, tmp);

C_trace ("nqueens.scm: 28 nqueens ");

t4 = * ((C_word *) lf [0] +1);
((C_proc3) C_retrieve_proc (t4)) (3, t4, t3, C_fix (8));}


static void C_ccall f_194 (C_word c, C_word t0, C_word t1) {
C_word tmp;
C_word t2;
C_word t3;
C_word t4;
C_word ab [6], * a = ab;

C_check_for_interrupt;
if (! C_stack_probe (& a)) {
C_save_and_reclaim ((void *) tr2, (void *) f_194,2, t0, t1);}

t2 = (* a = C_CLOSURE_TYPE | 2, a [1] = (C_word) f_197, a [2] = ((C_word *) t0) [2], tmp = (C_word) a, a + = 3, tmp);
t3 = (* a = C_CLOSURE_TYPE | 2, a [1] = (C_word) f_200, a [2] = t2, tmp = (C_word) a, a + = 3, tmp);
C_trace ("## sys # неявный обработчик выхода");
t4 = C_retrieve (lf [6]);
((C_proc2) C_retrieve_proc (t4)) (2, t4, t3);}


static void C_ccall f_200 (C_word c, C_word t0, C_word t1) {
C_word tmp;
C_word t2;
C_word * a;

t2 = t1;
((C_proc2) C_retrieve_proc (t2)) (2, t2, ((C_word *) t0) [2]);}


static void C_ccall f_197 (C_word c, C_word t0, C_word t1) {
C_word tmp;
C_word t2;
C_word * a;
t2 = ((C_word *) t0) [2];
((C_proc2) (void *) (* ((C_word *) t2 + 1))) (2, t2, C_SCHEME_UNDEFINED);}


static void C_ccall f_37 (C_word c, C_word t0, C_word t1, C_word t2) {
C_word tmp;
C_word t3;
C_word t4;
C_word t5;
C_word t6;
C_word t7;
C_word t8;
C_word t9;
C_word t10;
C_word t11;
C_word t12;
C_word t13;
C_word ab [23], * a = ab;

если (c! = 3) C_bad_argc_2 (c, 3, t0);
C_check_for_interrupt;
if (! C_stack_probe (& a)) {
C_save_and_reclaim ((void *) tr3, (void *) f_37,3, t0, t1, t2);}

t3 = C_SCHEME_UNDEFINED;
t4 = (* a = C_VECTOR_TYPE | 1, a [1] = t3, tmp = (C_word) a, a + = 2, tmp);
t5 = C_SCHEME_UNDEFINED;
t6 = (* a = C_VECTOR_TYPE | 1, a [1] = t5, tmp = (C_word) a, a + = 2, tmp);
t7 = C_set_block_item (t4,0, (* a = C_CLOSURE_TYPE | 4, a [1] = (C_word) f_66, a [2] = t6, a [3] = t4,
                          a [4] = lf [2], tmp = (C_word) a, a + = 5, tmp));
t8 = C_set_block_item (t6,0, (* a = C_CLOSURE_TYPE | 3, a [1] = (C_word) f_130, a [2] = t6, a [3] = lf [3],
                          tmp = (C_word) a, a + = 4, tmp));
t9 = (* a = C_CLOSURE_TYPE | 3, a [1] = (C_word) f_191, a [2] = t1, a [3] = t4, tmp = (C_word) a, a + = 4, tmp);
t10 = C_SCHEME_UNDEFINED;
t11 = (* a = C_VECTOR_TYPE | 1, a [1] = t10, tmp = (C_word) a, a + = 2, tmp);
t12 = C_set_block_item (t11,0, (* a = C_CLOSURE_TYPE | 3, a [1] = (C_word) f_46, a [2] = t11, a [3] = lf [4],
                            tmp = (C_word) a, a + = 4, tmp));
t13 = ((C_word *) t11) [1];

f_46 (t13, t9, t2, C_SCHEME_END_OF_LIST);}


static void C_fcall f_46 (C_word t0, C_word t1, C_word t2, C_word t3) {
C_word tmp;
C_word t4;
C_word t5;
C_word t6;
C_word t7;
C_word t8;
C_word t9;
C_word * a;

петля:
а = C_alloc (7);
C_check_for_interrupt;
if (! C_stack_probe (a)) {
C_save_and_reclaim ((void *) trf_46, NULL, 4, t0, t1, t2, t3);}

if (C_truep ((C_word) C_i_nequalp (t2, C_fix (0)))) {
t4 = t1;
((C_proc2) (void *) (* ((C_word *) t4 + 1))) (2, t4, t3);}
еще{
  
t4 = (C_word) C_a_i_minus (& a, 2, t2, C_fix (1));
t5 = (C_word) C_a_i_cons (& a, 2, t2, t3);
C_trace ("nqueens.сбн: 7 петель »);

t7 = t1;
t8 = t4;
t9 = t5;
t1 = t7;
t2 = t8;
t3 = t9;
цикл goto;}}


static void C_ccall f_191 (C_word c, C_word t0, C_word t1) {
C_word tmp;
C_word t2;
C_word * a;
C_trace ("nqueens.scm: 26 попыток");

t2 = ((C_word *) ((C_word *) t0) [3]) [1];
f_66 (t2, ((C_word *) t0) [2], t1, C_SCHEME_END_OF_LIST, C_SCHEME_END_OF_LIST);}


static void C_fcall f_130 (C_word t0, C_word t1, C_word t2, C_word t3, C_word t4) {
C_word tmp;
C_word t5;
C_word t6;
C_word t7;
C_word t8;
C_word t9;
C_word t10;
C_word t11;
C_word t12;
C_word t13;
C_word t14;
C_word t15;
C_word * a;

петля:
а = C_alloc (12);
C_check_for_interrupt;
if (! C_stack_probe (a)) {
C_save_and_reclaim ((void *) trf_130, NULL, 5, t0, t1, t2, t3, t4);}
if (C_truep ((C_word) C_i_nullp (t4))) {
t5 = t1;

((C_proc2) (void *) (* ((C_word *) t5 + 1))) (2, t5, C_SCHEME_TRUE);}
еще{
  
t5 = (C_word) C_i_car (t4);
t6 = (C_word) C_a_i_plus (& a, 2, t2, t3);
if (C_truep ((C_word) C_i_nequalp (t5, t6))) {
t7 = t1;
((C_proc2) (void *) (* ((C_word *) t7 + 1))) (2, t7, C_SCHEME_FALSE);}
еще{
t7 = (C_word) C_i_car (t4);
t8 = (C_word) C_a_i_minus (& a, 2, t2, t3);
if (C_truep ((C_word) C_i_nequalp (t7, t8))) {
t9 = t1;
((C_proc2) (void *) (* ((C_word *) t9 + 1))) (2, t9, C_SCHEME_FALSE);}
еще{
t9 = (C_word) C_a_i_plus (& a, 2, t3, C_fix (1));
t10 = (C_word) C_i_cdr (t4);
C_trace ("nqueens.scm: 24 нормально? ");
t12 = t1;
t13 = t2;
t14 = t9;
t15 = t10;
t1 = t12;
t2 = t13;
t3 = t14;
t4 = t15;
цикл goto;}}}} 

Продолжается так, мы просто показываем это для полноты:

static void C_fcall f_66 (C_word t0, C_word t1, C_word t2, C_word t3, C_word t4) {
C_word tmp;
C_word t5;
C_word t6;
C_word t7;
C_word t8;
C_word t9;
C_word ab [14], * a = ab;
C_check_for_interrupt;
if (! C_stack_probe (& a)) {
C_save_and_reclaim ((void *) trf_66, NULL, 5, t0, t1, t2, t3, t4);}
if (C_truep ((C_word) C_i_nullp (t2))) {
t5 = (C_word) C_i_nullp (t3);
t6 = t1;
((C_proc2) (void *) (* ((C_word *) t6 + 1))) (2, t6, (C_truep (t5)? C_fix (1): C_fix (0)));}
еще{
t5 = (* a = C_CLOSURE_TYPE | 6, a [1] = (C_word) f_86, a [2] = t4, a [3] = ((C_word *) t0) [3],
    a [4] = t3, a [5] = t2, a [6] = t1, tmp = (C_word) a, a + = 7, tmp);
t6 = (* a = C_CLOSURE_TYPE | 6, a [1] = (C_word) f_105, a [2] = t3, a [3] = t5,
    a [4] = ((C_word *) t0) [3], a [5] = t4, a [6] = t2, tmp = (C_word) a, a + = 7, tmp);
t7 = (C_word) C_i_car (t2);
C_trace ("nqueens.scm: 14 ок? ");
t8 = ((C_word *) ((C_word *) t0) [2]) [1];
f_130 (t8, t6, t7, C_fix (1), t4);}}


static void C_ccall f_105 (C_word c, C_word t0, C_word t1) {
C_word tmp;
C_word t2;
C_word t3;
C_word t4;
C_word ab [6], * a = ab;
C_check_for_interrupt;
if (! C_stack_probe (& a)) {
C_save_and_reclaim ((void *) tr2, (void *) f_105,2, t0, t1);}
if (C_truep (t1)) {
t2 = (* a = C_CLOSURE_TYPE | 5, a [1] = (C_word) f_112, a [2] = ((C_word *) t0) [3], a [3] = ((C_word *) t0) [4 ],
    a [4] = ((C_word *) t0) [5], a [5] = ((C_word *) t0) [6], tmp = (C_word) a, a + = 6, tmp);
t3 = (C_word) C_i_cdr (((C_word *) t0) [6]);
C_trace ("nqueens.scm: 15 добавить ");
t4 = * ((C_word *) lf [1] +1);
((C_proc4) C_retrieve_proc (t4)) (4, t4, t2, t3, ((C_word *) t0) [2]);}
еще{
t2 = ((C_word *) t0) [3];
f_86 (2, t2, C_fix (0));}}


static void C_ccall f_112 (C_word c, C_word t0, C_word t1) {
C_word tmp;
C_word t2;
C_word t3;
C_word t4;
C_word ab [3], * a = ab;
C_check_for_interrupt;
if (! C_stack_probe (& a)) {
C_save_and_reclaim ((void *) tr2, (void *) f_112,2, t0, t1);}
t2 = (C_word) C_i_car (((C_word *) t0) [5]);
t3 = (C_word) C_a_i_cons (& a, 2, t2, ((C_word *) t0) [4]);
C_trace ("nqueens.scm: 15 попыток");
t4 = ((C_word *) ((C_word *) t0) [3]) [1];
f_66 (t4, ((C_word *) t0) [2], t1, C_SCHEME_END_OF_LIST, t3);}


static void C_ccall f_86 (C_word c, C_word t0, C_word t1) {
C_word tmp;
C_word t2;
C_word t3;
C_word t4;
C_word t5;
C_word t6;
C_word ab [7], * a = ab;
C_check_for_interrupt;
if (! C_stack_probe (& a)) {
C_save_and_reclaim ((void *) tr2, (void *) f_86,2, t0, t1);}
t2 = (* a = C_CLOSURE_TYPE | 3, a [1] = (C_word) f_90, a [2] = t1, a [3] = ((C_word *) t0) [6], tmp = (C_word) a, a + = 4, tmp);
t3 = (C_word) C_i_cdr (((C_word *) t0) [5]);
t4 = (C_word) C_i_car (((C_word *) t0) [5]);
t5 = (C_word) C_a_i_cons (& a, 2, t4, ((C_word *) t0) [4]);
C_trace ("nqueens.scm: 17 попыток »);
t6 = ((C_word *) ((C_word *) t0) [3]) [1];
f_66 (t6, t2, t3, t5, ((C_word *) t0) [2]);}


static void C_ccall f_90 (C_word c, C_word t0, C_word t1) {
C_word tmp;
C_word t2;
C_word ab [4], * a = ab;
C_check_for_interrupt;
if (! C_stack_probe (& a)) {
C_save_and_reclaim ((void *) tr2, (void *) f_90,2, t0, t1);}
t2 = ((C_word *) t0) [3];
((C_proc2) (void *) (* ((C_word *) t2 + 1))) (2, t2, (C_word) C_a_i_plus (& a, 2, ((C_word *) t0) [2], t1)); } 

Наконец, таблица процедур:

 #ifdef C_ENABLE_PTABLES
статическая таблица C_PTABLE_ENTRY [17] = {
{"toplevelnqueens.scm ", (void *) C_toplevel},
{"f_29nqueens.scm", (void *) f_29},
{"f_32nqueens.scm", (void *) f_32},
{"f_35nqueens.scm", (void *) f_35},
{"f_194nqueens.scm", (void *) f_194},
{"f_200nqueens.scm", (void *) f_200},
{"f_197nqueens.scm", (void *) f_197},
{"f_37nqueens.scm", (void *) f_37},
{"f_46nqueens.scm", (void *) f_46},
{"f_191nqueens.scm", (void *) f_191},
{"f_130nqueens.scm", (void *) f_130},
{"f_66nqueens.scm", (void *) f_66},
{"f_105nqueens.scm", (void *) f_105},
{"f_112nqueens.scm", (void *) f_112},
{"f_86nqueens.scm", (void *) f_86},
{"f_90nqueens.scm ", (void *) f_90},
{НОЛЬ НОЛЬ}};
#endif

статический C_PTABLE_ENTRY * create_ptable (void) {
#ifdef C_ENABLE_PTABLES
return ptable;
#еще
return NULL;
#endif
} 

Уф. Выполнено.

 

Другой пример

Нет, вы еще не закончили. Давайте посмотрим на более простой пример, с включенной полной оптимизацией и отключенными проверками безопасности. Пример программы - это тест takl из набора тестов Gabriel [2] (переведенный на Scheme Уиллом Клингером):

 ( определить  (список n)
  (, если  (= 0 n)
      '()
      (cons n (listn (- n 1)))))
 
( определить  18л (лист 18))
( определить  12л (лист 12))
( определить  6л (лист 6))
 
( определить  (mas x y z)
  (, если  (не (короче p y x))
      z
      (мас (мас (cdr x)
у г)
(мас (cdr y)
z x)
(мас (cdr z)
х у))))
 
( определить  (короче p x y)
  (и (пара? y)
       (или (null? x)
(короче (cdr x)
(cdr y)))))
 
(мас 18л 12л 6л) 

После канонизации:

 (## core # callunit "библиотека")
(## core # callunit "eval")
(## core # callunit "дополнительные")
(## core # undefined)
(## core # undefined)
(set! listn ( лямбда  (n0) ( if  (= '0 n0)' () (cons n0 (listn (- n0 '1))))))
(комплект! 18л (список '18))
(комплект! 12л (список '12))
(набор! 6l (список '6))
(установить! мас
  ( лямбда  (x1 y2 z3)
    (, если  (не (короче p y2 x1))
      z3
      (mas (mas (cdr x1) y2 z3) (mas (cdr y2) z3 x1) (mas (cdr z3) x1 y2)))))
(установить! shorterp
  ( лямбда  (x4 y5)
    (, если  (пара? Y5)
      ( пусть  ((g67 (null? X4))) ( если  g67 g67 (корочеp (cdr x4) (cdr y5))))
      '#f)))
(мас 18л 12л 6л)
((## sys # неявный обработчик выхода))
(## core # undefined) 

Сгенерированный код C выглядит так (менее интересные части мы опустили):

static void C_ccall f_24 (C_word c, C_word t0, C_word t1) {
C_word tmp;
C_word t2;
C_word t3;
C_word ab [3], * a = ab;
if (! C_stack_probe (& a)) {
C_save_and_reclaim ((void *) tr2, (void *) f_24,2, t0, t1);}
t2 = (* a = C_CLOSURE_TYPE | 2, a [1] = (C_word) f_27, a [2] = ((C_word *) t0) [2], tmp = (C_word) a, a + = 3, tmp);
C_eval_toplevel (2, C_SCHEME_UNDEFINED, t2);}


static void C_ccall f_27 (C_word c, C_word t0, C_word t1) {
C_word tmp;
C_word t2;
C_word t3;
C_word ab [3], * a = ab;
if (! C_stack_probe (& a)) {
C_save_and_reclaim ((void *) tr2, (void *) f_27,2, t0, t1);}
t2 = (* a = C_CLOSURE_TYPE | 2, a [1] = (C_word) f_30, a [2] = ((C_word *) t0) [2], tmp = (C_word) a, a + = 3, tmp);
C_extras_toplevel (2, C_SCHEME_UNDEFINED, t2);}


static void C_ccall f_30 (C_word c, C_word t0, C_word t1) {
C_word tmp;
C_word t2;
C_word t3;
C_word t4;
C_word ab [5], * a = ab;
if (! C_stack_probe (& a)) {
C_save_and_reclaim ((void *) tr2, (void *) f_30,2, t0, t1);}

t2 = C_mutate (& lf [0], (* a = C_CLOSURE_TYPE | 1, a [1] = (C_word) f_32, tmp = (C_word) a, a + = 2, tmp));
t3 = (* a = C_CLOSURE_TYPE | 2, a [1] = (C_word) f_54, a [2] = ((C_word *) t0) [2], tmp = (C_word) a, a + = 3, tmp);

f_32 (t3, C_fix (18));}


static void C_ccall f_54 (C_word c, C_word t0, C_word t1) {
C_word tmp;
C_word t2;
C_word t3;
C_word t4;
C_word ab [3], * a = ab;
if (! C_stack_probe (& a)) {
C_save_and_reclaim ((void *) tr2, (void *) f_54,2, t0, t1);}

t2 = C_mutate (& lf [1], t1);
t3 = (* a = C_CLOSURE_TYPE | 2, a [1] = (C_word) f_58, a [2] = ((C_word *) t0) [2], tmp = (C_word) a, a + = 3, tmp);

f_32 (t3, C_fix (12));}


static void C_ccall f_58 (C_word c, C_word t0, C_word t1) {
C_word tmp;
C_word t2;
C_word t3;
C_word t4;
C_word ab [3], * a = ab;
if (! C_stack_probe (& a)) {
C_save_and_reclaim ((void *) tr2, (void *) f_58,2, t0, t1);}

t2 = C_mutate (& lf [2], t1);
t3 = (* a = C_CLOSURE_TYPE | 2, a [1] = (C_word) f_62, a [2] = ((C_word *) t0) [2], tmp = (C_word) a, a + = 3, tmp);

f_32 (t3, C_fix (6));}


static void C_ccall f_62 (C_word c, C_word t0, C_word t1) {
C_word tmp;
C_word t2;
C_word t3;
C_word t4;
C_word t5;
C_word t6;
C_word t7;
C_word t8;
C_word ab [10], * a = ab;
if (! C_stack_probe (& a)) {
C_save_and_reclaim ((void *) tr2, (void *) f_62,2, t0, t1);}

t2 = C_mutate (& lf [3], t1);

t3 = C_mutate (& lf [4], (* a = C_CLOSURE_TYPE | 1, a [1] = (C_word) f_64, tmp = (C_word) a, a + = 2, tmp));
t4 = C_mutate (& lf [5], (* a = C_CLOSURE_TYPE | 1, a [1] = (C_word) f_104, tmp = (C_word) a, a + = 2, tmp));

t5 = f_64 (lf [1], lf [2], lf [3]);
t6 = (* a = C_CLOSURE_TYPE | 2, a [1] = (C_word) f_134, a [2] = ((C_word *) t0) [2], tmp = (C_word) a, a + = 3, tmp);
t7 = (* a = C_CLOSURE_TYPE | 2, a [1] = (C_word) f_137, a [2] = t6, tmp = (C_word) a, a + = 3, tmp);

t8 = * ((C_word *) lf [6] +1);
((C_proc2) (void *) (* ((C_word *) t8 + 1))) (2, t8, t7);}


статическое C_word C_fcall f_104 (C_word t1, C_word t2) {
C_word tmp;
C_word t3;
C_word t4;
C_word t5;
C_word t6;
C_word t7;
C_word t8;

петля:
if (C_truep ((C_word) C_i_pairp (t2))) {
t3 = (C_word) C_i_nullp (t1);
if (C_truep (t3)) {
return (t3);}
еще{
t4 = (C_word) C_slot (t1, C_fix (1));
t5 = (C_word) C_slot (t2, C_fix (1));
t7 = t4;
t8 = t5;
t1 = t7;
t2 = t8;
цикл goto;}}
еще{
return (C_SCHEME_FALSE);}}


статическое C_word C_fcall f_64 (C_word t1, C_word t2, C_word t3) {
C_word tmp;
C_word t4;
C_word t5;
C_word t6;
C_word t7;
C_word t8;
C_word t9;
C_word t10;
C_word t11;
C_word t12;
C_word t13;
C_word t14;

петля:
t4 = f_104 (t2, t1);
if (C_truep (t4)) {
t5 = (C_word) C_slot (t1, C_fix (1));
t6 = f_64 (t5, t2, t3);
t7 = (C_word) C_slot (t2, C_fix (1));
t8 = f_64 (t7, t3, t1);
t9 = (C_word) C_slot (t3, C_fix (1));
t10 = f_64 (t9, t1, t2);
t12 = t6;
t13 = t8;
t14 = t10;
t1 = t12;
t2 = t13;
t3 = t14;
цикл goto;}
еще{
return (t3);}}


static void C_fcall f_32 (C_word t1, C_word t2) {
C_word tmp;
C_word t3;
C_word t4;
C_word t5;
C_word t6;
C_word t7;
C_word t8;
C_word t9;
C_word * a;

петля:
а = C_alloc (4);
if (! C_stack_probe (a)) {
C_save_and_reclaim ((void *) trf_32, NULL, 2, t1, t2);}
t3 = t2;
t4 = (C_word) C_eqp (C_fix (0), t3);
if (C_truep (t4)) {
t5 = t1;
((C_proc2) (void *) (* ((C_word *) t5 + 1))) (2, t5, C_SCHEME_END_OF_LIST);}
еще{
t5 = (* a = C_CLOSURE_TYPE | 3, a [1] = (C_word) f_46, a [2] = t2, a [3] = t1, tmp = (C_word) a, a + = 4, tmp);
t6 = (C_word) C_u_fixnum_difference (t2, C_fix (1));

t8 = t5;
t9 = t6;
t1 = t8;
t2 = t9;
цикл goto;}} 

Список литературы

[1] «Чейни на MTA или МИНУСах не должен оправдывать свои аргументы», Генри Бейкер

[2] «Производительность и оценка Lisp-систем», Ричард Габриэль

.