Какие инструменты есть для функционального программирования на C?

141
задан Ferruccio 19 October 2008 в 12:01
поделиться

8 ответов

FFCALL позволяет Вам создать закрытия в C - callback = alloc_callback(&function, data) возвраты указатель функции, таким образом, что callback(arg1, ...) эквивалентно вызову function(data, arg1, ...). Необходимо будет обработать сборку "мусора" вручную, все же.

Связано, блоки были добавлены к ветвлению Apple GCC; они не указатели функции, но они позволяют Вам раздать лямбды при предотвращении потребности создать и освободить память для полученных переменных вручную (эффективно, некоторое копирование и подсчет ссылок происходят, скрытые позади некоторых синтаксических сахарных и библиотек времени выполнения).

38
ответ дан ephemient 19 October 2008 в 12:01
поделиться

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

, Если это не привлекательная опция, тогда Вы могли бы злоупотребить CPP для получения части пути там. Макро-система должна позволить Вам эмулировать некоторые идеи функционального программирования. Я услышал, говорят, что gcc реализован этот путь, но я никогда не проверял.

C может, конечно, передать функции вокруг использования указателей функции, основными проблемами является отсутствие закрытий, и система типов имеет тенденцию мешать. Вы могли исследовать более мощные макро-системы, чем CPP, такие как M4. Я предполагаю в конечном счете, что я предлагаю, то, что истинный C не до задачи без большого усилия, но Вы могли расширить C, чтобы заставить его быть до задачи. То расширение посмотрело бы самый подобный C, если Вы используете CPP, или Вы могли бы перейти к другому концу спектра и генерировать код C с некоторого другого языка.

7
ответ дан Jason Dagit 19 October 2008 в 12:01
поделиться

Если Вы хотите реализовать закрытия, необходимо будет получить groady со свопингом/управлением стека и ассемблером. Не рекомендуя против него, просто говоря это - то, что необходимо будет сделать.

Не уверенный, как Вы обработаете анонимные функции в C. На машине von Neumann Вы могли сделать анонимные функции в asm, все же.

5
ответ дан Paul Nathan 19 October 2008 в 12:01
поделиться
  • 1
    Я пропускаю что-то, или это отвечает на совершенно другой вопрос? – EWit 25 June 2014 в 06:33

Взгляд на Hartel & книга Muller, Функциональный C

http://www.ub.utwente.nl/webdocs/ctit/1/00000084.pdf
http://www.cs.bris.ac.uk/~henkm/f2c/index.html

3
ответ дан ja. 19 October 2008 в 12:01
поделиться
  • 1
    @Heike Или Ваше изображение является пробелом или моей машиной, испытывает некоторые трудности с ним. – Dr. belisarius 18 October 2011 в 12:47

Что о C Вы хотите сделать функциональным, синтаксис или семантика? Семантика функционального программирования могла, конечно, быть добавлена к компилятору C, но к тому времени, когда Вы были сделаны, у Вас по существу будет эквивалент одного из существующих функциональных языков, таких как Схема, Haskell, и т.д.

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

-4
ответ дан Barry Brown 19 October 2008 в 12:01
поделиться
  • 1
    +1, я просто прочитал это впервые. Хорошая информация, спасибо. – rcollyer 8 November 2011 в 17:18

Хорошо довольно много языков программирования записаны в C. И некоторые из них функции поддержки как граждане первого класса, языки в той области являются ecl (embbedabble язык Common LISP IIRC), Гну Smalltalk (GST) (Smalltalk имеет блоки), тогда существуют библиотеки для "закрытий", например, в glib2 http://library.gnome.org/devel/gobject/unstable/chapter-signal.html#closure, который, по крайней мере, получил близкое функциональное программирование. Таким образом, возможно, с помощью некоторых из тех реализаций, чтобы сделать функциональное программирование может быть опцией.

Хорошо или можно пойти, изучив Ocaml, Haskell, Mozart/Oz и т.п.;-)

Отношения

1
ответ дан Friedrich 19 October 2008 в 12:01
поделиться

Не знаю о C. В Objective-C есть некоторые функциональные возможности, GCC на OSX также поддерживает некоторые функции, однако я снова рекомендую начать использовать функциональный язык, их много упомянутый выше. Я лично начал со схемы, есть несколько отличных книг, таких как «Маленький программист», которые могут вам в этом помочь.

-4
ответ дан 23 November 2019 в 23:05
поделиться

Вы можете использовать вложенные функции GCC для имитации лямбда-выражений, на самом деле, у меня есть макрос, который делает это за меня:

#define lambda(return_type, function_body) \
  ({ \
    return_type anon_func_name_ function_body \
    anon_func_name_; \
  })

Используйте так:

int (*max)(int, int) = lambda (int, (int x, int y) { return x > y ? x : y; });
86
ответ дан 23 November 2019 в 23:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: