🚀 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_num: std::cout<<i.num(); break;
case vm_str: std::cout<<i.str(); break;
case vm_vec: i.vec().print(); break;
case vm_hash: i.hash().print(); break;
case vm_vec: std::cout<<i.vec(); break;
case vm_hash: std::cout<<i.hash(); break;
case vm_func: std::cout<<"func(..){..}";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_num: std::cout<<i.num(); break;
case vm_str: std::cout<<i.str(); break;
case vm_vec: i.vec().print(); break;
case vm_hash: i.hash().print(); break;
case vm_vec: std::cout<<i.vec(); break;
case vm_hash: std::cout<<i.hash(); break;
case vm_func: std::cout<<"func(..){..}";break;
case vm_obj: std::cout<<"<object>"; break;
}

View File

@ -8,6 +8,8 @@
#include <dirent.h>
#else
#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 <direct.h>
#endif
@ -29,20 +31,17 @@
#define environ (*_NSGetEnviron())
#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)
{
print_core(local[1].vec().elems);
for(auto& i:local[1].vec().elems)
std::cout<<i;
std::cout<<std::flush;
return nil;
}
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;
return nil;
}
@ -112,12 +111,10 @@ nas_ref builtin_fout(nas_ref* local,nasal_gc& gc)
nas_ref str=local[2];
if(val.type!=vm_str)
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());
if(fout.fail())
return nas_err("io::fout","cannot open <"+val.str()+">");
fout<<str.str();
fout<<str;
return nil;
}
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)
return nas_err("opendir","\"path\" must be string");
#ifdef _MSC_VER
WIN32_FIND_DATA data;
WIN32_FIND_DATAA data;
HANDLE p;
p=FindFirstFile((path.str()+"\\*.*").c_str(),&data);
p=FindFirstFileA((path.str()+"\\*.*").c_str(),&data);
if(p==INVALID_HANDLE_VALUE)
return nas_err("opendir","cannot open dir <"+path.str()+">");
#else

View File

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

View File

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