eintr: Body of current-kill

 
 The Body of ‘current-kill’
 ..........................
 
 The body of the function definition is a ‘let’ expression, which itself
 has a body as well as a VARLIST.
 
    The ‘let’ expression declares a variable that will be only usable
 within the bounds of this function.  This variable is called
 ‘interprogram-paste’ and is for copying to another program.  It is not
 for copying within this instance of GNU Emacs.  Most window systems
 provide a facility for interprogram pasting.  Sadly, that facility
 usually provides only for the last element.  Most windowing systems have
 not adopted a ring of many possibilities, even though Emacs has provided
 it for decades.
 
    The ‘if’ expression has two parts, one if there exists
 ‘interprogram-paste’ and one if not.
 
    Let us consider the else-part of the ‘current-kill’ function.  (The
 then-part uses the ‘kill-new’ function, which we have already described.
 SeeThe ‘kill-new’ function kill-new function.)
 
      (or kill-ring (error "Kill ring is empty"))
      (let ((ARGth-kill-element
             (nthcdr (mod (- n (length kill-ring-yank-pointer))
                          (length kill-ring))
                     kill-ring)))
        (or do-not-move
            (setq kill-ring-yank-pointer ARGth-kill-element))
        (car ARGth-kill-element))
 
 The code first checks whether the kill ring has content; otherwise it
 signals an error.
 
    Note that the ‘or’ expression is very similar to testing length with
 an ‘if’:
 
      (if (zerop (length kill-ring))          ; if-part
          (error "Kill ring is empty"))       ; then-part
        ;; No else-part
 
 If there is not anything in the kill ring, its length must be zero and
 an error message sent to the user: ‘Kill ring is empty’.  The
 ‘current-kill’ function uses an ‘or’ expression which is simpler.  But
 an ‘if’ expression reminds us what goes on.
 
    This ‘if’ expression uses the function ‘zerop’ which returns true if
 the value it is testing is zero.  When ‘zerop’ tests true, the then-part
 of the ‘if’ is evaluated.  The then-part is a list starting with the
 function ‘error’, which is a function that is similar to the ‘message’
 function (SeeThe ‘message’ Function message.) in that it prints a
 one-line message in the echo area.  However, in addition to printing a
 message, ‘error’ also stops evaluation of the function within which it
 is embedded.  This means that the rest of the function will not be
 evaluated if the length of the kill ring is zero.
 
    Then the ‘current-kill’ function selects the element to return.  The
 selection depends on the number of places that ‘current-kill’ rotates
 and on where ‘kill-ring-yank-pointer’ points.
 
    Next, either the optional ‘do-not-move’ argument is true or the
 current value of ‘kill-ring-yank-pointer’ is set to point to the list.
 Finally, another expression returns the first element of the list even
 if the ‘do-not-move’ argument is true.