Cтраница 3
У читателя может возникнуть резонный вопрос, как функции printf и scanf узнают, какой тип использовать в каждом макросе va arg. Ответ состоит в том, что printf и scanf просматривают спецификации преобразования в управляющей строке формата для определения типа следующего аргумента, который будет обрабатываться. [31]
Выражение в вершине стека, скажем F, должно быть или примитивной функцией, или замыканием в соответствии с ранее определенными преобразованиями состояний. Результат этого применения заменяет / и а в стеке 5, а символ удаляется из управляющей строки. [32]
Причина такого странного порядка аргументов в том, чтобы позволить обрабатывать выражение вида cond ТЕР как обычное применение функции. Затем значение предиката Р будет помещено в вершину стека S, а выражение cond ТЕ окажется в начале управляющей строки. [33]
Они идентичны функциям scanf и printf, за исключением того, что первым аргументом является указатель файла, определяющий тот файл, который будет читаться или куда будет вестись запись; управляющая строка будет вторым аргументом. [34]
При энергичной реализации выражения А и F вначале вычисляются, а затем величина F применяется к величине А. Это выполняется с помощью замены элемента FA в управляющей строке на три элемента A, F, , где - это специальный символ применения, который ( как увидим далее) при своем появлении в начале управляющей строки вызывает применение верхнего элемента стека к элементу, находящемуся непосредственно под ним. [35]
Функция scanf считывает данные со стандартного устройства ввода, которым обычно является клавиатура. В нашем случае функция scanf имеет два аргумента, % d и & integerl. Первый аргумент - управляющая строка, задает формат считывания, тем самым определяется тип данных, которые предстоит ввести пользователю. Второй аргумент scanf начинается со знака амперсанда ( &), которым в С задается операция взятия адреса следующей за ним переменной. Амперсанд, когда он используется совместно с именем переменной, сообщает scanf ячейку памяти, в которой хранится переменная integerl. [36]
Преобразование входного потока данных выполняет библиотечная функция scanf. Она читает байты из стандартного файла ввода, интерпретирует их согласно формату, заданному управляющими знаками, и запоминает результат в аргументах. В качестве параметров могут быть заданы: управляющая строка; набор аргументов, каждый из которых должен быть указателем, определяющим, где должны быть запомнены результаты преобразования. [37]
Функция printf может использоваться для вывода на печать заключенной в кавычки строки и значений выражений. При печати целого значения первый аргумент функции printf - управляющая строка, задающая формат вывода, должна содержать спецификатор преобразования % d и, кроме того, может содержать любые другие символы, которые должны быть напечатаны; второй аргумент - выражение, значение которого необходимо напечатать. Если на печать будет выводиться более одного целого числа, управляющая строка формата должна содержать % d для каждого целого, а разделенные запятой аргументы, следующие за управляющей строкой, содержать выражения, значения которых должны быть напечатаны. [38]
И) Если / - это замыкание [ VB E, то выражение тела ( В) вычисляется в контексте Е, дополненном связью V с а. Однако перед тем как сделать это, состояние машины нужно запомнить, чтобы можно было продолжить работу после того, как вычисление В закончится. Это состояние представляет собой текущее состояние машины ( кортеж из четырех элементов) с удаленными верхним элементом управляющей строки и двумя верхними элементами стека. Новый стек пуст, новый контекст представляет собой контекст применяемого замыкания, дополненный связью идентификатора связанной переменной с выражением аргумента, а новая управляющая строка состоит из единственного элемента. [39]
Требуемое замыкание поэтому формируется за два шага. Очевидно, что использование помеченных выражений является не самой эффективной реализацией рекурсии. В частности, замыкание, соответствующее Х - абстракции, известно уже при первом появлении помеченного выражения в начале управляющей строки. [40]
Функция printf может использоваться для вывода на печать заключенной в кавычки строки и значений выражений. При печати целого значения первый аргумент функции printf - управляющая строка, задающая формат вывода, должна содержать спецификатор преобразования % d и, кроме того, может содержать любые другие символы, которые должны быть напечатаны; второй аргумент - выражение, значение которого необходимо напечатать. Если на печать будет выводиться более одного целого числа, управляющая строка формата должна содержать % d для каждого целого, а разделенные запятой аргументы, следующие за управляющей строкой, содержать выражения, значения которых должны быть напечатаны. [41]
Функция scanf получает значения, которые пользователь обычно вводит с клавиатуры. Ее первый аргумент - управляющая строка, задающая формат считывания, которая сообщает компьютеру, какой тип данных должен быть введен пользователем. Спецификация преобразования % d определяет, что эти данные должны быть целыми. Каждому из оставшихся аргументов должна соответствовать спецификация преобразования в управляющей строке формата считывания. Имя каждой переменной обычно предваряется амперсандом ( &), называемым в С операцией взятия адреса. Амперсанд при объединении с именем переменной сообщает компьютеру ячейку памяти, в которой будет храниться значение. Затем компьютер записывает значение в эту ячейку. [42]
И) Если / - это замыкание [ VB E, то выражение тела ( В) вычисляется в контексте Е, дополненном связью V с а. Однако перед тем как сделать это, состояние машины нужно запомнить, чтобы можно было продолжить работу после того, как вычисление В закончится. Это состояние представляет собой текущее состояние машины ( кортеж из четырех элементов) с удаленными верхним элементом управляющей строки и двумя верхними элементами стека. Новый стек пуст, новый контекст представляет собой контекст применяемого замыкания, дополненный связью идентификатора связанной переменной с выражением аргумента, а новая управляющая строка состоит из единственного элемента. [43]
Принципы работы большинства традиционных компьютеров обычно описывают в виде последовательностей инструкций, которые манипулируют данными и расположены в памяти либо регистрах машины. Последовательность выполнения инструкций контролируется с помощью специального регистра счетчика команд. Говоря более абстрактно, такие архитектуры имеют модель вычислений, определенную в терминах потока управления, и мы уже встречали такую модель для функциональных языков. Например, функция переходов, используемая для описания SECD-машины в гл. Стек, Контекст, Управляющая строка, Дамп), причем управление процессом осуществляется с помощью Управляющей строки, содержимое которой определяет преобразование состояний. [44]
Принципы работы большинства традиционных компьютеров обычно описывают в виде последовательностей инструкций, которые манипулируют данными и расположены в памяти либо регистрах машины. Последовательность выполнения инструкций контролируется с помощью специального регистра счетчика команд. Говоря более абстрактно, такие архитектуры имеют модель вычислений, определенную в терминах потока управления, и мы уже встречали такую модель для функциональных языков. Например, функция переходов, используемая для описания SECD-машины в гл. Стек, Контекст, Управляющая строка, Дамп), причем управление процессом осуществляется с помощью Управляющей строки, содержимое которой определяет преобразование состояний. [45]