Merge branch 'master' into pr/438

This commit is contained in:
Nicolas Dandrimont 2014-01-17 20:14:16 +01:00
commit e0f9c9c191
5 changed files with 40 additions and 28 deletions

View File

@ -36,3 +36,4 @@
* Tuukka Turto <tuukka.turto@oktaeder.net> * Tuukka Turto <tuukka.turto@oktaeder.net>
* Vasudev Kamath <kamathvasudev@gmail.com> * Vasudev Kamath <kamathvasudev@gmail.com>
* Yuval Langer <yuval.langer@gmail.com> * Yuval Langer <yuval.langer@gmail.com>
* Fatih Kadir Akın <fka@fatihak.in>

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
docs/_static/cuddles-transparent.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

View File

@ -2,20 +2,20 @@
Quickstart Quickstart
========== ==========
.. image:: _static/cuddles.png .. image:: _static/cuddles-transparent-small.png
:alt: Karen Rustard's Cuddles :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
<https://pypi.python.org/pypi/virtualenv>`_ <https://pypi.python.org/pypi/virtualenv>`_
2. activate your Python virtual environment 2. Activate your Virtual Python Environment
3. ``pip install hy`` 3. Install `hy from PyPI <https://pypi.python.org/pypi/hy>`_ with ``pip install hy``
4. start a REPL with ``hy`` 4. Start a REPL with ``hy``
5. type stuff in the REPL:: 5. Type stuff in the REPL::
=> (print "Hy!") => (print "Hy!")
Hy! Hy!
@ -25,20 +25,19 @@ HOW TO GET HY REAL FAST:
etc 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. OMG! That's amazing! I want to write a hy program.
7. open up an elite programming editor 7. Open up an elite programming editor and type::
8. 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`` 8. Save as ``awesome.hy``
10. run:: 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 10. Take a deep breath so as to not hyperventilate
12. smile villainously and sneak off to your hydeaway and do 11. Smile villainously and sneak off to your hydeaway and do
unspeakable things unspeakable things

View File

@ -1,6 +1,7 @@
;;; Hy tail-call optimization ;;; Hy tail-call optimization
;; ;;
;; Copyright (c) 2014 Clinton Dreisbach <clinton@dreisbach.us> ;; Copyright (c) 2014 Clinton Dreisbach <clinton@dreisbach.us>
;; Copyright (c) 2014 Paul R. Tagliamonte <tag@pault.ag>
;; ;;
;; Permission is hereby granted, free of charge, to any person obtaining a ;; Permission is hereby granted, free of charge, to any person obtaining a
;; copy of this software and associated documentation files (the "Software"), ;; copy of this software and associated documentation files (the "Software"),
@ -55,7 +56,24 @@
(recursive-replace old-term new-term term)] (recursive-replace old-term new-term term)]
[True term]) [term body]))) [True term]) [term body])))
(defmacro loop [bindings &rest body]
(defmacro/g! fnr [signature &rest body]
(let [[new-body (recursive-replace 'recur g!recur-fn body)]]
`(do
(import [hy.contrib.loop [--trampoline--]])
(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/g! loop [bindings &rest body]
;; Use inside functions like so: ;; Use inside functions like so:
;; (defun factorial [n] ;; (defun factorial [n]
;; (loop [[i n] ;; (loop [[i n]
@ -67,13 +85,7 @@
;; If recur is used in a non-tail-call position, None is returned, which ;; 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 ;; causes chaos. Fixing this to detect if recur is in a tail-call position
;; and erroring if not is a giant TODO. ;; and erroring if not is a giant TODO.
(with-gensyms [recur-fn] (let [[fnargs (map (fn [x] (first x)) bindings)]
(let [[fnargs (map (fn [x] (first x)) bindings)] [initargs (map second bindings)]]
[initargs (map second bindings)] `(do (defnr ~g!recur-fn [~@fnargs] ~@body)
[new-body (recursive-replace 'recur recur-fn body)]] (~g!recur-fn ~@initargs))))
`(do
(import [hy.contrib.loop [--trampoline--]])
(def ~recur-fn
(--trampoline-- (fn [~@fnargs]
~@new-body)))
(~recur-fn ~@initargs)))))