Using backslashes for now; punycode soon.

This commit is contained in:
Paul R. Tagliamonte 2013-04-06 21:33:52 -04:00
parent bac3f6991c
commit 5a96089266
4 changed files with 47 additions and 30 deletions

View File

@ -40,6 +40,13 @@ class HyCompileError(HyError):
_compile_table = {}
def ast_str(foobar):
if sys.version_info[0] >= 3:
return str(foobar)
return str(foobar.encode("ascii", 'backslashreplace'))
def builds(_type):
def _dec(fn):
_compile_table[_type] = fn
@ -188,7 +195,7 @@ class HyASTCompiler(object):
#
# We'll just make sure it's a pure "string", and let it work
# it's magic.
name = str(name)
name = ast_str(name)
else:
# Python2 requires an ast.Name, set to ctx Store.
name = self._storeize(self.compile(name))
@ -264,7 +271,7 @@ class HyASTCompiler(object):
lineno=expr.start_line,
col_offset=expr.start_column,
args=ast.arguments(args=[
ast.Name(arg=str(x), id=str(x),
ast.Name(arg=ast_str(x), id=ast_str(x),
ctx=ast.Param(),
lineno=x.start_line,
col_offset=x.start_column)
@ -296,7 +303,7 @@ class HyASTCompiler(object):
return ast.Import(
lineno=expr.start_line,
col_offset=expr.start_column,
names=[ast.alias(name=str(x), asname=None) for x in expr])
names=[ast.alias(name=ast_str(x), asname=None) for x in expr])
@builds("import_as")
def compile_import_as_expression(self, expr):
@ -305,9 +312,9 @@ class HyASTCompiler(object):
return ast.Import(
lineno=expr.start_line,
col_offset=expr.start_column,
module=str(expr.pop(0)),
names=[ast.alias(name=str(x[0]),
asname=str(x[1])) for x in modlist])
module=ast_str(expr.pop(0)),
names=[ast.alias(name=ast_str(x[0]),
asname=ast_str(x[1])) for x in modlist])
@builds("import_from")
@checkargs(min=1)
@ -316,8 +323,8 @@ class HyASTCompiler(object):
return ast.ImportFrom(
lineno=expr.start_line,
col_offset=expr.start_column,
module=str(expr.pop(0)),
names=[ast.alias(name=str(x), asname=None) for x in expr],
module=ast_str(expr.pop(0)),
names=[ast.alias(name=ast_str(x), asname=None) for x in expr],
level=0)
@builds("get")
@ -460,7 +467,7 @@ class HyASTCompiler(object):
if type(call) != ast.Call:
raise TypeError("kwapplying a non-call")
call.keywords = [ast.keyword(arg=str(x),
call.keywords = [ast.keyword(arg=ast_str(x),
value=self.compile(kwargs[x])) for x in kwargs]
return call
@ -551,7 +558,7 @@ class HyASTCompiler(object):
lineno=expr.start_line,
col_offset=expr.start_column,
value=self.compile(obj),
attr=str(fn),
attr=ast_str(fn),
ctx=ast.Load()),
args=[self.compile(x) for x in expr],
keywords=[],
@ -592,7 +599,7 @@ class HyASTCompiler(object):
# We special case a FunctionDef, since we can define by setting
# FunctionDef's .name attribute, rather then foo == anon_fn. This
# helps keep things clean.
what.name = str(name)
what.name = ast_str(name)
return what
name = self._storeize(self.compile(name))
@ -666,7 +673,7 @@ class HyASTCompiler(object):
args=ast.arguments(
args=[
ast.Name(
arg=str(x), id=str(x),
arg=ast_str(x), id=ast_str(x),
ctx=ast.Param(),
lineno=x.start_line,
col_offset=x.start_column)
@ -700,19 +707,19 @@ class HyASTCompiler(object):
lineno=symbol.start_line,
col_offset=symbol.start_column,
value=self.compile_symbol(glob),
attr=str(local),
attr=ast_str(local),
ctx=ast.Load()
)
return ast.Name(id=str(symbol),
arg=str(symbol),
return ast.Name(id=ast_str(symbol),
arg=ast_str(symbol),
ctx=ast.Load(),
lineno=symbol.start_line,
col_offset=symbol.start_column)
@builds(HyString)
def compile_string(self, string):
return ast.Str(s=str(string), lineno=string.start_line,
return ast.Str(s=ast_str(string), lineno=string.start_line,
col_offset=string.start_column)
@builds(HyDict)

View File

@ -19,11 +19,12 @@
# DEALINGS IN THE SOFTWARE.
from hy.compiler import hy_compile
from hy.lex import tokenize
from hy.core import process
from py_compile import wr_long, MAGIC
from hy.core import process
from hy.lex import tokenize
from io import open
import marshal
import imp
import sys
@ -43,18 +44,12 @@ def import_buffer_to_hst(fd):
def import_file_to_hst(fpath):
return import_buffer_to_hst(open(fpath, 'r'))
return import_buffer_to_hst(open(fpath, 'r', encoding='utf-8'))
def import_file_to_ast(fpath):
tree = import_file_to_hst(fpath)
try:
ast = hy_compile(tree)
except Exception as e:
print("Compilation error at %s:%d,%d"
% (fpath, e.start_line, e.start_column))
print("Compilation error: " + e.message)
raise e.exception
ast = hy_compile(tree)
return ast

View File

@ -23,12 +23,12 @@ import sys
if sys.version_info[0] >= 3:
_str_type = str
str_type = str
else:
_str_type = unicode
str_type = unicode
class HyString(HyObject, _str_type):
class HyString(HyObject, str_type):
"""
Generic Hy String object. Helpful to store string literals from Hy
scripts. It's either a ``str`` or a ``unicode``, depending on the
@ -36,5 +36,5 @@ class HyString(HyObject, _str_type):
"""
def __new__(cls, value):
obj = _str_type.__new__(cls, value)
obj = str_type.__new__(cls, value)
return obj

View File

@ -331,6 +331,21 @@
(assert (= y 123)))
(defn test-symbol-utf-8 []
"NATIVE: test symbol encoded"
(let [[ "love"]
[ "flower"]]
(assert (= (+ ) "flowerlove"))))
(defn test-symbol-dash []
"NATIVE: test symbol encoded"
(let [[- "doublelove"]
[-_- "what?"]]
(assert (= - "doublelove"))
(assert (= -_- "what?"))))
; FEATURE: native hy-eval
;
; - related to bug #64