- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 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
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
#include <stdio.h>
#include <stdlib.h>
#define RW(a, c) for(src = (a);src < (c); src++, dst++){*dst=*src;}
void *pairscan(char *p)
{
size_t p_count = 1;
do {
if(*p == 'P') {
p_count++;
}
else {
p_count--;
}
p++;
} while(p_count != 0);
return p;
}
void rewrite(char *src, char *dst)
{
int p_r = 0;
while(*src == 'P') {
*dst = *src;
src++; dst++;
if (p_r < 3)
{
p_r++;
}
}
if(*src == 'I') {
if(p_r < 1) {
while(*src != 0) {
*dst = *src;
src++; dst++;
}
*dst = 0;
return;
}
dst--;
src++;
//src = pairscan(src+1);
while(*src != 0) {
*dst = *src;
src++; dst++;
}
*dst = 0;
return;
}
if(*src == 'K') {
if(p_r < 2)
{
while(*src != 0) {
*dst = *src;
src++; dst++;
}
*dst = 0;
return;
}
dst-=2;
char *exp1 = pairscan(src+1);
char *exp2 = pairscan(exp1);
RW(src+1,exp1);
for(; src < exp2; src++){}
while(*src != 0) {
*dst = *src;
src++; dst++;
}
*dst = 0;
return;
}
if(*src == 'S') {
if(p_r < 3) {
while(*src != 0){
*dst = *src;
src++; dst++;
}
*dst = 0;
return;
}
dst-=1;
char *exp1 = pairscan(src+1);
char *exp2 = pairscan(exp1);
char *exp3 = pairscan(exp2);
RW(src+1,exp1);
RW(exp2,exp3);
*dst = 'P';
dst++;
RW(exp1,exp2);
RW(exp2,exp3);
while(*src != 0) {
*dst = *src;
src++; dst++;
}
*dst = 0;
return;
}
*dst = 0;
return;
}
j123123 # 0
Там описывается через какие-то скобочки, ну типа там вот
Ix => x
Kxy = ((K x) y) => x
Sxyz = (((S x) y) z) => xz(yz)
Но это вообще питушня какая-то. Вместо скобочек можно использовать P.
PIx = Ix
PPKxy = Kxy
PPPSxyz = Sxyz
где x y z это типа хрень или P хрень хрень
Так что можно подобную питушню эффективно свести к тупому переписыванию текстушни
и никакие скобочки нахрен не всрались
https://wandbox.org/permlink/JEV7GQ5jF4HUMBvp
j123123 # 0 ⇈
j123123 # 0 ⇈
CHayT # 0 ⇈
j123123 # 0 ⇈
CHayT # 0 ⇈
> В ней вместо P используется ` на конце. Её через стек легко реализовать, кстати.
Тьфу, перепутал со своим диалектом.
CHayT # 0 ⇈
CHayT # 0
Потому что в SKI должно быть можно нясоздавать бесконечно большие термы.
Возьмём такой терм: PPPSIIPPSII. Он эквивалентен ((λ x. x x) (λ x. x x)). Его кобеняция ня должна завершаться никогда, и для неё нужно бесконячно много памяти, так как он себя бесконячно реплицирует. А твоя прога завершается.
j123123 # 0 ⇈
Подожду когда разработают астральный компьютер с бесконечной памятью.
CHayT # 0 ⇈
j123123 # 0 ⇈
Поскольку питуля может разрастаться только в кобенаторе S, я добавил проверки исключительно в него.
Хотя конечно можно и получше заоптимизировать.
j123123 # 0 ⇈
j123123 # 0 ⇈
j123123 # 0
bormand # 0 ⇈
j123123 # 0 ⇈
Был же тут какой-то еблан в свое время, носился с каким-то своим сраным WCT, нахуя кому оно было нужно?
j123123 # 0 ⇈
bormand # 0 ⇈
CHayT # 0 ⇈
j123123 # 0 ⇈
j123123 # 0 ⇈
bormand # 0 ⇈
CHayT # 0 ⇈
bormand # 0 ⇈
j123123 # 0 ⇈
MAKAKA # 0 ⇈
Хорошо, что я знаю так много хуёвых языков, на фоне которых С++ выглядит отлично
j123123 # 0 ⇈
MAKAKA # 0 ⇈
PolinaAksenova # 0 ⇈
MAKAKA # 0 ⇈
тогда придется разделить шаблоны на два сорта
* препроцессорные (которые высирают AST)
* постпроцессорные (которые уже с AST работают)
j123123 # 0 ⇈
Валидна или не валидна программа вначале - вообще пофиг. После метушения разберемся.
MAKAKA # 0 ⇈
PolinaAksenova # 0 ⇈
j123123 # 0 ⇈
MAKAKA # 0 ⇈
можно ли так?
https://govnokod.ru/27420#comment627054