プロジェクトオイラー問題8の場合、1000桁の数値を解析するように指示されます。これはブルートフォースLispソリューションであり、基本的に5桁ごとに処理され、最初から最後まで乗算され、ループの最後で最大のものが返されます。
コード:
(defun pep8 ()
(labels ((product-of-5n (n)
(eval (append '(*)
(loop for x from n to (+ n 5)
collect (parse-integer
1000digits-str :start x :end (+ x 1)))))))
(let ((largestproduct 0))
(do ((currentdigit 0 (1+ currentdigit)))
((> currentdigit (- (length 1000digits-str) 6)) (return largestproduct))
(when (> (product-of-5n currentdigit) largestproduct)
(setf largestproduct (product-of-5n currentdigit)))))))
警告なしにコンパイルされますが、実行すると次のようになります。
no non-whitespace characters in string "73167176531330624919225119674426574742355349194934...".
[Condition of type SB-INT:SIMPLE-PARSE-ERROR]
product-of-5n
ローカル関数をグローバル関数として再度記述して、ローカル関数が機能しているかどうかを確認しました。
(defun product-of-5n (n)
(eval (append '(*)
(loop for x from n to (+ n 5)
collect (parse-integer
1000digits-str :start x :end (+ x 1))))))
これは警告なしにコンパイルされ、実行すると完全に動作しているように見えます。例えば、
CL_USER>(product-of-5n 1)=> 882
最初の5桁は7、3、1、6、7なので、これは正しいようです。
について1000digits-str
は、単純にでコンパイルされdefvar
、Emacsでコンパイルされたので、文字列に空白文字は含まれてlonglines-show-hard-newlines
いないと思います。これは、SBCLが不満を言っているからです。