Clojure代码调试:加载spit导出值并逐行调试新增代码
调试Clojush新增多父代育种代码的实操步骤
1. 从EDN文件加载初始状态到变量
在Calva的REPL中执行以下代码,将导出的初始状态读取为可操作的变量:
(require '[clojure.edn :as edn]) ;; 确保文件路径正确,若不在项目根目录需写绝对路径 (def initial-state (edn/read-string (slurp "initial-setting.edn")))
2. 提取新增代码依赖的上下文变量
根据你新增代码用到的breed.clj上下文数据,从initial-state中拆分出所需变量,比如:
;; 示例:提取种群、参数等核心变量,根据你的代码实际依赖调整 (def population (:population initial-state)) (def params (:params initial-state))
3. 封装新增代码为独立调试函数
把你在99行后添加的多父代选择、距离计算、子代生成逻辑,封装成带参数的独立函数,方便单独调用调试:
(defn multi-parent-breed [population params] ;; 粘贴你新增的完整代码逻辑,比如: (let [;; 多父代选择逻辑(示例) selected-parents (take 4 (shuffle population)) ;; 欧氏距离计算实现 euclidean-distance (fn [p1 p2] (Math/sqrt (reduce + (map #(Math/pow (- %1 %2) 2) (:fitness-vector p1) (:fitness-vector p2))))) ;; 筛选最远亲本对 all-pairs (for [a selected-parents b selected-parents :when (not= a b)] [a b]) farthest-pair (apply max-key (fn [[x y]] (euclidean-distance x y)) all-pairs)] ;; 生成子代的逻辑 (your-offspring-generation-fn farthest-pair params)))
4. 用Calva逐行调试封装函数
- 先在Calva中加载clojush的breed命名空间:
(require '[clojush.pushgp.breed :as breed]) - 将封装函数和变量定义粘贴到REPL执行,确保变量都正确绑定
- 直接调用函数触发调试:
(multi-parent-breed population params) - 逐行调试方式:
- 在函数内关键行前插入
#break宏,调用函数后会自动进入断点调试界面,可查看每一步变量值 - 选中某行代码,按Calva默认快捷键
Ctrl+Shift+Enter单独执行该行,验证局部逻辑 - 若之前lein调试失败,确保项目
project.clj中包含[org.clojure/tools.namespace "1.3.0"]依赖,用lein repl :start启动REPL后再用Calva连接
- 在函数内关键行前插入
5. 验证逻辑正确性
调试过程中可随时打印中间结果,比如:
;; 打印选中的亲本 (println "Selected parents:" selected-parents) ;; 打印某对亲本的距离 (println "Distance:" (euclidean-distance (first selected-parents) (second selected-parents)))
内容的提问来源于stack exchange,提问作者ZGI
相关产品推荐
相关产品推荐

