I have to indent properly this code (common lisp):
Code 1
(defun supérieurs (nombre liste)
(cond
((not liste) 0)
((>= (car liste) nombre) ( 1 (supérieurs nombre (cdr liste))))
((supérieurs nombre (cdr liste))) ) )
Code 2
(defun supérieurs (nombre liste)
(cond
((not liste) nil)
((>= (car liste) nombre)
(cons (car liste) (supérieurs nombre (cdr liste))) )
((supérieurs nombre (cdr liste))) ) )
Code 3
(defun nombres (liste)
(cond
((not liste) 0)
((and (listp (car liste)) (numberp (car (car liste))))
( 1 (nombres (cdr liste))) )
((nombres (cdr liste))) ) )
Code 4
(defun nombre (liste)
(cond
((not liste) nil)
((and (listp (car liste)) (numberp (car (car liste))))
(cons (car liste) (nombre (cdr liste))) )
((nombre (cdr liste))) ) )
Code 5
(defun begin (lettre liste)
(cond
((atom liste) 0)
((and
(not (equal (car liste) nil))
(equal (char (string (car liste)) 0) (char (string lettre) 0)))
( 1 (begin lettre (cdr liste))) )
((begin lettre (cdr liste))) ) )
I don't understand why it's not.
Thanks for your help :)
CodePudding user response:
Use indentation of the editor. Avoid indenting with tabs.
(defun nombre (liste)
(cond
((not liste) nil)
((and (listp (car liste)) (numberp (car (car liste))))
(cons (car liste) (nombre (cdr liste))) )
; ^
; | Why this indentation?
((nombre (cdr liste))) ) )
(defun begin (lettre liste)
(cond
((atom liste) 0)
((and
(not (equal (car liste) nil))
(equal (char (string (car liste)) 0) (char (string lettre) 0)))
( 1 (begin lettre (cdr liste))) )
; ^
; | Why this indentation?
((begin lettre (cdr liste))) ) )
(defun nombres (liste)
(cond
((not liste) 0)
((and (listp (car liste)) (numberp (car (car liste))))
( 1 (nombres (cdr liste))) )
; ^
; | Why this indentation?
((nombres (cdr liste))) ) )
CodePudding user response:
The purpose of indentation is to make the code readable, to be able to see the code's structure at a glance. More nested entities should be indented more than the outer level ones; same level -- the same. E.g. in (and ...xpr1... ...xpr2...)
, with non-trivial subexpressions, I much prefer the second on its separate line, indented under the first, as
(and ...xpr1...
...xpr2...)
Don't know if it's standard or not. I also prefer cond
case's body indented at 2 spaces more than the test, even though the standard indentation is the same as the test -- which makes it an indiscernible wall of text, for me. YMMV.
Following these principles, I'd format your code snippets the following way (although as I mentioned, the cond
formatting is non-standard and is bound to draw the ire of some).
Code 1
(defun supérieurs (nombre liste)
(cond
((not liste) 0)
((>= (car liste) nombre)
( 1 (supérieurs nombre (cdr liste))))
((supérieurs nombre (cdr liste)))))
Code 2
(defun supérieurs (nombre liste)
(cond
((not liste) nil)
((>= (car liste) nombre)
(cons (car liste)
(supérieurs nombre (cdr liste))))
((supérieurs nombre (cdr liste)))))
Code 3
(defun nombres (liste)
(cond
((not liste) 0)
((and (listp (car liste))
(numberp (car (car liste))))
( 1 (nombres (cdr liste))) )
((nombres (cdr liste)))))
Code 4
(defun nombre (liste)
(cond
((not liste) nil)
((and (listp (car liste))
(numberp (car (car liste))))
(cons (car liste) (nombre (cdr liste))))
((nombre (cdr liste)))))
Code 5
(defun begin (lettre liste)
(cond
((atom liste) 0)
((and (not (equal (car liste) nil))
(equal (char (string (car liste)) 0)
(char (string lettre) 0)))
( 1 (begin lettre (cdr liste))))
((begin lettre (cdr liste)))))