From dccf8061645acc6de3dd336bf9f73f0a9a7be4dd Mon Sep 17 00:00:00 2001 From: Chris Pressey Date: Mon, 28 Jun 2021 21:35:33 +0100 Subject: [PATCH] Implement str builtin in Ruby, JavaScript, and stackmac backends. --- TODO.md | 2 -- src/castile/backends/javascript.py | 1 + src/castile/backends/ruby.py | 4 ++++ src/castile/stackmac.py | 6 ++++++ 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/TODO.md b/TODO.md index b56e514..44ce7d8 100644 --- a/TODO.md +++ b/TODO.md @@ -29,8 +29,6 @@ AST nodes should have source line numbers, it would be really nice. C backend. Other backends (Python? Java? CIL? Scheme?) -Runtime support for `str` in Ruby backend and JavaScript backend. - ### Design ### Convenience: diff --git a/src/castile/backends/javascript.py b/src/castile/backends/javascript.py index fcd9823..8674f4f 100644 --- a/src/castile/backends/javascript.py +++ b/src/castile/backends/javascript.py @@ -36,6 +36,7 @@ def compile(self, ast): var len = function(s) { return s.length; }; var concat = function(s1,s2) { return s1 + s2; }; var substr = function(s,p,k) { return s.substr(p, k); }; +var str = function(n) { return '' + n; }; var repr = function(o) { if (typeof o === "string") { diff --git a/src/castile/backends/ruby.py b/src/castile/backends/ruby.py index f06176f..06a9736 100644 --- a/src/castile/backends/ruby.py +++ b/src/castile/backends/ruby.py @@ -49,6 +49,10 @@ def compile(self, ast): s[p..p+(k-1)] } +str = lambda { |n| + n.to_s +} + def repr o if o == true return "True" diff --git a/src/castile/stackmac.py b/src/castile/stackmac.py index ee21907..ce8ff0b 100644 --- a/src/castile/stackmac.py +++ b/src/castile/stackmac.py @@ -63,6 +63,10 @@ def run(program, strings): s = strings[stack.pop()] strings.append(builtin(s, p, k)) stack.append(len(strings) - 1) + elif name == 'str': + n = stack.pop() + strings.append(builtin(n)) + stack.append(len(strings) - 1) else: raise NotImplementedError(name) elif op == 'rts': @@ -233,4 +237,6 @@ def main(args): arg = int(arg) p.append((op, arg)) + if debug: + print(strings) run(p, strings)