![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
FunctionalBoost , ,
Если вы посмотрите более внимательно, вы заметите, что Дух - это все о составе парсерных функций. Парсер - это просто функция, которая принимает сканер и возвращает матч. Parser функции составлены для формирования все более сложных форм более высокого порядка. Заметьте также, что парсер, хотя и объект, неизменный и постоянный. Все примитивные и композитные объекты являются const. Функция члена парса даже объявляется const:
Во всех аккаунтах это выглядит и очень похоже на Functional Programming. И действительно так. Дух - это, безусловно, применение функционального программирования в императивном домене C++. В Haskell, например, есть то, что называется парсерные комбинаторы, которые поразительно похожи на подход, принятый Духовно-парсерными функциями, которые состоят с использованием различных операторов для создания более высокого порядка парсерных функций, которые моделируют сверху вниз рекурсивный спусковой парсер. Эти умные люди Хаскелла делали это перед Духом. Функциональные библиотеки программирования (или FP) набирают обороты в сообществе C++. Конечно, мы увидим больше FP в Духе сейчас и в будущем. На самом деле, если посмотреть более внимательно, даже стандартная библиотека C++ имеет вкус FP. Тщательно под ядром стандартной библиотеки C++ более пристальное внимание к STL дает нам представление о действительно существующей парадигме FP. Очевидно, что авторы STL знают и практикуют FP. Semantic Actions in the FP PerspectiveSTL style FPБолее очевидное применение FP в стиле STL в Духе является семантическим действием. Что такое STL-стиль FP? Это в первую очередь использование функторов, которые могут быть составлены для формирования фукторов более высокого порядка.
Этот STL-стиль FP можно увидеть везде в наши дни. Следующий пример взят из руководства SGI Standard Template Library Programr's Guide:
Really, this is just currying in FP terminology.
В контексте Духа тот же FP стиль фанктора композиции может быть применен к семантическим действиям. full_calc.cpp - хороший пример. Вот фрагмент из этого образца:
Boost style FPПовышение принимает парадигму FP дальше. Есть библиотеки, которые специально сосредоточены на функциональных объектах и программировании более высокого порядка.
Ниже приведен пример, который использует импульс Bind для использования функции члена в качестве семантического действия Духа. Этот пример можно увидеть в полном объеме в файле link.cpp.
Этот парсер пересказывает список реальных чисел и хранит их в векторе<ДП>. Boost.bind создает Дух, соответствующий семантическому действию от функции list_parser add. Lambda and PhoenixЕсть библиотека, написанная вами по-настоящему, по имени Phoenix. Хотя это официально не является частью распространения Духа, эта библиотека широко использовалась для экспериментов над передовыми методами FP на C++. Эта библиотека в значительной степени зависит от FC++ и усилится Lambda (BLL).
Феникс позволяет писать семантические действия в интерактивном виде на C++ через лямбда (неназванная функция) выражения. Вот фрагмент из phoenix_calc.cpp Пример:
Вам не нужно беспокоиться о деталях на данный момент. Здесь многое происходит, что нужно объяснить. Последующие главы будут просветительными. Обратите внимание на использование выражений ламбды, таких как:
где expression.val является переменной закрытия правила выражения (см. Closures).
Copyright © 1998-2003 Joel de Guzman
Статья Functional раздела может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: ::
|
||||||||||||||||||||||||||||||||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |