diff stringjs.rhope @ 136:fc3815b7462f

Javascript backend now produces working code for some simple examples, still more of the standard lib that needs to be ported.
author Mike Pavone <pavone@retrodev.com>
date Sun, 14 Nov 2010 23:07:55 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stringjs.rhope	Sun Nov 14 23:07:55 2010 -0500
@@ -0,0 +1,318 @@
+
+
+Blueprint String
+{
+	Buffer
+}
+
+Foreign Javascript:builtin
+{
+	print[val]
+	parseInt[string,base(Int32,Naked):out(Int32,Naked)]
+	_internal_js_eq[left,right:out(Boolean,Naked)]
+	slice@[string,start(Int32,Naked),end(Int32,Naked):out]
+	concat@[left,right:out]
+}
+
+Print@String[string:out]
+{	
+	print[[string]Buffer >>]
+	out <- Yes
+}
+
+Int32@String[string:out]
+{
+	out <- parseInt[[string]Buffer >>, 10]
+}
+
+Hex Int32[str:out]
+{
+	out <- parseInt[[str]Buffer >>, 16]
+}
+
+Flatten@String[string:out]
+{
+	out <- string
+}
+
+Slice@String[string,slicepoint:left,right]
+{
+	If[[slicepoint]>=[[string]Length]]
+	{
+		left <- string
+		right <- ""
+	}{
+		If[[slicepoint]<=[0]]
+		{
+			left <- ""
+			right <- string
+		}{
+			[string]Buffer >>
+			{
+				left <- [Build[String()]]Buffer <<[[~]slice[0,slicepoint]]
+				right <- [Build[String()]]Buffer <<[[~]slice[slicepoint,_internal_js_length[~]]]
+			}
+		}
+	}
+}
+/*
+Byte@String[string,index:out,invalid]
+{
+	out,invalid <- [[string]Buffer >>]Index[index]
+}
+*/
+Length@String[string:out]
+{
+	out <- _internal_js_length[[string]Buffer >>]
+}
+
+Append@String[left,right(String):out]
+{
+	out <- [Build[String()]]Buffer <<[[[left]Buffer >>]concat[[right]Buffer >>]]
+}
+
+=@String[left,right(String):out]
+{
+	out <- [[left]Buffer >>]_internal_js_eq[[right]Buffer >>]
+}
+
+/*
+=Delim[string,delims,index:outindex,after,nomatch]
+{
+	delim <- [delims]Index[index]
+	If[[[string]Length]<[[delim]Length]]
+	{
+		try next <- Yes
+	}{
+		check,mafter <- [string]Slice[[delim]Length]
+		,try next <- If[[check]=[delim]]
+		{
+			outindex <- index
+			after <- Val[mafter]
+		}
+	}
+	Val[try next]
+	{
+		,nomatch <- [delims]Next[index]
+		{
+			outindex,after,nomatch <- =Delim[string,delims,~]
+		}
+	}
+}
+
+Pattern@String[string:out]
+{
+	out <- string
+}
+
+Match@String[string,cmp:num,no match,idx]
+{
+	n <- [string]Length
+	,no match <- If[[string]=[[cmp]Slice[n]]]
+	{
+		num <- Val[n]
+		idx <- 0
+	}
+}
+
+_Partition[string,delims:matched,after,not found]
+{
+	not found <- If[[string]=[""]] {}
+	{
+		[delims]Match[string]
+		{
+			matched,after <- [string]Slice[~]
+		}{
+			[string]Slice[1] {}
+			{ matched,after,not found <- _Partition[~,delims] }
+		}
+	}
+}
+
+Partition[string,delims:before,matched,after,not found]
+{
+	matched,after,not found <- _Partition[string,Pattern[delims]]
+	{ dlen <- Length[~] }
+	{ alen <- Length[~] }
+	before <- [string]Slice[ [[string]Length]-[[dlen]+[alen]] ]
+}
+
+
+Dict Type ID@String[string:out]
+{
+	out <- ID[String()]
+}
+
+Dict Bits@String[string,index:out,invalid]
+{
+	,invalid <- [string]Byte[index]
+	{ out <- UInt32[~] }
+}
+
+_From Dict String[arr,el:out]
+{
+	out <- [arr]Append[Trunc UInt8[el]]
+}
+
+From Dict Key@String[string,data:out]
+{
+	out <- String[Fold[_From Dict String[?], Array[], data]]
+}
+*/
+
+String@String[string:out]
+{
+	out <- string
+}
+
+/*
+Replace[string,otoreplace,with:out]
+{
+	toreplace <- Pattern[otoreplace]
+	,delim,after <-[string]Partition[toreplace]
+	{
+		wt <- Blueprint Of[with]
+		If[ [[[wt]=[String()]] Or [[wt]=[String Slice()]]] Or [[wt]=[String Cat()]] ]
+		{
+			replacement <- with
+		}{
+			,,idx <- [toreplace]Match[delim]
+			replacement <- [with]Index[idx]
+		}
+		out <- [[~]Append[replacement]]Append[Replace[after,toreplace,with]]
+	} {} {} {
+		out <- string
+	}
+}
+
+_Join[list,delim,current,index:out]
+{
+	[list]Next[index]
+	{
+		out <- _Join[list, delim, [[current]Append[delim]]Append[String[[list]Index[~]]], ~]
+	}{
+		out <- current
+	}
+}
+
+Join[list,delim:out]
+{
+	[list]First
+	{
+		out <- _Join[list, delim, String[[list]Index[~]], ~]
+	}{
+		out <- ""
+	}
+}
+
+*/
+
+Starts With[thing,starts with:out]
+{
+	out <- [[thing]Slice[[starts with]Length]] = [starts with]
+}
+
+Ends With[thing,ends with:out]
+{
+	,compare <- [thing]Slice[ [[thing]Length] - [[ends with]Length] ]
+	out <- [compare] = [ends with]
+}
+
+If@String[str:yes,no]
+{
+	yes,no <- If[[str]Length]
+}
+
+/*
+_Split[list,string,delim:out]
+{
+	,,rest <- [string]Partition[delim]
+	{
+		out <- _Split[[list]Append[~], rest, delim]
+	} {} {} {
+		out <- [list]Append[string]
+	}
+}
+
+Split[string,delim:out]
+{
+	If[string]
+	{ out <- _Split[(),string,delim] }
+	{ out <- () }
+}
+*/
+
+In[needle,haystack:out]
+{
+	If[haystack]
+	{
+		out <- If[[[haystack]Slice[Length[needle]]]=[needle]] {}
+		{
+			[haystack]Slice[1] {}
+			{ out <- [needle]In[~] }
+		}
+	}{
+		out <- No
+	}
+}
+
+Left Trim[string,trim:trimmed]
+{
+	If[ [[string]Length] > [0] ]
+	{
+		first,rest <- [string]Slice[1]
+		If[ [first]In[trim] ]
+		{
+			trimmed <- Left Trim[rest, trim]
+		}{
+			trimmed <- string
+		}
+	}{
+		trimmed <- string
+	}
+}
+
+Right Trim[string,trim:trimmed]
+{
+	If[ [[string]Length] > [0] ]
+	{
+		rest,last <- [string]Slice[ [[string]Length] - [1]]
+		If[ [last]In[trim] ]
+		{
+			trimmed <- Right Trim[rest, trim]
+		}{
+			trimmed <- string
+		}
+	}{
+		trimmed <- string
+	}
+}
+
+Trim[string,trim:trimmed]
+{
+	left <- Left Trim[string, trim]
+	trimmed <- Right Trim[left, trim]
+}
+
+/*
+Contains[haystack,needle:out]
+{
+	[haystack]Partition[needle]
+	{
+		out <- Yes	
+	} {} {} {
+		out <- No
+	}
+}
+*/
+
+After[text,prefix:after,not found]
+{
+	If[[text]Starts With[prefix]]
+	{
+		,after <- [text]Slice[[prefix]Length]
+	}{
+		not found <- text
+	}
+}
+