**''SETF''**
''SETF'' assigns values to //places//, accepts any number of arguments. The odd (first, third etc.) arguments, if they are not symbols, are evaled, and the result should represent //place//. The even (second, fourth etc.) arguments are evaled and the value is assigned to that //place//. The last set value is returned.
''SETF'' can be used just like ''SETQ'' to assign values to symbols:
>(setf a 4) ; set value of symbol A, just like SETQ does
4
//Places// are returned from several //accessor// functions - in LabLISP they are only the list-related functions: all the ''CAR'', ''CDR'' combinations, the ''FIRST'' to ''TENTH'', ''REST'', ''NTH'' and ''NTHCDR''.
>(setq li '(a b c)) ; prepare list LI for this example
(A B C)
>(setf (car li) 'd) ; access the CAR of the list LI
D
>li
(D C B) ; value in the list was changed
With ''SETF'', it is possible to create cyclic lists:
>(setf (cdddr li) li) ; connecting the end of the list to the start
(D B C .cyc) ; LabLISP printer will detect it
It is not recommended to use this dangerous feature. In the present state, LabLISP has just very rudimental protection against cyclic lists. Trying to work with cyclic lists might crash, produce memory leaks, or get stuck in infinite loops on C++ level.