;; // https://adventofcode.com/2022/day/21 (defpackage :day-21 (:use :cl)) (in-package :day-21) (ql:quickload 'cl-ppcre) (defun parse-integer-or-symbol (str) (let ((maybe-int (parse-integer str :junk-allowed t))) (if maybe-int maybe-int (intern (string-upcase str))))) (defun line-to-quoted-operation (line) (let* ((words (ppcre:split " " (ppcre:regex-replace ":" line ""))) (symbols (mapcar #'parse-integer-or-symbol words))) (cond ((= 4 (length symbols)) ;; with operation (destructuring-bind (name operand1 op operand2) symbols `(defparameter ,name '(,op (eval ,operand1) (eval ,operand2))))) ((= 2 (length symbols)) ;; just number (destructuring-bind (name value) symbols `(defparameter ,name ,value)))))) (defun load-file-defs (filename) (loop for line in (uiop:read-file-lines filename) for definition = (line-to-quoted-operation line) do (eval definition)))