2011-09-15 22 views
0
(defun div618 (p1 p2) 
"golden split" 
    (let ((ratio '(0. 0.191 0.236 0.382 0.5 0.618 0.809 1.)) 
      (price (lambda (r) (if (<= p1 p2) (+ p1 (* (- p2 p1) r)) (- p1 (* (- p1 p2) r)))))) 
     (if (<= p1 p2) 
      (dolist (r (reverse ratio)) (format t "-------~d ~d-------~%" r (price r))) 
      (dolist (r ratio) (format t "-------~d ~d-------~%" r (price r)))))) 

(div618 1600 6000)如何在函數中定義內部函數?

*** - EVAL: undefined function PRICE 
The following restarts are available: 
USE-VALUE  :R1  Input a value to be used instead of (FDEFINITION 'PRICE). 
RETRY   :R2  Retry 
STORE-VALUE :R3  Input a new value for (FDEFINITION 'PRICE). 
ABORT   :R4  Abort main loop 

爲什麼不能內部函數 「價格」 可以用嗎?

真誠!

回答

1

Common Lisp對函數和變量綁定有不同的命名空間;本頁面對此進行了詳細解釋:http://cl-cookbook.sourceforge.net/functions.html。我想你想嘗試的是這樣的:

(defun div618 (p1 p2) 
"golden split" 
    (let ((ratio '(0. 0.191 0.236 0.382 0.5 0.618 0.809 1.)) 
      (price (function (lambda (r) (if (<= p1 p2) (+ p1 (* (- p2 p1) r)) (- p1 (* (- p1 p2) r))))))) 
     (if (<= p1 p2) 
      (dolist (r (reverse ratio)) (format t "-------~d ~d-------~%" r (funcall price r))) 
      (dolist (r ratio) (format t "-------~d ~d-------~%" r (funcall price r)))))) 

未經測試!

相關問題