```common lisp
(defun eql (x y)
  (| x (setq x nil))
  (| y (setq y nil))
  (| (eq x y)
     (?
       (& (number? x)
          (number? y))      (== x y)
       (& (string? x)
          (string? y))      (string== x y)
       (& (character? x)
          (character? y))   (character== x y))))
```

Convert EQL to STRING== on literal string arguments.
user
```common lisp
(defun eql (a b)
  (| a (setq a nil))
  (| b (setq b nil))
  (| (eq a b)
     (?
       (& (number? a)
          (number? b))      (== a b)
       (& (string? a)
          (string? b))      (string== a b)
       (& (character? a)
          (character? b))   (character== a b))))

(defmacro eql (a b)
  (? (| (string? a)
        (string? b))
     `(string== ,a ,b)
     `(eql ,a ,b)))
```
assistant