; xy座標の初期値を x = 0, y = 0 として1文字ずつ処理する ; x <- x + 1 ('E') ; x <- x - 1 ('W') ; y <- y + 1 ('N') ; y <- y - 1 ('S') ; 最後に sqrt(x * x + y * y) を出力する (defun main () (let* ((s (read-line)) (x 0) (y 0)) (loop for c across s ; case はエラーを発生させたくない場合やデフォルトの動作を設定したい場合に使う ; ccase は必ずマッチがあるべきだが安全にチェックを行いたい場合に使う ; ecase はマッチするキーが必ずあるべき状況で使う do (ecase c (#\N (incf y)) (#\E (incf x)) (#\W (decf x)) (#\S (decf y)))) ; sqrt 関数は平方根を求める ; 手元の sbcl では ; (sqrt 36) => 6.0 ; (sqrt 123) => 11.090536 ; (sqrt -2) => #C(0.0 1.4142135) ; (sqrt #c(0 3)) #C(1.2247449 1.2247449) ; となった (princ (sqrt (+ (* x x) (* y y)))) (terpri))) (main)