* That email was just an idea to explore, not perfection. Also, this is a mistake:
(:require [clojure.core :refer [ancestors printf]] Should read something like: (:require [clojure.core :refer-except [ancestors printf]] - Greg -- Please do not email me anything that you are not comfortable also sharing with the NSA. On Aug 5, 2013, at 12:00 PM, Greg <g...@kinostudios.com> wrote: > This email contains a proposal for a way to get rid of at-least the following > forms from the (ns) declaration: > > - :refer-clojure > - :use > - :import > > See below... > >> The namespace declaration is too complex. The existence of ":use" is not >> what causes this. > > > I agree that it is not the *sole* cause, but I do believe that it is a > significant part of the problem. > >> can you please therefore explain why you think a breaking change >> to ns is a good thing to remove something that we are still going to be >> able to do, but in a more verbose way. > > The 'ns' declaration is complex because there are too many ways to do > essentially the same thing. "use" is one of those ways that is completely > unnecessary and creates unnecessary complexity. > > Clojure's documentation also contributes to this problem, but in some ways > it's a victim of the poor design of the 'ns' declaration. Just look at this > monster: > > user=> (doc ns) > ------------------------- > clojure.core/ns > ([name docstring? attr-map? references*]) > Macro > Sets *ns* to the namespace named by name (unevaluated), creating it > if needed. references can be zero or more of: (:refer-clojure ...) > (:require ...) (:use ...) (:import ...) (:load ...) (:gen-class) > with the syntax of refer-clojure/require/use/import/load/gen-class > respectively, except the arguments are unevaluated and need not be > quoted. (:gen-class ...), when supplied, defaults to :name > corresponding to the ns name, :main true, :impl-ns same as ns, and > :init-impl-ns true. All options of gen-class are > supported. The :gen-class directive is ignored when not > compiling. If :gen-class is not supplied, when compiled only an > nsname__init.class will be generated. If :refer-clojure is not used, a > default (refer 'clojure) is used. Use of ns is preferred to > individual calls to in-ns/require/use/import: > > (ns foo.bar > (:refer-clojure :exclude [ancestors printf]) > (:require (clojure.contrib sql combinatorics)) > (:use (my.lib this that)) > (:import (java.util Date Timer Random) > (java.sql Connection Statement))) > > > The above does not explain completely how to use 'ns'. You have to read the > documentation for the syntax of all of the other forms its supports. > > Deprecating :use would be a significant step in reducing the complexity of > the 'ns' declaration, and improving the readability of Clojure's code. It > would be one less piece to the monster. > > There's a great quote by I don't remember who (Apple-related?), that to > create something truly great, you have to keep removing all the unnecessary > bits till there's nothing unnecessary left to remove. Something like that (if > anyone knows the quote I'm talking about, please share). > > This complexity isn't necessary. > > Perhaps I'm mistaken, but I don't see why with a little bit of compiler > intelligence, we can't convert this: > > (ns one.fresh-server > (:refer-clojure :exclude [ancestors printf]) > (:use core.matrix > [ring.adapter.jetty :only (run-jetty)] > [ring.middleware.file :only (wrap-file)] > [ring.middleware.file-info :only (wrap-file-info)] > [ring.middleware.stacktrace :only (wrap-stacktrace)] > [ring.util.response :only (file-response)]) > (:require [one.reload :as reload] > [one.middleware :as middleware] > [net.cgrand.enlive-html :as html]) > (:import (org.apache.maven.artifact.resolver ArtifactResolver) > (java.io File)))) > > Into this: > > (ns one.fresh-server > (:require [clojure.core :refer [ancestors printf]] > [core.matrix :refer :all] > [ring.adapter.jetty :refer [run-jetty]] > [ring.middleware.file :refer [wrap-file]] > [ring.middleware.file-info :refer [wrap-file-info]] > [ring.middleware.stacktrace :refer [wrap-stacktrace]] > [ring.util.response :refer [file-response]] > [one.reload :as-ns] > [one.middleware :as-ns] > [net.cgrand.enlive-html :as html] > [org.apache.maven.artifact.resolver.ArtifactResolver :as-class] > [java.io.File :as-class])) > > Ta da! > > There we've removed the unnecessary :use, :import, and :refer-clojure forms, > and added :as-ns and :as-class shortcuts. Require now supports both Java > Classes and Clojure Namespaces. > > We've removed practically all the complexity! The only complexity remaining > are the keyword-options to available in the :require clauses, but we already > had those before. > >> Please also explain at the same time, why (use 'core.matrix) remains >> clear and why this should not change to "(require 'core.matrix :refer >> :all)". > > I must have missed this part of the thread. I did not say it shouldn't maybe > someone else did. I'm for deprecating "use" completely, while retaining its > abilities through "require". > > - Greg > > -- > Please do not email me anything that you are not comfortable also sharing > with the NSA. > > On Aug 5, 2013, at 10:52 AM, Phillip Lord <phillip.l...@newcastle.ac.uk> > wrote: > >> Greg <g...@kinostudios.com> writes: >>>> It's pretty ugly to use aliases for numerical code, e.g. with core.matrix, >>>> e.g. >>> >>> Agreed. It's nice that :require :refer :all is available for such >>> instances, isn't it? >> >> Which leads to the crux of the question. >> >> Given that the functionality is there, and that you agree that it is >> useful, can you please therefore explain why you think a breaking change >> to ns is a good thing to remove something that we are still going to be >> able to do, but in a more verbose way. >> >> Please also explain at the same time, why (use 'core.matrix) remains >> clear and why this should not change to "(require 'core.matrix :refer >> :all)". >> >> >> The namespace declaration is too complex. The existence of ":use" is not >> what causes this. >> >> Phil >> >> -- >> -- >> You received this message because you are subscribed to the Google >> Groups "Clojure" group. >> To post to this group, send email to clojure@googlegroups.com >> Note that posts from new members are moderated - please be patient with your >> first post. >> To unsubscribe from this group, send email to >> clojure+unsubscr...@googlegroups.com >> For more options, visit this group at >> http://groups.google.com/group/clojure?hl=en >> --- >> You received this message because you are subscribed to the Google Groups >> "Clojure" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to clojure+unsubscr...@googlegroups.com. >> For more options, visit https://groups.google.com/groups/opt_out. >> >> >
signature.asc
Description: Message signed with OpenPGP using GPGMail