Except in very special situations, we'd like our functions to accept arguments and return values. The problem with NIL-NTH is that it assigns a new value within the list passed as a parameter. In our example, this list is global, and may be shared by other parts of the program. If all we really wanted to do was to get a copy of the argument list with the Nth element set to NIL , then we shouldn't have altered the passed argument. Return list with nth element set to nil.
Assignment is the clearest way to alter shared data.
And assignment is more efficient than binding. The CAR holds the data for one element of the list, and the CDR holds the CONS that makes up the head of the rest of the list. This leads some programmers to assume that destructive functions always modify the argument to match the result. Dangers of destructive changes When you use destructive functions you should be sure to only modify data that your program has constructed at runtime. This function is effectively modifying itself, as it changes the constant data which is bound to the variable L .