             (when (<= (point) boundary)
               (forward-sexp)
               (let ((s (thing-at-point 'symbol)))
-                (cond ((not s) (push s elems))
-                      ((member s '("#" "`" "'")) (push nil elems))
-                      ((string-match "^#[^:]" s) (push nil elems)) ;; quack
-                      ((not (equal "." s)) (push (make-symbol s) elems)))))))
+                (unless (equal "." s)
+                  (push (car (geiser-syntax--read-from-string s)) elems))))))
         (nreverse elems)))))
 
 (defsubst geiser-syntax--keywordp (s)


(defsubst geiser-syntax--symbol-at-point ()
  (and (not (nth 8 (syntax-ppss)))
       (let ((s (thing-at-point 'symbol)))
         (and s
              (not (equal s "."))
              (not (string-match "^#[^:]" s)) ;; quack modifies thing-at-point
              (make-symbol (substring-no-properties s))))))

(defsubst geiser-syntax--skip-comment/string ()
  (let ((pos (nth 8 (syntax-ppss))))

             (t (let ((tok (geiser-syntax--read/symbol)))
                  (cond ((equal (symbol-name tok) "t") '(boolean . :t))
                        ((equal (symbol-name tok) "f") '(boolean . :f))
                        (tok (cons 'atom tok))
                        (t (geiser-syntax--read/next-token)))))))
      (?\' (geiser-syntax--read/token '(quote . quote)))
      (?\` (geiser-syntax--read/token
