From 0afbbeb68c88215fc440a0d3f8723f6070f6f658 Mon Sep 17 00:00:00 2001 From: Paul Tagliamonte Date: Sun, 12 Jan 2014 18:53:08 -0500 Subject: [PATCH 01/18] Add (recur) for functions and stuff. --- hy/contrib/loop.hy | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/hy/contrib/loop.hy b/hy/contrib/loop.hy index 73526fa..91b24d9 100644 --- a/hy/contrib/loop.hy +++ b/hy/contrib/loop.hy @@ -55,6 +55,23 @@ (recursive-replace old-term new-term term)] [True term]) [term body]))) + +(defmacro/g! fnr [signature &rest body] + (let [[new-body (recursive-replace 'recur g!recur-fn body)]] + `(do + (import [hy.contrib.loop [--trampoline--]]) + (def ~g!recur-fn + (--trampoline-- (fn [~@signature] + ~@new-body))) + ~g!recur-fn))) + +(defmacro defnr [name lambda-list &rest body] + (if (not (= (type name) HySymbol)) + (macro-error name "defnr takes a name as first argument")) + `(setv ~name (fnr ~lambda-list ~@body))) + + + (defmacro loop [bindings &rest body] ;; Use inside functions like so: ;; (defun factorial [n] From 5b78735011d43cf4a95e780c4885bfeb8e9123d8 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Mon, 13 Jan 2014 16:15:43 +0100 Subject: [PATCH 02/18] hy/cmdline.py: Add support for running with --spy -i There's no reason why one would need to choose between --spy and -i, so pass down options.spy to run_icommand, and then to HyREPL, so we can have both. Signed-off-by: Gergely Nagy --- hy/cmdline.py | 6 +++--- tests/test_bin.py | 8 ++++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/hy/cmdline.py b/hy/cmdline.py index b09595f..98f10cd 100644 --- a/hy/cmdline.py +++ b/hy/cmdline.py @@ -214,8 +214,8 @@ def run_repl(hr=None, spy=False): return 0 -def run_icommand(source): - hr = HyREPL() +def run_icommand(source, spy=False): + hr = HyREPL(spy) hr.runsource(source, filename='', symbol='single') return run_repl(hr) @@ -270,7 +270,7 @@ def cmdline_handler(scriptname, argv): if options.icommand: # User did "hy -i ..." - return run_icommand(options.icommand) + return run_icommand(options.icommand, spy=options.spy) if options.args: if options.args[0] == "-": diff --git a/tests/test_bin.py b/tests/test_bin.py index d18dd31..3d3f3e1 100644 --- a/tests/test_bin.py +++ b/tests/test_bin.py @@ -76,6 +76,14 @@ def test_bin_hy_icmd(): assert "figlet" in output +def test_bin_hy_icmd_and_spy(): + ret = run_cmd("hy -i \"(+ [] [])\" --spy", "(+ 1 1)") + assert ret[0] == 0 + output = ret[1] + + assert "([] + [])" in output + + def test_bin_hy_missing_file(): ret = run_cmd("hy foobarbaz") assert ret[0] == 2 From 5a64f187264eef2ef9a8bcffac6ad3adc0ca5a3d Mon Sep 17 00:00:00 2001 From: Paul Tagliamonte Date: Mon, 13 Jan 2014 20:37:25 -0500 Subject: [PATCH 03/18] Refactor (loop) in terms of fnr; change to use decorator. --- hy/contrib/loop.hy | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/hy/contrib/loop.hy b/hy/contrib/loop.hy index 91b24d9..2c2690a 100644 --- a/hy/contrib/loop.hy +++ b/hy/contrib/loop.hy @@ -1,6 +1,7 @@ ;;; Hy tail-call optimization ;; ;; Copyright (c) 2014 Clinton Dreisbach +;; Copyright (c) 2014 Paul R. Tagliamonte ;; ;; Permission is hereby granted, free of charge, to any person obtaining a ;; copy of this software and associated documentation files (the "Software"), @@ -60,19 +61,19 @@ (let [[new-body (recursive-replace 'recur g!recur-fn body)]] `(do (import [hy.contrib.loop [--trampoline--]]) - (def ~g!recur-fn - (--trampoline-- (fn [~@signature] - ~@new-body))) + (with-decorator + --trampoline-- + (def ~g!recur-fn (fn [~@signature] ~@new-body))) ~g!recur-fn))) + (defmacro defnr [name lambda-list &rest body] (if (not (= (type name) HySymbol)) (macro-error name "defnr takes a name as first argument")) `(setv ~name (fnr ~lambda-list ~@body))) - -(defmacro loop [bindings &rest body] +(defmacro/g! loop [bindings &rest body] ;; Use inside functions like so: ;; (defun factorial [n] ;; (loop [[i n] @@ -84,13 +85,7 @@ ;; If recur is used in a non-tail-call position, None is returned, which ;; causes chaos. Fixing this to detect if recur is in a tail-call position ;; and erroring if not is a giant TODO. - (with-gensyms [recur-fn] - (let [[fnargs (map (fn [x] (first x)) bindings)] - [initargs (map second bindings)] - [new-body (recursive-replace 'recur recur-fn body)]] - `(do - (import [hy.contrib.loop [--trampoline--]]) - (def ~recur-fn - (--trampoline-- (fn [~@fnargs] - ~@new-body))) - (~recur-fn ~@initargs))))) + (let [[fnargs (map (fn [x] (first x)) bindings)] + [initargs (map second bindings)]] + `(do (defnr ~g!recur-fn [~@fnargs] ~@body) + (~g!recur-fn ~@initargs)))) From 25459177ebd380dbf2808a940914bab051439380 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Tue, 14 Jan 2014 05:59:44 +0200 Subject: [PATCH 04/18] Move "hy on meth" example to eg/. --- eg/flask/meth_example.hy | 27 +++++++++++++++++++++++++++ hy/contrib/meth.hy | 30 ++---------------------------- 2 files changed, 29 insertions(+), 28 deletions(-) create mode 100644 eg/flask/meth_example.hy diff --git a/eg/flask/meth_example.hy b/eg/flask/meth_example.hy new file mode 100644 index 0000000..4df70d7 --- /dev/null +++ b/eg/flask/meth_example.hy @@ -0,0 +1,27 @@ +;;; Simple Flask application +;;; +;;; Requires to have Flask installed +;;; +;;; You can test it via: +;;; +;;; $ curl 127.0.0.1:5151 +;;; $ curl -X POST 127.0.0.1:5151/post +;;; $ curl -X POST 127.0.0.1:5151/both +;;; $ curl 127.0.0.1:5151/both + +(import [flask [Flask]]) + +(require hy.contrib.meth) + +(setv app (Flask "__main__")) + +(route get-index "/" [] + (str "Hy world!")) + +(post-route post-index "/post" [] + (str "Hy post world!")) + +(route-with-methods both-index "/both" ["GET" "POST"] [] + (str "Hy to both worlds!")) + +(apply app.run [] {"port" 5151}) diff --git a/hy/contrib/meth.hy b/hy/contrib/meth.hy index 18203ea..11e637c 100644 --- a/hy/contrib/meth.hy +++ b/hy/contrib/meth.hy @@ -1,5 +1,5 @@ -;;; Meth -;; based on paultag's meth library to access a Flask based application +;;; Hy on Meth +;;; based on paultag's meth library to access a Flask based application (defmacro route-with-methods [name path methods params &rest code] "Same as route but with an extra methods array to specify HTTP methods" @@ -25,29 +25,3 @@ (defmacro delete-route [name path params &rest code] "Delete request" `(route-with-methods ~name ~path ["DELETE"] ~params ~@code)) - - -;;; Simple example application -;;; Requires to have Flask installed - -;; (import [flask [Flask]]) -;; (setv app (Flask "__main__")) - -;; (require hy.contrib.meth) - -;; (print "setup / with GET") -;; (route get-index "/" [] (str "Hy world!")) - -;; (print "setup /post with POST") -;; (post-route post-index "/post" [] (str "Hy post world!")) - -;; (route-with-methods both-index "/both" [] -;; (str "Hy to both worlds!") ["GET" "POST"]) - -;; (.run app) - -;;; Now you can do: -;;; curl 127.0.0.1:5000 -;;; curl -X POST 127.0.0.1:5000/post -;;; curl -X POST 127.0.0.1:5000/both -;;; curl 127.0.0.1:5000/both From a619295dd7807ec75145572979cdaefda7bdc353 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Mon, 13 Jan 2014 21:41:01 +0100 Subject: [PATCH 05/18] bin/hy2py: Add a bunch of command-line options The hy2py tool has been very useful for me, but most of the time, it's only a part of its output that one is interested in. The whole output, with source code, AST and python code together is one big monstrosity. So instead of printing all that, lets have a few handy command-line options to control which part gets printed. By default, only the generated python source is, as that's what the name of the tool implies. Also, don't run it. That's what hy is for. Signed-off-by: Gergely Nagy --- bin/hy2py | 45 ++++++++++++++++++++++++++++++--------------- tests/test_bin.py | 2 +- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/bin/hy2py b/bin/hy2py index 3af8a62..3bcade4 100755 --- a/bin/hy2py +++ b/bin/hy2py @@ -1,24 +1,39 @@ #!/usr/bin/env python from __future__ import print_function +from hy.importer import (import_file_to_ast, import_file_to_hst) -from hy.importer import (import_file_to_ast, import_file_to_module, - import_file_to_hst) +import argparse +import sys import astor.codegen -import sys module_name = "" -hst = import_file_to_hst(sys.argv[1]) -print(str(hst).encode("utf-8")) -print("") -print("") -_ast = import_file_to_ast(sys.argv[1], module_name) -print("") -print("") -print(astor.dump(_ast).encode("utf-8")) -print("") -print("") -print(astor.codegen.to_source(_ast).encode("utf-8")) +parser = argparse.ArgumentParser( + prog="hy2py", + usage="%(prog)s [options] FILE", + formatter_class=argparse.RawDescriptionHelpFormatter) +parser.add_argument("--with-source", "-s", action="store_true", + help="Show the parsed source structure") +parser.add_argument("--with-ast", "-a", action="store_true", + help="Show the generated AST") +parser.add_argument("--without-python", "-np", action="store_true", + help="Do not show the python code generated from the AST") +parser.add_argument('args', nargs=argparse.REMAINDER, help=argparse.SUPPRESS) -import_file_to_module(module_name, sys.argv[1]) +options = parser.parse_args(sys.argv[1:]) + +if options.with_source: + hst = import_file_to_hst(options.args[0]) + print(str(hst).encode("utf-8")) + print() + print() + +_ast = import_file_to_ast(options.args[0], module_name) +if options.with_ast: + print(astor.dump(_ast).encode("utf-8")) + print() + print() + +if not options.without_python: + print(astor.codegen.to_source(_ast).encode("utf-8")) diff --git a/tests/test_bin.py b/tests/test_bin.py index d18dd31..d3ac8a2 100644 --- a/tests/test_bin.py +++ b/tests/test_bin.py @@ -126,7 +126,7 @@ def test_hy2py(): for f in filenames: if f.endswith(".hy"): i += 1 - ret = run_cmd("bin/hy2py " + os.path.join(dirpath, f)) + ret = run_cmd("bin/hy2py -s -a " + os.path.join(dirpath, f)) assert ret[0] == 0, f assert len(ret[1]) > 1, f assert len(ret[2]) == 0, f From 65e9d5ae7eb33a46bff5c2baba5cb4f126bd04ac Mon Sep 17 00:00:00 2001 From: rubberduckdev Date: Thu, 16 Jan 2014 01:25:43 +0200 Subject: [PATCH 06/18] Missing "of" --- docs/language/api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/language/api.rst b/docs/language/api.rst index 96c4086..b38e38c 100644 --- a/docs/language/api.rst +++ b/docs/language/api.rst @@ -36,7 +36,7 @@ languages. Builtins ======== -Hy features a number special forms that are used to help generate +Hy features a number of special forms that are used to help generate correct Python AST. The following are "special" forms, which may have behavior that's slightly unexpected in some situations. From 7d5399570ca8a92c9fafbb9c24a4a99a4df49406 Mon Sep 17 00:00:00 2001 From: rubberduckdev Date: Thu, 16 Jan 2014 01:45:34 +0200 Subject: [PATCH 07/18] Missing comma --- docs/language/api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/language/api.rst b/docs/language/api.rst index 96c4086..d0200e1 100644 --- a/docs/language/api.rst +++ b/docs/language/api.rst @@ -89,7 +89,7 @@ The following code demonstrates this: --- `->>` or `threading tail macro` is similar to `threading macro` but instead of -inserting each expression into the next expression’s first argument place it +inserting each expression into the next expression’s first argument place, it appends it as the last argument. The following code demonstrates this: .. code-block:: clj From 8bfa4f33fc1193941a6bf5c41474f06798b91241 Mon Sep 17 00:00:00 2001 From: Nicolas Dandrimont Date: Wed, 15 Jan 2014 23:55:33 +0100 Subject: [PATCH 08/18] Add set comprehensions, dict comprehensions and generator expressions Closes: #14 (woo, two-digit tickets) --- hy/_compat.py | 1 + hy/compiler.py | 113 +++++++++++++++++++++++++++------ tests/native_tests/language.hy | 37 ++++++++++- 3 files changed, 130 insertions(+), 21 deletions(-) diff --git a/hy/_compat.py b/hy/_compat.py index 37bb023..096282a 100644 --- a/hy/_compat.py +++ b/hy/_compat.py @@ -38,6 +38,7 @@ except ImportError: (x >> 24) & 0xff])) import sys +PY27 = sys.version_info >= (2, 7) PY3 = sys.version_info[0] >= 3 PY33 = sys.version_info >= (3, 3) PY34 = sys.version_info >= (3, 4) diff --git a/hy/compiler.py b/hy/compiler.py index 6e65b30..e9be303 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -39,7 +39,7 @@ from hy.errors import HyCompileError, HyTypeError import hy.macros from hy.macros import require, macroexpand -from hy._compat import str_type, long_type, PY33, PY3, PY34 +from hy._compat import str_type, long_type, PY27, PY33, PY3, PY34 import hy.importer import traceback @@ -1265,41 +1265,114 @@ class HyASTCompiler(object): ctx=ast.Load()) return ret + def _compile_generator_iterables(self, trailers): + """Helper to compile the "trailing" parts of comprehensions: + generators and conditions""" + + generators = trailers.pop(0) + + cond = self.compile(trailers.pop(0)) if trailers != [] else Result() + + gen_it = iter(generators) + paired_gens = zip(gen_it, gen_it) + + gen_res = Result() + gen = [] + for target, iterable in paired_gens: + comp_target = self.compile(target) + target = self._storeize(comp_target) + gen_res += self.compile(iterable) + gen.append(ast.comprehension( + target=target, + iter=gen_res.force_expr, + ifs=[])) + + if cond.expr: + gen[-1].ifs.append(cond.expr) + + return gen_res + cond, gen + @builds("list_comp") @checkargs(min=2, max=3) def compile_list_comprehension(self, expr): # (list-comp expr (target iter) cond?) expr.pop(0) expression = expr.pop(0) - tar_it = iter(expr.pop(0)) - targets = zip(tar_it, tar_it) - cond = self.compile(expr.pop(0)) if expr != [] else Result() - - generator_res = Result() - generators = [] - for target, iterable in targets: - comp_target = self.compile(target) - target = self._storeize(comp_target) - generator_res += self.compile(iterable) - generators.append(ast.comprehension( - target=target, - iter=generator_res.force_expr, - ifs=[])) - - if cond.expr: - generators[-1].ifs.append(cond.expr) + gen_res, gen = self._compile_generator_iterables(expr) compiled_expression = self.compile(expression) - ret = compiled_expression + generator_res + cond + ret = compiled_expression + gen_res ret += ast.ListComp( lineno=expr.start_line, col_offset=expr.start_column, elt=compiled_expression.force_expr, - generators=generators) + generators=gen) return ret + @builds("set_comp") + @checkargs(min=2, max=3) + def compile_set_comprehension(self, expr): + if PY27: + ret = self.compile_list_comprehension(expr) + expr = ret.expr + ret.expr = ast.SetComp( + lineno=expr.lineno, + col_offset=expr.col_offset, + elt=expr.elt, + generators=expr.generators) + + return ret + + expr[0] = HySymbol("list_comp").replace(expr[0]) + expr = HyExpression([HySymbol("set"), expr]).replace(expr) + return self.compile(expr) + + @builds("dict_comp") + @checkargs(min=3, max=4) + def compile_dict_comprehension(self, expr): + if PY27: + expr.pop(0) # dict-comp + key = expr.pop(0) + value = expr.pop(0) + + gen_res, gen = self._compile_generator_iterables(expr) + + compiled_key = self.compile(key) + compiled_value = self.compile(value) + ret = compiled_key + compiled_value + gen_res + ret += ast.DictComp( + lineno=expr.start_line, + col_offset=expr.start_column, + key=compiled_key.force_expr, + value=compiled_value.force_expr, + generators=gen) + + return ret + + # In Python 2.6, turn (dict-comp key value [foo]) into + # (dict (list-comp (, key value) [foo])) + + expr[0] = HySymbol("list_comp").replace(expr[0]) + expr[1:3] = [HyExpression( + [HySymbol(",")] + + expr[1:3] + ).replace(expr[1])] + expr = HyExpression([HySymbol("dict"), expr]).replace(expr) + return self.compile(expr) + + @builds("genexpr") + def compile_genexpr(self, expr): + ret = self.compile_list_comprehension(expr) + expr = ret.expr + ret.expr = ast.GeneratorExp( + lineno=expr.lineno, + col_offset=expr.col_offset, + elt=expr.elt, + generators=expr.generators) + return ret + @builds("apply") @checkargs(min=1, max=3) def compile_apply_expression(self, expr): diff --git a/tests/native_tests/language.hy b/tests/native_tests/language.hy index 11bf01a..cb75e66 100644 --- a/tests/native_tests/language.hy +++ b/tests/native_tests/language.hy @@ -525,7 +525,7 @@ (assert (= x 3)))) -(defn test-comprehensions [] +(defn test-list-comprehensions [] "NATIVE: test list comprehensions" (assert (= (list-comp (* x 2) (x (range 2))) [0 2])) (assert (= (list-comp (* x 2) (x (range 4)) (% x 2)) [2 6])) @@ -536,6 +536,41 @@ (assert (= (list-comp j (j [1 2])) [1 2]))) +(defn test-set-comprehensions [] + "NATIVE: test set comprehensions" + (assert (instance? set (set-comp x [x (range 2)]))) + (assert (= (set-comp (* x 2) (x (range 2))) (set [0 2]))) + (assert (= (set-comp (* x 2) (x (range 4)) (% x 2)) (set [2 6]))) + (assert (= (set-comp (* y 2) ((, x y) (.items {"1" 1 "2" 2}))) + (set [2 4]))) + (assert (= (set-comp (, x y) (x (range 2) y (range 2))) + (set [(, 0 0) (, 0 1) (, 1 0) (, 1 1)]))) + (assert (= (set-comp j (j [1 2])) (set [1 2])))) + + +(defn test-dict-comprehensions [] + "NATIVE: test dict comprehensions" + (assert (instance? dict (dict-comp x x [x (range 2)]))) + (assert (= (dict-comp x (* x 2) (x (range 2))) {1 2 0 0})) + (assert (= (dict-comp x (* x 2) (x (range 4)) (% x 2)) {3 6 1 2})) + (assert (= (dict-comp x (* y 2) ((, x y) (.items {"1" 1 "2" 2}))) + {"2" 4 "1" 2})) + (assert (= (dict-comp (, x y) (+ x y) (x (range 2) y (range 2))) + {(, 0 0) 0 (, 1 0) 1 (, 0 1) 1 (, 1 1) 2}))) + + +(defn test-generator-expressions [] + "NATIVE: test generator expressions" + (assert (not (instance? list (genexpr x [x (range 2)])))) + (assert (= (list (genexpr (* x 2) (x (range 2)))) [0 2])) + (assert (= (list (genexpr (* x 2) (x (range 4)) (% x 2))) [2 6])) + (assert (= (list (sorted (genexpr (* y 2) ((, x y) (.items {"1" 1 "2" 2}))))) + [2 4])) + (assert (= (list (genexpr (, x y) (x (range 2) y (range 2)))) + [(, 0 0) (, 0 1) (, 1 0) (, 1 1)])) + (assert (= (list (genexpr j (j [1 2]))) [1 2]))) + + (defn test-defn-order [] "NATIVE: test defn evaluation order" (setv acc []) From 6c15f14ff715389d0116dc3d6529a357ed9c02f7 Mon Sep 17 00:00:00 2001 From: rubberduckdev Date: Thu, 16 Jan 2014 02:13:05 +0200 Subject: [PATCH 09/18] Correcting a typo --- docs/language/api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/language/api.rst b/docs/language/api.rst index 96c4086..0776f40 100644 --- a/docs/language/api.rst +++ b/docs/language/api.rst @@ -283,7 +283,7 @@ do / progn the `do` and `progn` forms are used to evaluate each of their arguments and return the last one. Return values from every other than the last argument are discarded. It can be used in `lambda` or `list-comp` to perform more complex -logic as show by one of the examples. +logic as shown by one of the examples. Some example usage: From e50ca4fc078df08c5a8bd9c45e8eb19bc176f4a9 Mon Sep 17 00:00:00 2001 From: Yuval Langer Date: Wed, 15 Jan 2014 18:44:16 +0200 Subject: [PATCH 10/18] Correcting typos. --- AUTHORS | 1 + docs/hacking.rst | 2 +- docs/language/api.rst | 4 ++-- docs/tutorial.rst | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/AUTHORS b/AUTHORS index 09c2e2e..0d77a98 100644 --- a/AUTHORS +++ b/AUTHORS @@ -35,3 +35,4 @@ * Thom Neale * Tuukka Turto * Vasudev Kamath +* Yuval Langer diff --git a/docs/hacking.rst b/docs/hacking.rst index 0a35898..4329c68 100644 --- a/docs/hacking.rst +++ b/docs/hacking.rst @@ -97,7 +97,7 @@ core team. Additional review is clearly welcome, but we need a minimum of 2 signoffs for any change. If a core member is sending in a PR, please find 2 core members that don't -include them PR submitter. The idea here is that one can work with the PR +include the PR submitter. The idea here is that one can work with the PR author, and a second acks the entire change set. If the change is adding documentation, feel free to just merge after one diff --git a/docs/language/api.rst b/docs/language/api.rst index 96c4086..7ae94f8 100644 --- a/docs/language/api.rst +++ b/docs/language/api.rst @@ -430,7 +430,7 @@ defmacro `defmacro` is used to define macros. The general format is `(defmacro [parameters] expr)`. -Following example defines a macro that can be used to swap order of elements in +The following example defines a macro that can be used to swap order of elements in code, allowing the user to write code in infix notation, where operator is in between the operands. @@ -1167,7 +1167,7 @@ yield The generator is iterable and therefore can be used in loops, list comprehensions and other similar constructs. -Especially the second example shows how generators can be used to generate +The function random-numbers shows how generators can be used to generate infinite series without consuming infinite amount of memory. .. code-block:: clj diff --git a/docs/tutorial.rst b/docs/tutorial.rst index c856cf7..819b7cd 100644 --- a/docs/tutorial.rst +++ b/docs/tutorial.rst @@ -406,7 +406,7 @@ The same thing in Hy:: ... [3, 2, 1, 4] -See how we use kwapply to handle the fancy pssing? :) +See how we use kwapply to handle the fancy passing? :) There's also a dictionary-style keyword arguments construction that looks like: From 685a1b80fa19e0d91d5e3a7b835587d6cdd2e9a9 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Thu, 16 Jan 2014 14:08:18 +0200 Subject: [PATCH 11/18] Silence a "Title underline too short" warning. --- docs/language/core.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/language/core.rst b/docs/language/core.rst index deaf16b..1b31dc7 100644 --- a/docs/language/core.rst +++ b/docs/language/core.rst @@ -9,7 +9,7 @@ Core Functions .. _is-coll-fn: coll? ----- +----- .. versionadded:: 0.9.13 From ceb615d0102f92fee4703fb888f73f57d9ec5e2c Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Mon, 13 Jan 2014 22:19:25 +0100 Subject: [PATCH 12/18] hy/lex/parser.py: Move most of the identifier mangling into a def As a refactoring step, move the identifier mangling done in t_identifier into a separate def. Signed-off-by: Gergely Nagy --- hy/lex/parser.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/hy/lex/parser.py b/hy/lex/parser.py index 72f0d8f..1eee798 100644 --- a/hy/lex/parser.py +++ b/hy/lex/parser.py @@ -242,14 +242,19 @@ def t_identifier(p): if obj.startswith("&"): return HyLambdaListKeyword(obj) - if obj.startswith("*") and obj.endswith("*") and obj not in ("*", "**"): - obj = obj[1:-1].upper() + def mangle(p): + if p.startswith("*") and p.endswith("*") and p not in ("*", "**"): + p = p[1:-1].upper() - if "-" in obj and obj != "-": - obj = obj.replace("-", "_") + if "-" in p and p != "-": + p = p.replace("-", "_") - if obj.endswith("?") and obj != "?": - obj = "is_%s" % (obj[:-1]) + if p.endswith("?") and p != "?": + p = "is_%s" % (p[:-1]) + + return p + + obj = mangle(obj) return HySymbol(obj) From e49ad3b3d5c53f236db6c8f747a4c64424104f89 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Mon, 13 Jan 2014 22:27:44 +0100 Subject: [PATCH 13/18] tests/lex/test_lex.py: Add a few tests to cover identifier mangling Signed-off-by: Gergely Nagy --- tests/lex/test_lex.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tests/lex/test_lex.py b/tests/lex/test_lex.py index af9f286..e8b7a9c 100644 --- a/tests/lex/test_lex.py +++ b/tests/lex/test_lex.py @@ -266,3 +266,31 @@ def test_lex_comment_382(): """Ensure that we can tokenize sources with a comment at the end""" entry = tokenize("foo ;bar\n;baz") assert entry == [HySymbol("foo")] + + +def test_lex_mangling_star(): + """Ensure that mangling starred identifiers works according to plan""" + entry = tokenize("*foo*") + assert entry == [HySymbol("FOO")] + entry = tokenize("*") + assert entry == [HySymbol("*")] + entry = tokenize("*foo") + assert entry == [HySymbol("*foo")] + + +def test_lex_mangling_hyphen(): + """Ensure that hyphens get translated to underscores during mangling""" + entry = tokenize("foo-bar") + assert entry == [HySymbol("foo_bar")] + entry = tokenize("-") + assert entry == [HySymbol("-")] + + +def test_lex_mangling_qmark(): + """Ensure that identifiers ending with a question mark get mangled ok""" + entry = tokenize("foo?") + assert entry == [HySymbol("is_foo")] + entry = tokenize("?") + assert entry == [HySymbol("?")] + entry = tokenize("im?foo") + assert entry == [HySymbol("im?foo")] From 8ef02a54b5f3e6471963eac6c1308f043dfd7e24 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Mon, 13 Jan 2014 22:36:53 +0100 Subject: [PATCH 14/18] hy/lex/parser.py: Add support for sub-object mangling With this patch, every identifier is split up along dots, each part gets separately mangled, and then it is all joined back together. This allows for fun stuff like (.foo? (Foo)), and even more contrived examples. Signed-off-by: Gergely Nagy --- hy/lex/parser.py | 2 +- tests/lex/test_lex.py | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/hy/lex/parser.py b/hy/lex/parser.py index 1eee798..f7264fb 100644 --- a/hy/lex/parser.py +++ b/hy/lex/parser.py @@ -254,7 +254,7 @@ def t_identifier(p): return p - obj = mangle(obj) + obj = ".".join([mangle(part) for part in obj.split(".")]) return HySymbol(obj) diff --git a/tests/lex/test_lex.py b/tests/lex/test_lex.py index e8b7a9c..93f862c 100644 --- a/tests/lex/test_lex.py +++ b/tests/lex/test_lex.py @@ -294,3 +294,11 @@ def test_lex_mangling_qmark(): assert entry == [HySymbol("?")] entry = tokenize("im?foo") assert entry == [HySymbol("im?foo")] + entry = tokenize(".foo?") + assert entry == [HySymbol(".is_foo")] + entry = tokenize("foo.bar?") + assert entry == [HySymbol("foo.is_bar")] + entry = tokenize("foo?.bar") + assert entry == [HySymbol("is_foo.bar")] + entry = tokenize(".foo?.bar.baz?") + assert entry == [HySymbol(".is_foo.bar.is_baz")] From a35ecc41bd925888b7c6572b556974d2960ba346 Mon Sep 17 00:00:00 2001 From: Foxboron Date: Tue, 14 Jan 2014 02:38:16 +0100 Subject: [PATCH 15/18] Fix reader macros to actually be macros --- docs/language/readermacros.rst | 34 +++++++++++++++++++---------- hy/compiler.py | 21 ++++++++++++++++-- hy/core/macros.hy | 10 --------- hy/lex/parser.py | 4 ++-- hy/macros.py | 20 ++++++++++++++--- tests/lex/test_lex.py | 2 +- tests/native_tests/reader_macros.hy | 18 +++++++++------ 7 files changed, 73 insertions(+), 36 deletions(-) diff --git a/docs/language/readermacros.rst b/docs/language/readermacros.rst index 0c05d9c..a87b98d 100644 --- a/docs/language/readermacros.rst +++ b/docs/language/readermacros.rst @@ -24,19 +24,28 @@ Syntax => #^1+2+3+4+3+2 1+2+3+4+3+2 +Hy got no literal for tuples. Lets say you dislike `(, ...)` and want something +else. This is a problem reader macros are able to solve in a neat way. + +:: + + => (defreader t [expr] `(, ~@expr)) + => #t(1 2 3) + (1, 2, 3) + +You could even do like clojure, and have a litteral for regular expressions! + +:: + + => (import re) + => (defreader r [expr] `(re.compile ~expr)) + => #r".*" + <_sre.SRE_Pattern object at 0xcv7713ph15#> + Implementation ============== -Hy uses ``defreader`` to define the reader symbol, and ``#`` as the dispatch -character. ``#`` expands into ``(dispatch_reader_macro ...)`` where the symbol -and expression is quoted, and then passed along to the correct function:: - - => (defreader ^ ...) - => #^() - ;=> (dispatch_reader_macro '^ '()) - - ``defreader`` takes a single character as symbol name for the reader macro, anything longer will return an error. Implementation wise, ``defreader`` expands into a lambda covered with a decorator, this decorater saves the @@ -47,14 +56,17 @@ lambda in a dict with its module name and symbol. => (defreader ^ [expr] (print expr)) ;=> (with_decorator (hy.macros.reader ^) (fn [expr] (print expr))) - -Anything passed along is quoted, thus given to the function defined. +``#`` expands into ``(dispatch_reader_macro ...)`` where the symbol +and expression is passed to the correct function. :: + => #^() + ;=> (dispatch_reader_macro ^ ()) => #^"Hello" "Hello" + .. warning:: Because of a limitation in Hy's lexer and parser, reader macros can't redefine defined syntax such as ``()[]{}``. This will most likely be diff --git a/hy/compiler.py b/hy/compiler.py index e9be303..93e6526 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -38,8 +38,8 @@ from hy.models.dict import HyDict from hy.errors import HyCompileError, HyTypeError import hy.macros -from hy.macros import require, macroexpand from hy._compat import str_type, long_type, PY27, PY33, PY3, PY34 +from hy.macros import require, macroexpand, reader_macroexpand import hy.importer import traceback @@ -1980,7 +1980,7 @@ class HyASTCompiler(object): return ret @builds("defreader") - @checkargs(min=2, max=3) + @checkargs(min=2) def compile_reader(self, expression): expression.pop(0) name = expression.pop(0) @@ -2002,6 +2002,23 @@ class HyASTCompiler(object): return ret + @builds("dispatch_reader_macro") + @checkargs(exact=2) + def compile_dispatch_reader_macro(self, expression): + expression.pop(0) # dispatch-reader-macro + str_char = expression.pop(0) + if not type(str_char) == HyString: + raise HyTypeError( + str_char, + "Trying to expand a reader macro using `{0}' instead " + "of string".format(type(str_char).__name__), + ) + + module = self.module_name + expr = reader_macroexpand(str_char, expression.pop(0), module) + + return self.compile(expr) + @builds("eval_and_compile") def compile_eval_and_compile(self, expression): expression[0] = HySymbol("progn") diff --git a/hy/core/macros.hy b/hy/core/macros.hy index 79d7c12..9219975 100644 --- a/hy/core/macros.hy +++ b/hy/core/macros.hy @@ -181,13 +181,3 @@ (setv -args (cdr (car -args)))) `(apply ~-fun [~@-args] (dict (sum ~-okwargs []))))) - - -(defmacro dispatch-reader-macro [char &rest body] - "Dispatch a reader macro based on the character" - (import [hy.macros]) - (setv str_char (get char 1)) - (if (not (in str_char hy.macros._hy_reader_chars)) - (raise (hy.compiler.HyTypeError char (.format "There is no reader macro with the character `{0}`" str_char)))) - `(do (import [hy.macros [_hy_reader]]) - ((get (get _hy_reader --name--) ~char) ~(get body 0)))) diff --git a/hy/lex/parser.py b/hy/lex/parser.py index 72f0d8f..aac626a 100644 --- a/hy/lex/parser.py +++ b/hy/lex/parser.py @@ -154,8 +154,8 @@ def term_unquote_splice(p): @set_quote_boundaries def hash_reader(p): st = p[0].getstr()[1] - str_object = HyExpression([HySymbol("quote"), HyString(st)]) - expr = HyExpression([HySymbol("quote"), p[1]]) + str_object = HyString(st) + expr = p[1] return HyExpression([HySymbol("dispatch_reader_macro"), str_object, expr]) diff --git a/hy/macros.py b/hy/macros.py index d98b328..b155799 100644 --- a/hy/macros.py +++ b/hy/macros.py @@ -43,7 +43,6 @@ EXTRA_MACROS = [ _hy_macros = defaultdict(dict) _hy_reader = defaultdict(dict) -_hy_reader_chars = set() def macro(name): @@ -85,8 +84,6 @@ def reader(name): module_name = None _hy_reader[module_name][name] = fn - # Ugly hack to get some error handling - _hy_reader_chars.add(name) return fn return _ @@ -209,3 +206,20 @@ def macroexpand_1(tree, module_name): return ntree return tree + + +def reader_macroexpand(char, tree, module_name): + """Expand the reader macro "char" with argument `tree`.""" + load_macros(module_name) + + if not char in _hy_reader[module_name]: + raise HyTypeError( + char, + "`{0}' is not a reader macro in module '{1}'".format( + char, + module_name, + ), + ) + + expr = _hy_reader[module_name][char](tree) + return _wrap_value(expr).replace(tree) diff --git a/tests/lex/test_lex.py b/tests/lex/test_lex.py index af9f286..eb95e80 100644 --- a/tests/lex/test_lex.py +++ b/tests/lex/test_lex.py @@ -258,7 +258,7 @@ def test_reader_macro(): """Ensure reader macros are handles properly""" entry = tokenize("#^()") assert entry[0][0] == HySymbol("dispatch_reader_macro") - assert entry[0][1] == HyExpression([HySymbol("quote"), HyString("^")]) + assert entry[0][1] == HyString("^") assert len(entry[0]) == 3 diff --git a/tests/native_tests/reader_macros.hy b/tests/native_tests/reader_macros.hy index e43220b..84a48a5 100644 --- a/tests/native_tests/reader_macros.hy +++ b/tests/native_tests/reader_macros.hy @@ -23,10 +23,14 @@ (assert (= #+2 3))) -(defn test-reader-macro-compile-docstring [] - "Test if we can compile with a docstring" - (try - (defreader d [] - "Compiles with docstrings") - (except [Exception] - (assert False)))) +(defn test-reader-macros-macros [] + "Test if defreader is actually a macro" + (defreader t [expr] + `(, ~@expr)) + + (def a #t[1 2 3]) + + (assert (= (type a) tuple)) + (assert (= (, 1 2 3) a))) + + From 8ec2719e2d814471e5dfc834d9e1a6c68a20e43e Mon Sep 17 00:00:00 2001 From: f Date: Thu, 16 Jan 2014 11:01:32 +0200 Subject: [PATCH 16/18] Visual and text changes in quickstart page. Kind of beautifying. It also includes transparent versions of Cuddles. --- docs/_static/cuddles-transparent-small.png | Bin 0 -> 38102 bytes docs/_static/cuddles-transparent.png | Bin 0 -> 46963 bytes docs/quickstart.rst | 33 ++++++++++----------- 3 files changed, 16 insertions(+), 17 deletions(-) create mode 100644 docs/_static/cuddles-transparent-small.png create mode 100644 docs/_static/cuddles-transparent.png diff --git a/docs/_static/cuddles-transparent-small.png b/docs/_static/cuddles-transparent-small.png new file mode 100644 index 0000000000000000000000000000000000000000..1570db62db265a1095b17a589b7e688433a5ddd2 GIT binary patch literal 38102 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 literal 0 HcmV?d00001 diff --git a/docs/_static/cuddles-transparent.png b/docs/_static/cuddles-transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..8f16ebdbb4ff15e90ec19ada7cc7769462d04d60 GIT binary patch literal 46963 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 QU^lPzJw2R^U2C<47S1 zAz;Yr14Vv$xG@oq&U-#awPTv+jeDIsAeUExC<)ZGN8I~FO{cH}80pIyB zBiTZcfUM8ocWMfMo=e?gL1OK9%}&bDD_B{fE=psF{1rYu7bjS0iJCn0G+1=BS=PkR zWPKTpCFFe@zCJI!`={z8_Opt$wh;G6>fVn_UQQzIp^(rSJ)6V>&x>*T+gETc90rOa z+t&my$j>;CL^HOktSA!zGBc5O@trzaGuYbD(cQxNB+12EEoDgKiU|zO&fQwtq@L#*fMms|66#&`Sqlei6{3DnVv6h|t6G3sJVL6)GCKV740X>CcALgTbg!5B-|n0@GU zHvF$y37;lIg4J{oPHIZpZp-_8V-8qr`-f1FI53ky$M=IP?9sQK}4zaFFHB>kQ0 zPRNc*Q%qU%_~_|R8Dq{YwBqB6D4MZ*~4c!V{m$lQAZ^Q`*G%`XN5naLb`oKIwu-f>xvjfIsxmh!aN5-A0}Sp60x| zNsgF9M*lXTk&Gs6I3`pOMP<2dhODC;mxPGQX~Aut=(TxAefm9af~r66WKciqu6P7d zw0nJ$B%}(fh7e4&>Z|D-QMe+q8~L7Af0=9%bX;*NAH3K3i3*%oSbc<_sd`uLt{H9R zmYG&%L@eODw4@A5jYOh)B-kjzHYsR}*?+^d{|2~v>Lip5Awd)b<3(}+WvnrOWsu0O zeU7|mI{2?jj~J7>wOYp3v(0pR3~5BlJNv~=E+Z360M8bDa-U}*dct1HEJIy`>=sZo z;lwoH3%0F4s8Xle`B}@+elIQR_ilW`IalTn{%v$_Ka;^L$x1Gv%9xW57W{lBprxW-!q zd#_&XFfaY}Eg-?_v%i561C>YXW&}aoF?z?2DbcwPcK@fJ z2JA@r=~#KD2qLI}v^8_Dq0?CcBt|shfWX)_K0VfDQ#55Ex9hMOPd`*RF&1`ie-&vd z`r^Wh`L z-%|9lT~r?Vddpz+o8#eq5Pm0sS^nPEpW9!w5>5FNLPP?KHJVaKTuI}PI60=8sb`=+ z7+Q_s6}=W>ArkV)BX6W$&V{d$C&NQAGrRw+DF1C;el6dDqjFJvb-X-rnkT{L!oBrx zqZgvQB`isHzPZ39a?MU4N|n0k<=P?V=U@STZ3Ev|Q;v%Oqy^96VRxy~i0WtxZCt9~ z=9-d-z~p*W8C{8iVZ2UocGH+O5t~a2tBe}lzz>uN0w zbotHwC?BfJ&9!PE8Ja!u$7HFRRy3H%_s+$FKIVC!8%S)IcB=9~HP{_vqBW8mEpvDr?A-iciOXC(lSLJi?vEXaZrR&=+@xcF1Ei>( zc4&+dGgNkg$7X`9Zvq5op6}Z}vhqRsPZ)KwidS<|Vz*OS1C5At9ml1Mg$Rd85Y
  • gp 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 literal 0 HcmV?d00001 diff --git a/docs/quickstart.rst b/docs/quickstart.rst index 5bdb130..79a9255 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -2,20 +2,20 @@ Quickstart ========== -.. image:: _static/cuddles.png +.. image:: _static/cuddles-transparent-small.png :alt: Karen Rustard's Cuddles -(thanks to Karen Rustad for Cuddles!) +(Thanks to Karen Rustad for Cuddles!) -HOW TO GET HY REAL FAST: +**HOW TO GET HY REAL FAST**: -1. create a `Python virtual environment +1. Create a `Virtual Python Environment `_ -2. activate your Python virtual environment -3. ``pip install hy`` -4. start a REPL with ``hy`` -5. type stuff in the REPL:: +2. Activate your Virtual Python Environment +3. Install `hy from PyPI `_ with ``pip install hy`` +4. Start a REPL with ``hy`` +5. Type stuff in the REPL:: => (print "Hy!") Hy! @@ -25,20 +25,19 @@ HOW TO GET HY REAL FAST: etc -6. hit CTRL-D when you're done +6. Hit CTRL-D when you're done OMG! That's amazing! I want to write a hy program. -7. open up an elite programming editor -8. type:: +7. Open up an elite programming editor and type:: - (print "i was going to code in python syntax, but then i got hy") + (print "I was going to code in python syntax, but then I got hy.") -9. save as ``test_program_of_awesome.hy`` -10. run:: +8. Save as ``awesome.hy`` +9. And run your first Hy program:: - hy test_program_of_awesome.hy + hy awesome.hy -11. take a deep breath so as to not hyperventilate -12. smile villainously and sneak off to your hydeaway and do +10. Take a deep breath so as to not hyperventilate +11. Smile villainously and sneak off to your hydeaway and do unspeakable things From d4bc17461ca6eff97829319d4c491cb1a0c3ef0a Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Fri, 17 Jan 2014 04:04:23 +0200 Subject: [PATCH 17/18] Add @f to AUTHORS. --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 0d77a98..775db60 100644 --- a/AUTHORS +++ b/AUTHORS @@ -36,3 +36,4 @@ * Tuukka Turto * Vasudev Kamath * Yuval Langer +* Fatih Kadir Akın From 27962fb4412f2cbc1bdd664702d0e1cb2bc0198b Mon Sep 17 00:00:00 2001 From: Nicolas Dandrimont Date: Fri, 17 Jan 2014 20:28:24 +0100 Subject: [PATCH 18/18] Light copy-editing --- docs/language/readermacros.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/language/readermacros.rst b/docs/language/readermacros.rst index a87b98d..392feb6 100644 --- a/docs/language/readermacros.rst +++ b/docs/language/readermacros.rst @@ -24,7 +24,7 @@ Syntax => #^1+2+3+4+3+2 1+2+3+4+3+2 -Hy got no literal for tuples. Lets say you dislike `(, ...)` and want something +Hy has no literal for tuples. Lets say you dislike `(, ...)` and want something else. This is a problem reader macros are able to solve in a neat way. :: @@ -33,7 +33,7 @@ else. This is a problem reader macros are able to solve in a neat way. => #t(1 2 3) (1, 2, 3) -You could even do like clojure, and have a litteral for regular expressions! +You could even do like clojure, and have a literal for regular expressions! ::