Один из подходов будет таким:
#if defined(MON_TARGET_A)
#define MON_TARGET_NAME "App A"
#elif defined(MON_TARGET_B)
#define MON_TARGET_NAME "App B"
#else
#error "which target are you building?"
#endif
Затем добавьте MON_TARGET_A
или MON_TARGET_B
в настройки препроцессора вашей цели.
Обычно вы будете использовать GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS
, а не GCC_PREPROCESSOR_DEFINITIONS
, потому что последний может предотвратить совместное использование заголовков PCH.
Чтобы добавить это, перейдите к:
, затем отбросить GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS
в поле поиска и установить его значение примерно так: MON_TARGET_A $(inherited)
Кратко, так как 'связывание' монады берет эффективное продолжение (лямбда 'отдыха вычисления') как аргумент, монады являются продолжениями в этом смысле. На обороте передающий продолжение стиль может быть эффективно реализован на языке не-CPS с помощью одноместного сахара синтаксиса, как предложено многими misc ссылками ниже.
От 'все о монадах' учебное руководство в Haskell:
https://www.haskell.org/haskellwiki/All_About_Monads#The_Continuation_monad
монада продолжения F#, используемая, чтобы реализовать 'повреждение' и 'продолжиться' для for-style-loops
http://cs.hubfs.net/forums/thread/9311.aspx
И примера применения монады продолжения к проблеме в F#:
http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!256.entry
Не только монады продолжений, но и они - своего рода универсальная монада, в том смысле, что, если у Вас есть продолжения и состояние, можно моделировать любую функциональную монаду. Этот впечатляющий, но очень технический результат прибывает из впечатляющего и очень технического ума Andrzej Filinski , кто записал в 1994 или поблизости:
Мы показываем, что любая монада, единица которой и дополнительные операции являются выразимыми как чисто функциональное отношение, может быть встроена в язык вызова по значению с “composable continuations”.
Они могут быть, хотя они не должны быть. Я инвертировал бы Ваш вопрос немного и сказал бы вместо этого, что монады являются способом реализовать продолжения. Но можно реализовать продолжения во многих отношениях - можно сделать скромное, но ограниченное факсимиле CPS в C# без слишком большого усилия, , например . Взгляните на Монада Продолжения от сайта Haskell для очень полной обработки.
Очень хорошая статья на эту тему: http://blog.sigfpe.com/2008/12/mother-of-all-monads.html
Продолжение - это особая функция в программе. Монады - это конструкторы типов.
Конструктор типа Cont
для продолжений, принимающих тип T
, не будет монадой.
Однако Cont
- это монада, и это то, что обычно называют «продолжением монады».
(Наличие callcc на языке эквивалентно возможности конвертировать из Cont
в T
.)