diff --git a/AUTHORS b/AUTHORS index 92c6c0b..9136050 100644 --- a/AUTHORS +++ b/AUTHORS @@ -13,3 +13,5 @@ * rogererens * Thomas Ballinger * Morten Linderud +* Guillermo VayĆ” + diff --git a/bin/hy b/bin/hy index 3668c54..14cf5e0 100755 --- a/bin/hy +++ b/bin/hy @@ -4,26 +4,5 @@ import sys from hy.cmdline import cmdline_handler -class HyQuitter(object): - def __init__(self, name): - self.name = name - - def __repr__(self): - return "Use (%s) or Ctrl-D (i.e. EOF) to exit" % (self.name) - - __str__ = __repr__ - - def __call__(self, code=None): - try: - sys.stdin.close() - except: - pass - raise SystemExit(code) - - -__builtins__.quit = HyQuitter('quit') -__builtins__.exit = HyQuitter('exit') - - if __name__ == '__main__': sys.exit(cmdline_handler("hy", sys.argv)) diff --git a/eg/lxml/parse-tumblr.hy b/eg/lxml/parse-tumblr.hy new file mode 100644 index 0000000..3f61719 --- /dev/null +++ b/eg/lxml/parse-tumblr.hy @@ -0,0 +1,22 @@ +;;; Hy tumblr printer. +;;; Copyright (c) Paul R. Tagliamonte, 2013, MIT/Expat license. + + +(import [urllib2 [urlopen]] + [lxml [etree]] + [sys [argv]]) + + +(defn get-rss-feed-name [tumblr] + (kwapply (.format "http://{tumblr}.tumblr.com/rss") {"tumblr" tumblr})) + +(defn get-rss-feed [tumblr] + (.parse etree (urlopen (get-rss-feed-name tumblr)))) + +(defn print-posts [tumblr] + (for [post (.xpath (get-rss-feed tumblr) "//item/title")] + (print post.text))) + +(if (slice argv 2) + (print-posts (get argv 2)) + (print-posts "this-plt-life")) diff --git a/eg/twisted/get-page.hy b/eg/twisted/get-page.hy new file mode 100644 index 0000000..3d8e4ce --- /dev/null +++ b/eg/twisted/get-page.hy @@ -0,0 +1,45 @@ +;; To run this example, do the following: +;; $ hy get-page.hy http://docs.hylang.org/en/latest/ +;; +;; At which point, you should see output like this: +;; 2013-06-24 23:03:57-0700 [-] Log opened. +;; 2013-06-24 23:03:57-0700 [-] Starting factory +;; 2013-06-24 23:03:57-0700 [HTTPPageGetter,client] Byte count for the content of the HTTP page passed: 11835 +;; 2013-06-24 23:03:57-0700 [HTTPPageGetter,client] Preparing to stop reactor ... +;; 2013-06-24 23:03:57-0700 [HTTPPageGetter,client] Stopping factory +;; 2013-06-24 23:03:57-0700 [-] Main loop terminated. +(import sys) + +(import [twisted.web.client [getPage]] + [twisted.internet [reactor]] + [twisted.python [log]]) + +(defun get-page-size (result) + (print + (+ "Byte count for the content of the HTTP page passed: " + (str (len result))))) + +(defun log-error (err) + (log.msg err)) + +(defun finish (ignore) + (log.msg "Preparing to stop reactor ...") + (reactor.stop)) + +(defun get-page (url) + (let ((d (getPage url))) + (d.addCallback get-page-size) + (d.addErrback log-error) + (d.addCallback finish))) + +(defun caddr (list) + ; This is how you'd do this in CL: + ;(car (cdr (cdr list)))) + ; However, I think this is more efficient in hy: + (get list 2)) + +(if (= __name__ "__main__") + (do + (log.startLogging sys.stdout) + (get-page (caddr sys.argv)) + (reactor.run))) diff --git a/hy/cmdline.py b/hy/cmdline.py index 3d61669..0393e6a 100644 --- a/hy/cmdline.py +++ b/hy/cmdline.py @@ -49,6 +49,31 @@ from hy.models.symbol import HySymbol _machine = Machine(Idle, 1, 0) +try: + import __builtin__ as builtins +except ImportError: + import builtins + + +class HyQuitter(object): + def __init__(self, name): + self.name = name + + def __repr__(self): + return "Use (%s) or Ctrl-D (i.e. EOF) to exit" % (self.name) + + __str__ = __repr__ + + def __call__(self, code=None): + try: + sys.stdin.close() + except: + pass + raise SystemExit(code) + +builtins.quit = HyQuitter('quit') +builtins.exit = HyQuitter('exit') + class HyREPL(code.InteractiveConsole): def runsource(self, source, filename='', symbol='single'): diff --git a/hy/compiler.py b/hy/compiler.py index 4aa8365..d92ede3 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -1421,6 +1421,8 @@ class HyASTCompiler(object): @builds(HyExpression) def compile_expression(self, expression): + if expression == []: + return self.compile_list(expression) fn = expression[0] func = None if isinstance(fn, HyKeyword): diff --git a/hy/macros.py b/hy/macros.py index d3530fd..2c5bc02 100644 --- a/hy/macros.py +++ b/hy/macros.py @@ -70,6 +70,9 @@ _wrappers = { def process(tree, module_name): if isinstance(tree, HyExpression): + if tree == []: + return tree + fn = tree[0] if fn in ("quote", "quasiquote"): return tree diff --git a/tests/native_tests/language.hy b/tests/native_tests/language.hy index 534ae40..03c62b0 100644 --- a/tests/native_tests/language.hy +++ b/tests/native_tests/language.hy @@ -755,3 +755,8 @@ (continue)) (.append y x)) (assert (= y [5]))) + +(defn test-empty-list [] + "Evaluate an empty list to a []" + (assert (= () []))) + diff --git a/tests/test_bin.py b/tests/test_bin.py index 79d20fa..4cdfb58 100644 --- a/tests/test_bin.py +++ b/tests/test_bin.py @@ -91,3 +91,10 @@ def test_hy2py(): assert len(ret[1]) > 1, f assert len(ret[2]) == 0, f assert i + + +def test_bin_hy_builtins(): + import hy.cmdline # NOQA + + assert str(exit) == "Use (exit) or Ctrl-D (i.e. EOF) to exit" + assert str(quit) == "Use (quit) or Ctrl-D (i.e. EOF) to exit"