LINUX.ORG.RU

Головоломка по C


0

0

Вопрос скорее из любопытства, 
чем из практической необходимости, но

Можно ли на С сделать такие финты:

1) apply(f,p) {return \x->f(p,x);}


2)По указателю на функцию, и описанию в любом виде
в run time вызвать с данными параметрами. Или хотя 
бы если исвестно, что у нее n параметров типа void*; 
★★

Ответ на: комментарий от xnix

Немного попридираюсь. Либо уж int (*test)(void *a) = test1; либо (*test)(); безобразно, зато однообразно. ;)

devinull ★★
()

Можно, хотя в полном объеме довольно непросто. Ключевые слова - libffi и __builtin_apply

vnp
()

2ival :

Первое -- не понял.

Второе -- нельзя (компиляторнонезависимо) без компиляции "на лету". Но последнее обычно не является ограничением, поскольку все ПОЗИКС операционки имеют хотя бы зачаточный Це компилятор.

Как было замечено vnp (*) (11.05.2006 22:52:29), возможно также извращение на уровне хаков для известных компиляторов, но Це тут, конечно, не при чем.

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

>Первое -- не понял.

Имелось ввиду что-то типа delegate в c# или lambda в python,


в c# можно сделать что-то вроде:

//синтаксис точно не помню
typedef int func_t delegate(int x);

func_t get_func(int n) {
    return (
        func_t {
           return n+x;
        }
    );
)

Т.е бог с ними, что они anonymous methods (ну разве что
лишние пара строк кода), но они могут зависеть от внешних
параметров. По существу задача сводится к тому, что бы
сгенерить в run_time функцию, которая просто подставляет 
недостающие внешние параметры. 

IMHO в "портабельном высокоуровнем ассемблере" этих 
примитивов не хватает. 

ival ★★
() автор топика
Ответ на: комментарий от ival

> > Первое -- не понял.

> Имелось ввиду что-то типа delegate в c# или lambda в python,

Скорее, имелся ввиду function currying. Который из статические типизированных языков есть, имхо, только в хаскелле, и то потому, что там допускается неявная типизация.

На С можно, но придется писать "curryer" для каждого типа функций.

anonymous
()
Ответ на: комментарий от ival

Это называется "замыкания" (closures). И нет, в стандартном C этого не сделаешь.

int19h ★★★★
()
Ответ на: комментарий от anonymous

Есть не только в Haskell. Уж про ML, Miranda, Clean не нужно забывать. Про ML в особенности.

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

Да, прогнал, не поэтому. Из-за того, что функции не first-class.

Но, однако, если требовать полного указания типов а-ля C++ - то такие конструкции очень-очень громоздкие будут.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.