🚀 use `std::ostream` to unify `nas_ref` output

This commit is contained in:
ValKmjolnir 2022-09-23 21:45:08 +08:00
parent c4cac512a6
commit 6ef22d3228
5 changed files with 52 additions and 57 deletions

View File

@ -509,8 +509,8 @@ nas_ref builtin_print(nas_ref* local,nasal_gc& gc)
case vm_nil: std::cout<<"nil"; break; case vm_nil: std::cout<<"nil"; break;
case vm_num: std::cout<<i.num(); break; case vm_num: std::cout<<i.num(); break;
case vm_str: std::cout<<i.str(); break; case vm_str: std::cout<<i.str(); break;
case vm_vec: i.vec().print(); break; case vm_vec: std::cout<<i.vec(); break;
case vm_hash: i.hash().print(); break; case vm_hash: std::cout<<i.hash(); break;
case vm_func: std::cout<<"func(..){..}";break; case vm_func: std::cout<<"func(..){..}";break;
case vm_obj: std::cout<<"<object>"; break; case vm_obj: std::cout<<"<object>"; break;
} }

View File

@ -489,8 +489,8 @@ nas_ref builtin_print(nas_ref* local,nasal_gc& gc)
case vm_nil: std::cout<<"nil"; break; case vm_nil: std::cout<<"nil"; break;
case vm_num: std::cout<<i.num(); break; case vm_num: std::cout<<i.num(); break;
case vm_str: std::cout<<i.str(); break; case vm_str: std::cout<<i.str(); break;
case vm_vec: i.vec().print(); break; case vm_vec: std::cout<<i.vec(); break;
case vm_hash: i.hash().print(); break; case vm_hash: std::cout<<i.hash(); break;
case vm_func: std::cout<<"func(..){..}";break; case vm_func: std::cout<<"func(..){..}";break;
case vm_obj: std::cout<<"<object>"; break; case vm_obj: std::cout<<"<object>"; break;
} }

View File

@ -8,6 +8,8 @@
#include <dirent.h> #include <dirent.h>
#else #else
#pragma warning (disable:4566) // i know i'm using utf-8, fuck you #pragma warning (disable:4566) // i know i'm using utf-8, fuck you
#define _CRT_SECURE_NO_DEPRECATE 1
#define _CRT_NONSTDC_NO_DEPRECATE 1
#include <io.h> #include <io.h>
#include <direct.h> #include <direct.h>
#endif #endif
@ -29,20 +31,17 @@
#define environ (*_NSGetEnviron()) #define environ (*_NSGetEnviron())
#endif #endif
void print_core(std::vector<nas_ref>& elems)
{
for(auto& i:elems)
i.print();
}
nas_ref builtin_print(nas_ref* local,nasal_gc& gc) nas_ref builtin_print(nas_ref* local,nasal_gc& gc)
{ {
print_core(local[1].vec().elems); for(auto& i:local[1].vec().elems)
std::cout<<i;
std::cout<<std::flush; std::cout<<std::flush;
return nil; return nil;
} }
nas_ref builtin_println(nas_ref* local,nasal_gc& gc) nas_ref builtin_println(nas_ref* local,nasal_gc& gc)
{ {
print_core(local[1].vec().elems); for(auto& i:local[1].vec().elems)
std::cout<<i;
std::cout<<std::endl; std::cout<<std::endl;
return nil; return nil;
} }
@ -112,12 +111,10 @@ nas_ref builtin_fout(nas_ref* local,nasal_gc& gc)
nas_ref str=local[2]; nas_ref str=local[2];
if(val.type!=vm_str) if(val.type!=vm_str)
return nas_err("io::fout","\"filename\" must be string"); return nas_err("io::fout","\"filename\" must be string");
if(str.type!=vm_str)
return nas_err("io::fout","\"str\" must be string");
std::ofstream fout(val.str()); std::ofstream fout(val.str());
if(fout.fail()) if(fout.fail())
return nas_err("io::fout","cannot open <"+val.str()+">"); return nas_err("io::fout","cannot open <"+val.str()+">");
fout<<str.str(); fout<<str;
return nil; return nil;
} }
nas_ref builtin_split(nas_ref* local,nasal_gc& gc) nas_ref builtin_split(nas_ref* local,nasal_gc& gc)
@ -780,9 +777,9 @@ nas_ref builtin_opendir(nas_ref* local,nasal_gc& gc)
if(path.type!=vm_str) if(path.type!=vm_str)
return nas_err("opendir","\"path\" must be string"); return nas_err("opendir","\"path\" must be string");
#ifdef _MSC_VER #ifdef _MSC_VER
WIN32_FIND_DATA data; WIN32_FIND_DATAA data;
HANDLE p; HANDLE p;
p=FindFirstFile((path.str()+"\\*.*").c_str(),&data); p=FindFirstFileA((path.str()+"\\*.*").c_str(),&data);
if(p==INVALID_HANDLE_VALUE) if(p==INVALID_HANDLE_VALUE)
return nas_err("opendir","cannot open dir <"+path.str()+">"); return nas_err("opendir","cannot open dir <"+path.str()+">");
#else #else

View File

@ -86,7 +86,7 @@ struct nas_ref
// number and string can be translated to each other // number and string can be translated to each other
f64 tonum(); f64 tonum();
string tostr(); string tostr();
void print(); friend std::ostream& operator<<(std::ostream&,nas_ref&);
bool objchk(u32); bool objchk(u32);
inline nas_ref* addr(); inline nas_ref* addr();
inline u32 ret (); inline u32 ret ();
@ -107,7 +107,7 @@ struct nas_vec
std::vector<nas_ref> elems; std::vector<nas_ref> elems;
nas_vec():printed(false){} nas_vec():printed(false){}
void print(); friend std::ostream& operator<<(std::ostream&,nas_vec&);
usize size(){return elems.size();} usize size(){return elems.size();}
nas_ref get_val(const i32); nas_ref get_val(const i32);
nas_ref* get_mem(const i32); nas_ref* get_mem(const i32);
@ -119,7 +119,7 @@ struct nas_hash
std::unordered_map<string,nas_ref> elems; std::unordered_map<string,nas_ref> elems;
nas_hash():printed(false){} nas_hash():printed(false){}
void print(); friend std::ostream& operator<<(std::ostream&,nas_hash&);
usize size(){return elems.size();} usize size(){return elems.size();}
nas_ref get_val(const string&); nas_ref get_val(const string&);
nas_ref* get_mem(const string&); nas_ref* get_mem(const string&);
@ -268,23 +268,21 @@ nas_ref* nas_vec::get_mem(const i32 n)
return nullptr; return nullptr;
return &elems[n>=0?n:n+size]; return &elems[n>=0?n:n+size];
} }
void nas_vec::print() std::ostream& operator<<(std::ostream& out,nas_vec& vec)
{ {
if(!elems.size() || printed) if(!vec.elems.size() || vec.printed)
{ {
std::cout<<(elems.size()?"[..]":"[]"); out<<(vec.elems.size()?"[..]":"[]");
return; return out;
} }
printed=true; vec.printed=true;
usize iter=0; usize iter=0;
usize size=elems.size(); usize size=vec.elems.size();
std::cout<<'['; out<<'[';
for(auto& i:elems) for(auto& i:vec.elems)
{ out<<i<<",]"[(++iter)==size];
i.print(); vec.printed=false;
std::cout<<",]"[(++iter)==size]; return out;
}
printed=false;
} }
nas_ref nas_hash::get_val(const string& key) nas_ref nas_hash::get_val(const string& key)
@ -325,24 +323,21 @@ nas_ref* nas_hash::get_mem(const string& key)
} }
return nullptr; return nullptr;
} }
void nas_hash::print() std::ostream& operator<<(std::ostream& out,nas_hash& hash)
{ {
if(!elems.size() || printed) if(!hash.elems.size() || hash.printed)
{ {
std::cout<<(elems.size()?"{..}":"{}"); out<<(hash.elems.size()?"{..}":"{}");
return; return out;
} }
printed=true; hash.printed=true;
usize iter=0; usize iter=0;
usize size=elems.size(); usize size=hash.elems.size();
std::cout<<'{'; out<<'{';
for(auto& i:elems) for(auto& i:hash.elems)
{ out<<i.first<<':'<<i.second<<",}"[(++iter)==size];
std::cout<<i.first<<':'; hash.printed=false;
i.second.print(); return out;
std::cout<<",}"[(++iter)==size];
}
printed=false;
} }
void nas_func::clear() void nas_func::clear()
@ -400,20 +395,21 @@ string nas_ref::tostr()
} }
return ""; return "";
} }
void nas_ref::print() std::ostream& operator<<(std::ostream& out,nas_ref& ref)
{ {
switch(type) switch(ref.type)
{ {
case vm_none: std::cout<<"undefined"; break; case vm_none: out<<"undefined"; break;
case vm_nil: std::cout<<"nil"; break; case vm_nil: out<<"nil"; break;
case vm_num: std::cout<<val.num; break; case vm_num: out<<ref.val.num; break;
case vm_str: std::cout<<str(); break; case vm_str: out<<ref.str(); break;
case vm_vec: vec().print(); break; case vm_vec: out<<ref.vec(); break;
case vm_hash: hash().print(); break; case vm_hash: out<<ref.hash(); break;
case vm_func: std::cout<<"func(..){..}";break; case vm_func: out<<"func(..){..}";break;
case vm_obj: std::cout<<"<object>"; break; case vm_obj: out<<"<object>"; break;
case vm_co: std::cout<<"<coroutine>"; break; case vm_co: out<<"<coroutine>"; break;
} }
return out;
} }
bool nas_ref::objchk(u32 objtype) bool nas_ref::objchk(u32 objtype)
{ {

View File

@ -4,6 +4,8 @@
#ifndef _MSC_VER #ifndef _MSC_VER
#include <unistd.h> #include <unistd.h>
#else #else
#define _CRT_SECURE_NO_DEPRECATE 1
#define _CRT_NONSTDC_NO_DEPRECATE 1
#include <io.h> #include <io.h>
#endif #endif