Looking at it again, we don't even need an explicit :require anymore:

(ns one.fresh-server
  "optional doc string goes here"
  [clojure.core :refer-except [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])

- Greg

--
Please do not email me anything that you are not comfortable also sharing with 
the NSA.

On Aug 5, 2013, at 12:10 PM, Greg <g...@kinostudios.com> wrote:

> * 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.
>>> 
>>> 
>> 
> 

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

Reply via email to