Error formatting macro: pagetree: java.lang.NullPointerException
Skip to end of metadata
Go to start of metadata
You are viewing an old version of this page. View the current version. Compare with Current  |   View Page History

General

  1. Do I need to know Java to use Clojure?
    Not at first, but it helps to know the standard Java APIs.

Namespaces

  1. Why can't I require/use my project_name.foo namespace ?
    Because here, your namespace is loaded from the disk. For good interop with JVM features, Clojure does some "munging/unmunging" of names depending of them having to be "consumed" by the "clojure side" or the "jvm side" of the equation. So a "_" in a namespace "folder name/file name" has to correspond to a "-" in the namespace name. Check that your namespace on disk is in "project_name/foo.clj", and your namespace is declared as "project-name.foo" (e.g. in a (ns project-name.foo) directive).

Syntax

  1. Why doesn't #(%) work?
    Because it expands to (fn x (x)). #() always expands to include parens around the expression you give it. You might try #(vector x) instead.

Collections

  1. Why doesn't nth work on sets and maps?
    "There is a difference between a sequential view of a collection (i.e. what you get from seq) and the collection itself. Maps are not sequential data structures. nth is only supported for sequential data structures, and that is by design." – nth on maps thread

Java Interop

  1. How do you refer to a nested/inner class?
    Use: EnclosingClass$NestedClass
  2. Why doesn't (. Integer getName) work?
    . is a special operator. In particular, it does non-standard evaluation of its first arg. Because . can call static and instance methods, it determines if it is static call be seeing if the first arg names a class. In the case of (. Integer getName), it tries to find the static getName member and doesn't, because there isn't one. You can use this syntax to call a static method on Integer: (. Integer parseInt "42"). In short, if you can't say x.y() in Java you can't say (. x y) in Clojure, and you can't say Integer.getName() in Java.
  3. How do I call a Java method that takes a variable number of arguments?
    The variable arguments are actually just an array:
  4. How do I get primitive types like int?
  5. When using gen-class, how do I specify which method to override based on type signature?
    This problem can appear if the class/interface you want to extend/implement defines methods with the same name and arity, only differing on the arguments types.
    The solution is to suffix the function name in clojure with the types names, separated by slashes.
    • Example1, the parent class/interface defines 2 methods
      : In clojure you'll write:
    • Example2, the method to override has no argument, eg.
      . Then just append -void:
    • Example3, case of a java array, specific syntax, eg. for overriding
      : You'll use the the-type<> syntax:

APIs

  1. How do I copy a file?
    Use clojure.java.io/copy.

Lisp

  1. Does Clojure support custom reader macros?
    No, and support is not planned.
Labels: