@@ -232,7 +232,13 @@ Vertically align function (macro) arguments spanning multiple lines.
232
232
(range 1 10))
233
233
----
234
234
235
- === Arguments Indentation [[one-space-indent]]
235
+ The reasoning behind this guideline is pretty simple - the arguments are
236
+ easier to process by the human brain if they stand out and stick together.
237
+
238
+ === Function Arguments Indentation [[one-space-indent]]
239
+
240
+ NOTE: Generally, you should stick to the formatting outlined in the previous
241
+ guideline, unless you're limited by the available horizonal space.
236
242
237
243
Use a single space indentation for function (macro) arguments
238
244
when there are no arguments on the same line as the function name.
@@ -260,6 +266,103 @@ when there are no arguments on the same line as the function name.
260
266
portokala)
261
267
----
262
268
269
+ This may appear like some weird special rule to people without Lisp background, but the
270
+ reasoning behind it is quite simple. Function calls are
271
+ nothing but regular list literals and normally those are aligned in the same way as
272
+ other collection type literals when spanning multiple lines:
273
+
274
+ [source,clojure]
275
+ ----
276
+ ;; list literal
277
+ (1
278
+ 2
279
+ 3)
280
+
281
+ ;; vector literal
282
+ [1
283
+ 2
284
+ 3]
285
+
286
+ ;; set literal
287
+ #{1
288
+ 2
289
+ 3}
290
+ ----
291
+
292
+ Admittedly, list literals are not very common in Clojure, that's why it's understandable
293
+ that for many people lists are nothing but an invocation syntax.
294
+
295
+ As a side benefit, function arguments are still aligned in this scenario as well. They
296
+ just happen to accidentally be aligned with the function name as well.
297
+
298
+ .Semantic Indentation vs Fixed Indentation
299
+ ****
300
+ The guidelines to indent differently macros with body forms from
301
+ all other macro and function calls are collectively known as
302
+ "semantic indentation". Simply put, this means that the code
303
+ is indented differently, so that the indentation would give the
304
+ reader of the code some hints about its meaning.
305
+
306
+ The downside of this approach is that requires Clojure code formatters to be
307
+ smarter. They either need to process `macro` arglists and rely on the fact
308
+ that people named their parameters consistently, or process some additional
309
+ indentation metadata.
310
+
311
+ Some people in the Clojure community have argued that's not worth it and
312
+ that everything should simply be indented in the same fashion. Here are
313
+ a few examples:
314
+
315
+ [source,clojure]
316
+ ----
317
+ ;;; Fixed Indentation
318
+ ;;
319
+ ;; macros
320
+ (when something
321
+ (something-else))
322
+
323
+ (with-out-str
324
+ (println "Hello, ")
325
+ (println "world!"))
326
+
327
+ ;; function call spanning two lines
328
+ (filter even?
329
+ (range 1 10))
330
+
331
+ ;; function call spanning three lines
332
+ (filter
333
+ even?
334
+ (range 1 10))
335
+ ----
336
+
337
+ This suggestion has certainly gotten some ground in the community, but it also
338
+ goes against the entire Lisp tradition and the primary goal of this style guide -
339
+ namely to optimize code for human consumption.
340
+
341
+ There's also one small caveat with fixed indentation that's rarely discussed and that's
342
+ how to indent list literals, as function calls are simply list literals. As those
343
+ are not very common in Clojure, outside the context of providing structure for the Clojure
344
+ code itself, that matter is usually omitted from consideration:
345
+
346
+ [source,clojure]
347
+ ----
348
+ ;;; Fixed Indentation
349
+ ;;
350
+ ;; list literals
351
+ (1 2 3
352
+ 4 5 6)
353
+
354
+ (1
355
+ 2
356
+ 3
357
+ 4
358
+ 5
359
+ 6)
360
+ ----
361
+
362
+ That looks a bit weird and happens to be inconsistent with how other collection types are normally indented.
363
+
364
+ ****
365
+
263
366
=== Bindings Alignment [[bindings-alignment]]
264
367
265
368
Vertically align `let` (and `let`-like) bindings.
0 commit comments