- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
void my_char_plus(const void *a, const void *b, void *c)
{
char tmp = (*(char*)a + *(char*)b);
memcpy(c,(void*)(&tmp),sizeof(char));
}
void my_char_minus(const void *a, const void *b, void *c)
{
char tmp = (*(char*)a - *(char*)b);
memcpy(c,(void*)(&tmp),sizeof(char));
}
void operation(const void *funct(const void*,const void*,void*),
const void *a, const void *b, void *c )
{
funct(a,b,c);
}
char ret_last_arg(const void *funct(const void*,const void*,void*),
const void *a, const void *b)
{
char c;
funct(a,b,(void*)&c);
return c;
}
int main(void)
{
char a, b;
a = 5; b = 7;
void *plus = &my_char_plus; char c;
operation(plus, (const void*)&a, (const void*)&b, (void*)&c);
printf("5 + 7 = %i\n", c);
void *minus = &my_char_minus;
char d = ret_last_arg(minus, (const void*)&a, (const void*)&b);
printf("5 - 7 = %i\n", d);
// LISP LISP LISP
#define LISP(ar,aa,bb) ret_last_arg(ar, (const void*)&(char){aa}, (const void*)&(char){bb} )
char e = LISP(plus,2,LISP(plus,2,2));
printf("(+ 2 (+ 2 2 ) ) = %i\n", e);
return 0;
}
bormand 08.05.2014 20:17 # +1
bormand 08.05.2014 20:19 # 0
j123123 08.05.2014 21:32 # +1
Ах да, тут еще царь на лоре активизировался, что-то про ассемблер и флоаты заговорил. Круто https://www.linux.org.ru/forum/development/10452829
bormand 08.05.2014 21:39 # +3
Значит скоро к нам вернется, ждем с нетерпением.
> Ну, если у нас много аргументов и надо сложить...
То можно поюзать вариадик функцию. Кстати в лишпе + принимал сколько угодно аргументов, а не 2.
> промежуточное представление
Ну вот конкретно в этом коде получается не промежуточное представление, а тупо вычисление. Надо тогда макросом "компилить" в структурки с четырьмя полями (функция и три ссылки на ноды-аргументы), а не прямо в вызовы. Вот тогда будет интересней - можно будет и циклы мутить, и функции описывать прямо на этом метаязыке и т.п..
К чему тут флоаты и их порядок - не понял.
bormand 08.05.2014 21:48 # 0
j123123 08.05.2014 22:43 # 0
Сложение флоатов неассоциативно
bormand 08.05.2014 22:58 # 0
j123123 09.05.2014 04:27 # 0
( ( ( ( ( (0000000000000.1 + 0000000000000.1) + 0000000000000.1 ) + 0000000000000.1 ) + 0000000000000.1 ) +0000000000000.1 ) + 0000000000000.1 ) + 0000000000000.1
Понятно?
bormand 09.05.2014 06:45 # +1
j123123 09.05.2014 08:03 # 0
bormand 09.05.2014 08:50 # +1
Если программист не указывает его явным образом (например скобками) - вообще любой. И ничто не мешает ему написать _(plus, a, _(plus, b, _(plus, c, d))), если его волнует эта проблема. Ну и в конце концов ты можешь написать, что многоаргументный plus всегда складывает флоаты слева направо, раз уж хочется определенности.
P.S. Я так и не понял, какое отношение флоатопроблемы имеют к этому треду. Поясни.
j123123 09.05.2014 09:47 # 0
bormand 09.05.2014 10:28 # +1
Так этот макрос сам по себе ничего не принимает. Он только форвардит все аргументы функции f. А там уже компилятор сам проверит - можно ли ей их передать, и как она относится к данному количеству аргументов.
Естественно, что динамическая типизация работать не будет, и если функция принимает 2 инта, а ей отдашь 2 флоата - компилятор их тупо округлит.
j123123 09.05.2014 11:47 # 0
В чистом Си — слабая типизация
j123123 09.05.2014 12:35 # 0
1024-- 09.05.2014 13:17 # +2
wvxvw 09.05.2014 09:07 # +1
j123123 09.05.2014 06:07 # 0