- 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
// https://github.com/seanbaxter/circle/blob/master/examples/README.md#tldr
// ...
// Circle's primary syntactic element is the @meta keyword, which runs the prefixed statement
// during source translation (or during template instantiation in dependent contexts).
// https://github.com/seanbaxter/circle/blob/master/examples/README.md#same-language-reflection
// duff1.cxx
void duff_copy1(char* dest, const char* source, size_t count) {
const char* end = source + count;
while(size_t count = end - source) {
switch(count % 8) {
case 0: *dest++ = *source++; // Fall-through to case 7
case 7: *dest++ = *source++; // Fall-through to case 6...
case 6: *dest++ = *source++;
case 5: *dest++ = *source++;
case 4: *dest++ = *source++;
case 3: *dest++ = *source++;
case 2: *dest++ = *source++;
case 1: *dest++ = *source++;
break;
}
}
}
// Reproduced above is a simplified version of Duff's device, an infamous memcpy function designed
// to reduce the amount of branching in the operation. (The loop is optimally interleaved with the switch,
// but I'm trying to illustrate some other points and don't want to add to the confusion.) Once we enter the
// switch, perform an assignment and unconditionally progress to the next case statement. This algorithm
// cries out for automation. The case statements have indices that run from 8 down to 1, modulo 8. Can we give it the Circle treatment?
// duff2.cxx
void duff_copy2(char* dest, const char* source, size_t count) {
const char* end = source + count;
while(size_t count = end - source) {
switch(count % 8) {
@meta for(int i = 8; i > 0; --i)
case i % 8: *dest++ = *source++;
break;
}
}
Но гомоиконности таким подкостыливанием вы естественно не добавите!
guest6 14.08.2021 20:54 # 0
j123123 14.08.2021 20:56 # 0
GovnokodGovno 14.08.2021 21:01 # 0
3.14159265 14.08.2021 21:17 # 0
ru66oH4uk 14.08.2021 21:19 # +1
@meta
3.14159265 14.08.2021 21:28 # +1
> Circle is a new programming language that extends C++ 20 to support data-driven imperative metaprogramming.
>* An integrated interpreter supports the execution of normal C++ statements at compile time.
Но почему-то в примерах пишет он как на Сишке: fopen, printf, указатели, структы (никаких классов).
Из С++ там только template
ru66oH4uk 14.08.2021 21:32 # +1
GovnokodGovno 14.08.2021 21:31 # 0
Проставлю пиво, если с первого раза угадаешь на каком языке данный кусок кода:
ru66oH4uk 14.08.2021 21:34 # 0
GovnokodGovno 14.08.2021 21:35 # 0
COPOKA 14.08.2021 21:38 # 0
3.14159265 14.08.2021 21:39 # +1
COPOKA 14.08.2021 21:48 # +1
3.14159265 14.08.2021 21:55 # 0
Assembly-Time Variables
When you write something like foo = 3 in FASM, it introduces a new assembly-time variable. Despite the fact that the official FASM manual refers to them as "constants" sometimes (apparently, for historical reasons), they're actually variables: you can change them. Check this out:
COPOKA 14.08.2021 21:59 # 0
GovnokodGovno 15.08.2021 00:28 # 0
ru66oH4uk 14.08.2021 21:44 # +2
COPOKA 14.08.2021 21:47 # 0
ru66oH4uk 14.08.2021 21:47 # 0
COPOKA 14.08.2021 21:57 # 0
Итак, «FPC» с директивой {$X-} не берёт:
https://ideone.com/Mx55zk
С {$X+} тоже не берёт:
https://ideone.com/AQhevR
Оказывается, в «расширенном синтаксисе» он может терять результат вызова функции (вызывать её как процедуру, т. е. как аналог сишной функции с типом результата «void»), но терять результат сложного выражения не может.
Ещё оказалось, что «gpc» зачем-то включили в «Ideone», но я не помню, какой директивой в «gpc» переключается диалект. Пробуем с дефолтными настройками:
https://ideone.com/SUIsth
Не берёт.
Chupacabramiamor 15.08.2021 00:32 # 0