From 9a08039adfe40f76b9d5a5351005671c15b557bf Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Mon, 24 Jan 2022 23:38:55 -0400 Subject: Added explicit function inlining. --- changelog.md | 13 ++++++ documentation/bookmark/recursion_schemes.md | 32 +++++++------- .../luxc/lang/translation/jvm/extension/host.lux | 13 +++--- lux-mode/lux-mode.el | 2 +- stdlib/source/library/lux/abstract/functor.lux | 3 -- .../source/library/lux/control/function/inline.lux | 50 ++++++++++++++++++++++ stdlib/source/test/lux/control/function.lux | 4 +- stdlib/source/test/lux/control/function/inline.lux | 32 ++++++++++++++ 8 files changed, 123 insertions(+), 26 deletions(-) create mode 100644 changelog.md create mode 100644 stdlib/source/library/lux/control/function/inline.lux create mode 100644 stdlib/source/test/lux/control/function/inline.lux diff --git a/changelog.md b/changelog.md new file mode 100644 index 000000000..74d4372dc --- /dev/null +++ b/changelog.md @@ -0,0 +1,13 @@ +# Based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) + +## [Un-released] +### Added +* Inline functions. +### Changed +### Removed +### Fixed +### Deprecated +### Security + +[Un-released]: https://github.com/LuxLang/lux/compare/0.6.5...HEAD + diff --git a/documentation/bookmark/recursion_schemes.md b/documentation/bookmark/recursion_schemes.md index 5c41438df..31a013123 100644 --- a/documentation/bookmark/recursion_schemes.md +++ b/documentation/bookmark/recursion_schemes.md @@ -1,18 +1,20 @@ # Reference -1. [Probability Tree Diagrams. Recursion Schemes. Why Finding the Right Solution is Sometimes Hard?](https://rpeszek.github.io/posts/2021-07-18-prob-tree-scheme.html) -1. [Unifying Structured Recursion Schemes](https://www.cs.ox.ac.uk/people/nicolas.wu/papers/URS.pdf) -1. http://maartenfokkinga.github.io/utwente/mmf91m.pdf -1. http://blog.sumtypeofway.com/an-introduction-to-recursion-schemes/ -1. http://blog.sumtypeofway.com/recursion-schemes-part-2/ -1. http://blog.sumtypeofway.com/recursion-schemes-part-iii-folds-in-context/ -1. http://blog.sumtypeofway.com/recursion-schemes-part-iv-time-is-of-the-essence/ -1. http://comonad.com/reader/2009/recursion-schemes/ -1. [Peeling the Banana: Recursion Schemes from First Principles - Zainab Ali](https://www.youtube.com/watch?v=XZ9nPZbaYfE) -1. https://github.com/passy/awesome-recursion-schemes -1. [YOW! Lambda Jam 2018 - Amy Wong - Introduction to recursion scheme](https://www.youtube.com/watch?v=YnqPdlJd38o) -1. https://bartoszmilewski.com/2018/08/20/recursion-schemes-for-higher-algebras/ -1. https://blog.sumtypeofway.com/recursion-schemes-part-6-comonads-composition-and-generality/ -1. https://chrilves.github.io/hugo/posts/recursion_schemes_intro/ -1. [Recursion Schemes: A Field Guide (Redux)](http://comonad.com/reader/2009/recursion-schemes/) +0. [An Introduction to Recursion Schemes](https://blog.sumtypeofway.com/posts/introduction-to-recursion-schemes.html) +0. [Recursion Schemes, Part II: A Mob of Morphisms](https://blog.sumtypeofway.com/posts/recursion-schemes-part-2.html) +0. [Recursion Schemes, Part III: Folds in Context](https://blog.sumtypeofway.com/posts/recursion-schemes-part-3.html) +0. [Recursion Schemes, Part IV: Time is of the Essence](https://blog.sumtypeofway.com/posts/recursion-schemes-part-4.html) +0. [Recursion Schemes, Part 4½: Better Living Through Base Functors](https://blog.sumtypeofway.com/posts/recursion-schemes-part-4-point-5.html) +0. [Recursion Schemes, Part V: Hello, Hylomorphisms](https://blog.sumtypeofway.com/posts/recursion-schemes-part-5.html) +0. [Recursion Schemes, Part VI: Comonads, Composition, and Generality](https://blog.sumtypeofway.com/posts/recursion-schemes-part-6.html) +0. [Probability Tree Diagrams. Recursion Schemes. Why Finding the Right Solution is Sometimes Hard?](https://rpeszek.github.io/posts/2021-07-18-prob-tree-scheme.html) +0. [Unifying Structured Recursion Schemes](https://www.cs.ox.ac.uk/people/nicolas.wu/papers/URS.pdf) +0. http://maartenfokkinga.github.io/utwente/mmf91m.pdf +0. http://comonad.com/reader/2009/recursion-schemes/ +0. [Peeling the Banana: Recursion Schemes from First Principles - Zainab Ali](https://www.youtube.com/watch?v=XZ9nPZbaYfE) +0. https://github.com/passy/awesome-recursion-schemes +0. [YOW! Lambda Jam 2018 - Amy Wong - Introduction to recursion scheme](https://www.youtube.com/watch?v=YnqPdlJd38o) +0. https://bartoszmilewski.com/2018/08/20/recursion-schemes-for-higher-algebras/ +0. https://chrilves.github.io/hugo/posts/recursion_schemes_intro/ +0. [Recursion Schemes: A Field Guide (Redux)](http://comonad.com/reader/2009/recursion-schemes/) diff --git a/lux-jvm/source/luxc/lang/translation/jvm/extension/host.lux b/lux-jvm/source/luxc/lang/translation/jvm/extension/host.lux index 78033cc96..28a5c34bc 100644 --- a/lux-jvm/source/luxc/lang/translation/jvm/extension/host.lux +++ b/lux-jvm/source/luxc/lang/translation/jvm/extension/host.lux @@ -1015,13 +1015,14 @@ inputs! (|> inputsTI list.enumeration (list#each (function (_ [register [type term]]) - (case (type.primitive? type) - {.#Right type} - (_.ALOAD (++ register)) - - {.#Left type} + (let [then! (case (type.primitive? type) + {.#Right type} + (_.unwrap type) + + {.#Left type} + (_.CHECKCAST type))] (|>> (_.ALOAD (++ register)) - (_.CHECKCAST type))))) + then!)))) _.fuse) store_capturedI (|> env list.size diff --git a/lux-mode/lux-mode.el b/lux-mode/lux-mode.el index c3c9e8ec2..b41c3848a 100644 --- a/lux-mode/lux-mode.el +++ b/lux-mode/lux-mode.el @@ -400,7 +400,7 @@ Called by `imenu--generic-function'." (function-definition (altRE "function" "|>>" "<<|" "||>")) (remember (altRE "remember" "to_do" "fix_me")) (definition (altRE "\\.using" - "def:" "type:" "program:" + "def:" "type:" "program:" "inline:" "implementation:" "macro:" "syntax:" "exception:" diff --git a/stdlib/source/library/lux/abstract/functor.lux b/stdlib/source/library/lux/abstract/functor.lux index fb5f412a3..fb3dab4c8 100644 --- a/stdlib/source/library/lux/abstract/functor.lux +++ b/stdlib/source/library/lux/abstract/functor.lux @@ -9,9 +9,6 @@ (-> (f a) (f b)))) each))) -(type: .public (Fix f) - (f (Fix f))) - (type: .public (Or f g) (All (_ a) (.Or (f a) (g a)))) diff --git a/stdlib/source/library/lux/control/function/inline.lux b/stdlib/source/library/lux/control/function/inline.lux new file mode 100644 index 000000000..ef0836888 --- /dev/null +++ b/stdlib/source/library/lux/control/function/inline.lux @@ -0,0 +1,50 @@ +(.using + [library + [lux "*" + ["[0]" meta] + [abstract + ["[0]" monad {"+" do}]] + [control + ["<>" parser + ["<[0]>" code {"+" Parser}]]] + [data + [collection + ["[0]" list ("[1]#[0]" monad)]]] + ["[0]" macro + ["[0]" code] + [syntax {"+" syntax:} + ["|[0]|" export]]]]]) + +(def: declaration + (Parser [Text (List Code)]) + (.form (<>.and .local_symbol (<>.some .any)))) + +(def: inline + (Parser [Code [Text (List Code)] Code Code]) + (|export|.parser + ($_ <>.and + ..declaration + .any + .any + ))) + +(syntax: .public (inline: [[privacy [name parameters] type term] ..inline]) + (do [! meta.monad] + [@ meta.current_module_name + g!parameters (|> (macro.symbol "parameter") + (list.repeated (list.size parameters)) + (monad.all !)) + .let [inlined (` (("lux in-module" + (~ (code.text @)) + (.: (~ type) + (.function ((~ (code.local_symbol name)) (~+ parameters)) + (~ term)))) + (~+ (list#each (function (_ g!parameter) + (` ((~' ~) (~ g!parameter)))) + g!parameters)))) + g!parameters (|> g!parameters + (list#each (function (_ parameter) + (list parameter (` (~! .any))))) + list#conjoint)]] + (in (list (` ((~! syntax:) (~ privacy) ((~ (code.local_symbol name)) [(~+ g!parameters)]) + (.# (~! meta.monad) (~' in) (.list (.`' (~ inlined)))))))))) diff --git a/stdlib/source/test/lux/control/function.lux b/stdlib/source/test/lux/control/function.lux index d9444edd1..eed6c9635 100644 --- a/stdlib/source/test/lux/control/function.lux +++ b/stdlib/source/test/lux/control/function.lux @@ -17,7 +17,8 @@ ["[1][0]" contract] ["[1][0]" memo] ["[1][0]" mixin] - ["[1][0]" mutual]]) + ["[1][0]" mutual] + ["[1][0]" inline]]) (def: .public test Test @@ -62,4 +63,5 @@ /memo.test /mixin.test /mutual.test + /inline.test )))) diff --git a/stdlib/source/test/lux/control/function/inline.lux b/stdlib/source/test/lux/control/function/inline.lux new file mode 100644 index 000000000..7c05e39e0 --- /dev/null +++ b/stdlib/source/test/lux/control/function/inline.lux @@ -0,0 +1,32 @@ +(.using + [library + [lux "*" + ["_" test {"+" Test}] + [abstract + [monad {"+" do}]] + [math + ["[0]" random] + [number + ["i" int]]]]] + [\\library + ["[0]" /]]) + +(template: (!quadrance/2 m0 m1) + [(i.+ (i.* m0 m0) (i.* m1 m1))]) + +(/.inline: .public (quadrance/2 m0 m1) + (-> Int Int Int) + (!quadrance/2 m0 m1)) + +(def: .public test + Test + (<| (_.covering /._) + (do [! random.monad] + [.let [measurement (# ! each (i.% +1000) random.int)] + m0 measurement + m1 measurement]) + ($_ _.and + (_.cover [/.inline:] + (i.= (..!quadrance/2 m0 m1) + (..quadrance/2 m0 m1))) + ))) -- cgit v1.2.3