txlyre 1 年之前
父节点
当前提交
afa376d523
共有 4 个文件被更改,包括 86 次插入25 次删除
  1. 5 0
      langs/wm/.history
  2. 1 1
      langs/wm/Dockerfile
  3. 41 18
      langs/wm/wm.c
  4. 39 6
      langs/wm/wma.py

+ 5 - 0
langs/wm/.history

@@ -0,0 +1,5 @@
+0x18
+0xd
+0xa
+0x6
+0x51

+ 1 - 1
langs/wm/Dockerfile

@@ -5,7 +5,7 @@ COPY ./wm/wm.c ./wm.c
 COPY ./wm/wma.py /usr/bin/wma
 RUN chmod +x /usr/bin/wma
 RUN chmod 705 /usr/bin/wma 
-RUN gcc -Os -ansi wm.c -o /usr/bin/wm
+RUN gcc -Os -ansi wm.c -o /usr/bin/wm -lm
 RUN rm wm.c
 RUN chmod +x /usr/bin/wm
 RUN chmod 705 /usr/bin/wm

+ 41 - 18
langs/wm/wm.c

@@ -9,10 +9,11 @@
 #include<sys/stat.h>
 #include<fcntl.h>
 #include<string.h>
+#include<math.h>
 #ifndef LLONG_MAX
 #  define LLONG_MAX 9223372036854775807LL
 #endif
-typedef int I;typedef char C;typedef C*S;typedef size_t Z;typedef signed long long L;typedef void V;typedef V*P;typedef V**PP;typedef unsigned char U;typedef unsigned long long UL;
+typedef int I;typedef char C;typedef C*S;typedef size_t Z;typedef signed long long L;typedef void V;typedef V*P;typedef V**PP;typedef unsigned char U;typedef unsigned long long UL;typedef double D;
 #define R return
 #define K 1
 #define Rk return 1
@@ -23,33 +24,55 @@ typedef int I;typedef char C;typedef C*S;typedef size_t Z;typedef signed long lo
 #define DF(a)default:{a}}
 #define ELIF else if
 #define LP()while(1)
-I D=0;Z SZ=5120,MZ=65535,EZ=65535,JZ=10;L*m;L sp=-K,jp=-K;U lo=0;L**mm=0;L mi=0;
-V d(){L p=m[0]-K;L o=p>=0&&p<MZ?m[p]:0;fprintf(stderr,"[wm] stopped at address: 0x%llx (value = 0x%llx); last instruction: 0x%x\n",p,o,lo);fprintf(stderr,"[wm] stack pointer: 0x%llx.\n",(UL)(EZ+sp));fputs("[wm] jump frame:\n",stderr);L i;for(i=0;i<JZ;i++){if(i>=10){fputs("...\n",stderr);break;}fprintf(stderr, "    #%-5lld0x%llx%s\n",i,m[JA+i],i==jp?" (here)":"");if(mi){fprintf(stderr,"[wm] memory banks (%lld total):\n",mi);for(i=0;i<mi;i++){fprintf(stderr,"    #%-5lld (%s)",i,mm[i]?"in use":"free");}}}}
-V e(S s,...){fflush(stderr);fprintf(stderr,"[wm] error: ");va_list a;va_start(a,s);vfprintf(stderr,s,a);va_end(a);putchar('\n');d();exit(1);}
+I ST=0;I Du=0;I DD=0;Z SZ=5120,MZ=65535,EZ=65535,JZ=10;L*m;L sp=-K,jp=-K;U lo=0;L**mm=0;L mi=0;
+V d(){L p=m[0]-K;L o=p>=0&&p<MZ?m[p]:0;fprintf(stderr,"[wm] stopped at address: 0x%llx (value = 0x%llx); last instruction: 0x%x\n",p,o,lo);fprintf(stderr,"[wm] stack pointer: 0x%llx.\n",(UL)(EZ+sp));fputs("[wm] jump frame:\n",stderr);L i;for(i=0;i<JZ;i++){if(i>=10){fputs("...\n",stderr);break;}fprintf(stderr, "    #%-5lld0x%llx%s\n",i,m[JA+i],i==jp?" (here)":"");}if(mi){fprintf(stderr,"[wm] memory banks (%lld total):\n",mi);for(i=0;i<mi;i++)fprintf(stderr,"    0x%-5llx (%s)\n",i,mm[i]?"in use":"free");}}
+V e(S s,...){fflush(stderr);fprintf(stderr,"[wm] error: ");va_list a;va_start(a,s);vfprintf(stderr,s,a);va_end(a);putchar('\n');d();exit(K);}
 P a(Z z){P r=malloc(z);if(!r)e("out of memory.");R r;}
 P ra(P p,Z z){P r=realloc(p,z);if(!r)e("out of memory.");R r;}
-V l(S s,FILE*f){m[0]=K;if(!f)e("can't open file '%s'.",s);Z i=K;U b[8];LP(){Z z=fread(b,K,8,f);if(!z)break;if(z!=8){I pz=ftell(f);if(pz<0)e("decoding of the image '%s' failed.",s);else e("decoding of the image '%s' failed near byte at #%ld.",s,pz-z);}if(i>=LLONG_MAX)e("image '%s' is too large (max. = %lld).",s,LLONG_MAX);if(i>=EZ)e("image '%s' doesn't fit into the memory (size = %ld).",s,EZ);m[i++]=(((L)b[0])&0xff)|((((L)b[K])&0xff)<<8)|((((L)b[2])&0xff)<<16)|((((L)b[3])&0xff)<<24)|((((L)b[4])&0xff)<<32)|((((L)b[5])&0xff)<<40)|((((L)b[6])&0xff)<<48)|((((L)b[7])&0xff)<<56);if(D){if(m[i-1]<1)fprintf(stderr,"%04lu:%08lld ",i-2,m[i-1]);else fprintf(stderr,"%04lu:%08llx ",i-2,m[i-1]);if((i-1)%4==0)fputs("\n",stderr);}}if(D){fprintf(stderr,"(%lu)\n\n",i-1);}}
+V l(S s,FILE*f){m[0]=K;if(!f)e("can't open file '%s'.",s);Z i=K;U b[8];LP(){Z z=fread(b,K,8,f);if(!z)break;if(z!=8){I pz=ftell(f);if(pz<0)e("decoding of the image '%s' failed.",s);else e("decoding of the image '%s' failed near byte at #%ld.",s,pz-z);}if(i>=LLONG_MAX)e("image '%s' is too large (max. = %lld).",s,LLONG_MAX);if(i>=EZ)e("image '%s' doesn't fit into the memory (size = %ld).",s,EZ);m[i++]=(((L)b[0])&0xff)|((((L)b[K])&0xff)<<8)|((((L)b[2])&0xff)<<16)|((((L)b[3])&0xff)<<24)|((((L)b[4])&0xff)<<32)|((((L)b[5])&0xff)<<40)|((((L)b[6])&0xff)<<48)|((((L)b[7])&0xff)<<56);if(Du){if(m[i-1]<1)fprintf(stderr,"%04lu:%08lld ",i-2,m[i-1]);else fprintf(stderr,"%04lu:%08llx ",i-2,m[i-1]);if((i-1)%4==0)fputs("\n",stderr);}}if(Du){fprintf(stderr,"\n(%lu)\n",i-1);if(!DD)fputs("\n",stderr);}}
 V pj(L a){if(jp>=0&&jp>=JZ)e("jump frame overflow.");m[++jp+JA]=a;}
 L tj(){if(jp<0)e("jump frame underflow.");R m[JA+jp--];}
 L lj(){if(jp<0)e("jump frame underflow.");R m[JA+jp];}
 Z g(){if(m[0]>=MZ)m[0]=K;R m[m[0]++];}
 L iL(){C b[64];if(!fgets(b,SIZ(b),stdin))R 0;R strtoll(b,0,10);}
-V ro(I);L r(L);V w(L,L);V j(I a){if(a==-1){free(m);exit(0);}ELIF(a==-5)a=tj();if(a<0||a>=MZ)e("attempt to jump to an illegal address: 0x%x.",a);m[0]=a;}
+V ro(I);L r(L);V w(L,L);V j(I a){if(a==-K){ST=1;R;}ELIF(a==-5)a=tj();if(a<0||a>=MZ)e("attempt to jump to an illegal address: 0x%x.",a);m[0]=a;}
 S rS(L e){L i=e;S s=a(K);Z k=0,z=K;LP(){I c=r(i++);if(c<=0)break;if(k==z-K){z++;s=ra(s,z);}s[k++]=c;}s[i]=0;R s;}
 V fo(L a){L re=a++;I m=r(a++);S n=rS(r(a));I mo=m;m=m==0?O_WRONLY:m==K?(O_RDONLY|O_CREAT):m==2?O_RDWR:m==3?O_APPEND:-K;if(m<0)e("illegal mode flag: 0x%x.",mo);I dc=open(n,m);free(n);w(re,dc);}
 V fw(L a){I dc=r(a++);L re=a++;S s=rS(r(a));Z z=strlen(s);L c=write(dc,s,z);free(s);w(re,c);}
 Z wS(L a,S s){Z i=0;while(s[i++])w(a+i,s[i-1]);w(a+i,0);R i;}
 V fr(L e){I dc=r(e++);Z z=r(e++);S s=a(z+1);w(e++,read(dc,s,z));wS(r(e)-K,s);free(s);}
 V fs(L a){I dc=r(a++);I o=r(a++);I w=r(a);I wo=w;w=w==0?SEEK_SET:w==1?SEEK_CUR:w==2?SEEK_END:-K;if(w<0)e("illegal seek mode: 0x%x.",wo);lseek(dc,o,w);}
-L aM(Z z){I i;for(i=0;i<mi;i++){if(!mm[i])mm[i]=a(SIZ(L)*z);R i;}mm=ra(mm,SIZ(P)*++mi);mm[mi-K]=a(SIZ(L)*z);R mi;}
+L aM(Z z){I i;for(i=0;i<mi;i++){if(!mm[i])mm[i]=a(SIZ(L)*z);R i;}mi++;mm=ra(mm,SIZ(L*)*mi);mm[mi-1]=a(SIZ(L)*z);R mi-1;}
 V aF(L i){free(mm[i]);mm[i]=0;}
-L mR(L v){L i=r(v);L p=r(v+K);if(i<0||i>=mi||!mm[i])e("attempt to write to an illegal memory bank index: 0x%x.",i);if(p<0||p>=64)e("attempt to write to an illegal memory bank pointer: 0x%x (index: 0x%x).",p,i);R mm[i][p];}
-V mW(L v){L i=r(v);L p=r(v+K);L a=r(v+2);if(i<0||i>=mi||!mm[i])e("attempt to write to an illegal memory bank index: 0x%x.",i);if(p<0||p>=64)e("attempt to write to an illegal memory bank pointer: 0x%x (index: 0x%x).",p,i);mm[i][p]=a;}
-V mF(L v){L i=r(v);if(i<0||i>=mi||!mm[i])e("attempt to deallocate an illegal memory bank index: 0x%x.",i);aF(i);}
-L r(L a){if(a==-K)R getchar();ELIF(a==-2)R 0;ELIF(a==-3)Rk;ELIF(a==-4)R-K;ELIF(a==-5)R lj();ELIF(a==-6)R time(0);ELIF(a==-7)R MZ+sp;ELIF(a==-8)R EZ;ELIF(a==-9)R SZ;ELIF(a==-10)R MZ;ELIF(a==-11)R JZ;ELIF(a==-12)R iL();ELIF(a==-13){R aM(64);}if(a<0||a>=MZ)e("attempt to read from an illegal address: 0x%x.",a);R m[a];}
-V w(L a,L v){if(a==-K){putchar(v);R;}ELIF(a==-2){printf("%lld",v);R;}ELIF(a==-5){pj(v);R;}ELIF(a==-6){usleep(v);R;}ELIF(a==-7){sp=v-MZ;R;}ELIF(a==-8){fo(v);R;}ELIF(a==-9){if(v>=0)close(v);R;}ELIF(a==-10){fr(v);R;}ELIF(a==-11){fw(v);R;}ELIF(a==-12){fs(v);R;}ELIF(a==-13)SW(r(v))CS(0,w(v,aM(64));)CS(K,mF(v);)CS(2,mW(v);)CS(3,mR(v);)DF(w(v,-1);)if(a<0||a>=MZ)e("attempt to write (value = 0x%x) to an illegal address: 0x%x.",v,a);m[a]=v;}
+L mR(L v){L i=r(v+K);L p=r(v+2);if(i<0||i>=mi||!mm[i])e("attempt to write to an illegal memory bank: 0x%x.",i);if(p<0||p>=64)e("attempt to write to an illegal memory bank: 0x%x (pointer: 0x%x).",i,p);R mm[i][p];}
+V mW(L v){L i=r(v+K);L p=r(v+2);L a=r(v+3);if(i<0||i>=mi||!mm[i])e("attempt to write to an illegal memory bank: 0x%x.",i);if(p<0||p>=64)e("attempt to write to an illegal memory bank: 0x%x (pointer: 0x%x).",i,p);mm[i][p]=a;}
+V mF(L v){L i=r(v+K);if(i<0||i>=mi||!mm[i])e("attempt to deallocate an illegal memory bank: 0x%x.",i);aF(i);}
+#define DR0(x,p)case x:{p}break
+#define DR1(x,p)case x:a=r(v+1);w(v+1,(p));break
+#define DR2(x,p)case x:a=r(v+1);b=r(v+2);w(v+2,(p));break
+#define DR3(x,p)case x:a=r(v+1);b=r(v+2);c=r(v+3);w(v+3,(p));break
+L mO(L a,L b){if(b==0)e("modulo by zero.");R a%b;}
+L dI(L a,L b){if(b==0)e("division by zero.");R a/b;}
 V pu(L v){if(sp>=0&&sp>=SZ)e("stack overflow (size = %d).",SZ);if(sp<0)sp=0;m[MZ+sp++]=v;}
 L po(){if(sp<0)e("stack underflow.");R m[MZ+--sp];}
+L riD(D d){L l;memcpy(&l,&d,SIZ(l));R l;}
+D riL(L l){D d;memcpy(&d,&l,SIZ(d));R d;}
+L eX(I k){exit(k);R -1;}L ouD(L a){D d=riL(a);printf("%g",d);R a;}
+D dvD(D a,D b){if(b==0)e("division by zero.");R a/b;}
+D mdD(D a,D b){if(b==0)e("modulo by zero.");R fmod(a,b);}
+V cP(L v){L d=r(v);L a,b,c;
+SW(d)DR1(0,~a);DR2(1,b&a);DR2(2,b|a);
+  DR2(3,b^a);DR2(4,b<<a);DR2(5,b>>a);
+  DR2(6,a==0?0:a<0?-1:1);DR2(7,b+a);
+  DR2(8,b-a);DR2(9,b*a);DR2(10,dI(b,a));
+  DR2(11,mO(b,a));DR2(12,pow(b,a));DR1(13,riD(sqrt(riL(a))));
+  DR2(70,riD(riL(b)+riL(a)));DR2(71,riD(riL(b)-riL(a)));
+  DR2(72,riD(riL(b)*riL(a)));DR2(73,riD(dvD(riL(b),riL(a))));
+  DR2(74,riD(mdD(riL(b),riL(a))));DR2(75,riD(powf(riL(b),riL(a))));
+  DR1(80,eX(a));DR1(81,ouD(a));
+  DR0(40,a=po();pu(a);pu(a););DR0(41,a=po();b=po();pu(b);pu(a););DR0(42,po(););DF(e("illegal special directive: 0x%llx.",d);)}
+L r(L a){if(a==-K)R getchar();ELIF(a==-2)R 0;ELIF(a==-3)Rk;ELIF(a==-4)R-K;ELIF(a==-5)R lj();ELIF(a==-6)R time(0);ELIF(a==-7)R MZ+sp;ELIF(a==-8)R EZ;ELIF(a==-9)R SZ;ELIF(a==-10)R MZ;ELIF(a==-11)R JZ;ELIF(a==-12)R iL();ELIF(a==-13){R aM(64);}if(a<0||a>=MZ)e("attempt to read from an illegal address: 0x%x.",a);R m[a];}
+V w(L a,L v){if(a==-K){putchar(v);R;}ELIF(a==-2){printf("%lld",v);R;}ELIF(a==-5){pj(v);R;}ELIF(a==-6){usleep(v);R;}ELIF(a==-7){sp=v-MZ;R;}ELIF(a==-8){fo(v);R;}ELIF(a==-9){if(v>=0)close(v);R;}ELIF(a==-10){fr(v);R;}ELIF(a==-11){fw(v);R;}ELIF(a==-12){fs(v);R;}ELIF(a==-13){SW(r(v))CS(0,w(v,aM(64));)CS(K,mF(v);)CS(2,mW(v);)CS(3,w(v,mR(v));)DF(w(v,-1);)R;}ELIF(a==-14){cP(v);R;}else if(-15){R;}if(a<0||a>=MZ)e("attempt to write (value = 0x%x) to an illegal address: 0x%x.",v,a);m[a]=v;}
 #define OP1(x,p)case x:a=g();if(s)break;{p}break
 #define OP2(x,p)case x:a=g();b=g();if(s)break;{p}break
 #define OP3(x,p)case x:a=g();b=g();c=g();if(s)break;{p}break
@@ -65,12 +88,12 @@ SW(o)CS(NOP,);OP3(MVJ,if(a!=b)w(b,r(a));j(c););
  OP2(SSLEZ,w(b,r(b)-r(a));if(r(b)<0)ro(K););
  OP2(ASLEZ,w(b,r(b)+r(a));if(r(b)<0)ro(K););
  OP3(IBNC,t=r(b);w(b,r(a)+K);if(r(b)==t)j(c););
- OP3(VBLZ,t=r(a);if(t==0)e("division by zero.");w(b,r(b)/t);if(r(b)<0)j(c););
+ OP3(VBLZ,t=r(a);w(b,dI(r(b),t));if(r(b)<0)j(c););
  OP3(XBLZ,w(b,r(b)^r(a));if(r(b)>r(a))j(c););
  OP1(DSLZ,w(a,r(a)-K);if(r(a)<0)ro(K););
  OP2(SSGT,t=r(a)>r(b);w(b,r(b)-r(a));w(a,r(b));if(t)ro(K););
  OP3(MBNZ,if(a!=-3)w(b,r(b)*r(a));if(r(b))j(c););
- OP3(MODBZ,t=r(a);if(t==0)e("modulo by zero.");w(b,r(b)%t);if(!r(b))j(c););
+ OP3(MODBZ,t=r(a);w(b,mO(r(b),t));if(!r(b))j(c););
  OP2(AJA,w(b,r(b)+r(a));j(r(b)););
  OP2(LA,w(b,r(r(a))););OP2(LD,w(b,a););OP1(IA,t=r(r(a));w(t,r(t)+K););
  OP1(JMC,j(m[0]*a););OP1(JW,pj(m[0]);j(a););
@@ -81,13 +104,13 @@ SW(o)CS(NOP,);OP3(MVJ,if(a!=b)w(b,r(a));j(c););
  OP3(ANZ,w(b,r(b)&r(a));if(r(b))j(c););
  OP3(ABGZ,w(b,r(b)+r(a));if(r(b)>0)j(c););
  OP2(SWP,t=r(a);w(a,r(b));w(b,t););DF(e("unrecognized operation: 0x%x.",o);)}
-V rn(){LP()ro(0);}
+V rn(){while(!ST)ro(0);}
 main(I c,S*as){I o;S f=0;
- while((o=getopt(c,as,"ds:j:z:f:"))!=-K){
-  SW(o)CS('d',D=1;);CS('f',f=optarg;);
+ while((o=getopt(c,as,"dDs:j:z:f:"))!=-K){
+  SW(o)CS('d',Du=1;);CS('D',DD=1;);CS('f',f=optarg;);
        CS('s',MZ=strtol(optarg,0,10);if(MZ<=0){fputs("bad -s.\n",stderr);Rk;});
        CS('j',JZ=strtol(optarg,0,10);if(JZ<=0){fputs("bad -j.\n",stderr);Rk;});
        CS('z',SZ=strtol(optarg,0,10);if(SZ<=0){fputs("bad -z.\n",stderr);Rk;});
        CS('?',exit(K););}}
  I i;for(i=optind;i<c;i++)f=as[i];EZ=MZ;MZ+=SZ;MZ+=JZ;
- m=a(SIZ(L)*MZ);if(!f)l("<stdin>",stdin);else{FILE*fd=fopen(f,"rb");l(f,fd);fclose(fd);}rn();free(m);for(i=0;i<mi;i++)if(mm[i])free(mm[i]);}
+ m=a(SIZ(L)*MZ);if(!f)l("<stdin>",stdin);else{FILE*fd=fopen(f,"rb");l(f,fd);fclose(fd);}rn();if(DD){d();}free(m);for(i=0;i<mi;i++)if(mm[i])free(mm[i]);}

+ 39 - 6
langs/wm/wma.py

@@ -51,24 +51,29 @@ command: LABEL? operation
           | ("jmp"|"j") arg -> h_jmp
           | "hlt" -> h_halt
           | "out" arg -> h_out
+          | "outn" arg -> h_outn
           | "in" arg -> h_in
 mixed: arg arg+
 ?arg: INTEGER
+    | DOUBLE
     | CHAR
     | CHARS
-    | QMARK
-    | LABELOFFSET
     | OFFSET
+    | LABELOFFSET
+    | QMARK
+    | NAMEOFFSET
     | NAME
     | rep
 rep: arg "*" COUNT
 COUNT: /[0-9]+/
 INTEGER: /-?[0-9]+/
+DOUBLE: /-?[0-9]+\.[0-9]+/
 CHAR: "'" /./ "'"
 CHARS: "\"" /[^"]*/ "\""
 QMARK: "?"
-OFFSET: "$" /(-|\+)[0-9]+/
-LABELOFFSET: "$" /(-|\+)[A-Za-z][a-zA-Z0-9_]*/ 
+OFFSET: "?" /(-|\+)[0-9]+/
+LABELOFFSET: "?" /(-|\+)[A-Za-z][a-zA-Z0-9_]*/ 
+NAMEOFFSET: /[A-Za-z][a-zA-Z0-9_]*(-|\+)[0-9]+/
 LABEL: /[A-Za-z][a-zA-Z0-9_]*:/
 NAME: /[A-Za-z][a-zA-Z0-9_]*/
 INCLUDE: "+" /.+/
@@ -105,6 +110,8 @@ class WMA:
           self.compile_arg(arg.children[0])
     elif arg.type == "INTEGER":
       self.emit(int(arg.value))
+    elif arg.type == "DOUBLE":
+      self.emit(float(arg.value))
     elif arg.type == "CHAR":
       self.emit(ord(arg.value[1]))
     elif arg.type == "CHARS":
@@ -116,6 +123,12 @@ class WMA:
       self.emit(self.size+int(arg.value[1:])+1)
     elif arg.type == "LABELOFFSET":
       self.emit((False, arg.value[2:], arg.value[1]))
+    elif arg.type == "NAMEOFFSET":
+      n, o = arg.value.split(
+        '+' if '+' in arg.value else '-'
+      )
+
+      self.emit((False, n, '+' if '+' in arg.value else '-', int(o)))
     elif arg.type == "NAME":
       if arg.value == "IO":
         self.emit(-1)
@@ -143,6 +156,10 @@ class WMA:
         self.emit(-12)
       elif arg.value == "MM":
         self.emit(-13)
+      elif arg.value == "DR":
+        self.emit(-14)
+      elif arg.value == "ZZ":
+        self.emit(-15)
       else:
         self.emit((False, arg.value))
 
@@ -320,6 +337,11 @@ class WMA:
       self.compile_arg(op.children[0])
       self.emit(-1)
       self.emit(self.size+2)
+    elif op.data == "h_outn":
+      self.emit(1)
+      self.compile_arg(op.children[0])
+      self.emit(-2)
+      self.emit(self.size+2)
     elif op.data == "h_in":
       self.emit(1)
       self.emit(-1)
@@ -338,7 +360,7 @@ class WMA:
 
         if label in labels:
           raise Exception(f"Duplicated label: {label}.")
-        elif label in ("IO", "Z", "O", "N", "J", "T", "SP", "EZ", "SZ", "MZ", "JZ", "W", "MM"):
+        elif label in ("IO", "Z", "O", "N", "J", "T", "SP", "EZ", "SZ", "MZ", "JZ", "W", "MM", "DR", "ZZ"):
           raise Exception(f"Register override: {label}.")
 
         self.buffer.pop(position)
@@ -359,13 +381,24 @@ class WMA:
         
         if len(this) == 3:
           self.buffer[position] = 1 + (position + labels[label] if this[2] == '+' else position - labels[label])
+        elif len(this) == 4:
+          self.buffer[position] = labels[label] + this[3] if this[2] == '+' else labels[label] - this[3]
         else:
           self.buffer[position] = labels[label]
 
       position += 1
 
   def encode(self):
-    return struct.pack(f"<{'q'*self.size}", *self.buffer)
+    buffer = b""
+    for b in self.buffer:
+      if type(b) is float:
+        b = struct.pack("<d", b)
+      else:
+        b = struct.pack("<q", b)
+
+      buffer += b
+
+    return buffer
 
   def precompile(self, source):
     ast = self.parser.parse(source)