{"id":31387448,"url":"https://github.com/ramsayleung/sicp_solution","last_synced_at":"2026-02-25T06:37:49.503Z","repository":{"id":63622390,"uuid":"105455030","full_name":"ramsayleung/sicp_solution","owner":"ramsayleung","description":"We toast the Lisp programmer who pens his thoughts within nests of parentheses.","archived":false,"fork":false,"pushed_at":"2025-08-04T06:08:50.000Z","size":2352,"stargazers_count":7,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-28T17:48:28.309Z","etag":null,"topics":["design","lisp","programming","racket","scheme","sicp"],"latest_commit_sha":null,"homepage":"https://ramsayleung.github.io/zh/post/2025/structure_and_interpretation_of_computer_programs/","language":"Racket","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ramsayleung.png","metadata":{"files":{"readme":"README.org","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2017-10-01T16:13:34.000Z","updated_at":"2025-10-17T06:19:26.000Z","dependencies_parsed_at":"2025-06-08T01:33:07.494Z","dependency_job_id":"e5f983e3-8c29-4fbf-82ee-4c60872c554a","html_url":"https://github.com/ramsayleung/sicp_solution","commit_stats":null,"previous_names":["ramsayleung/sicp_solution","ramsayleung/sicp"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ramsayleung/sicp_solution","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramsayleung%2Fsicp_solution","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramsayleung%2Fsicp_solution/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramsayleung%2Fsicp_solution/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramsayleung%2Fsicp_solution/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ramsayleung","download_url":"https://codeload.github.com/ramsayleung/sicp_solution/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramsayleung%2Fsicp_solution/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29812618,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-25T05:36:42.804Z","status":"ssl_error","status_checked_at":"2026-02-25T05:36:31.934Z","response_time":61,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["design","lisp","programming","racket","scheme","sicp"],"created_at":"2025-09-28T21:13:56.068Z","updated_at":"2026-02-25T06:37:49.498Z","avatar_url":"https://github.com/ramsayleung.png","language":"Racket","readme":"#+LATEX_CLASS: ramsay-org-article\n#+LATEX_CLASS_OPTIONS: [oneside,A4paper,12pt]\n#+AUTHOR: Ramsay Leung\n#+EMAIL: ramsayleung@gmail.com\n#+DATE: 2022-11-07 一 21:07\n* Structure and Interpretation of Computer Programs\n  《计算机程序的构造和解释》题解，使用标准Racket 实现（开发环境是Emacs）\n  \n  #+begin_quote\n  If art interprets our dreams, the computer executes them in the guise of programs!\n\n  如果说艺术解释了我们的梦想，那么计算机就是以程序的名义执行着它们\n  #+end_quote\n\n  #+begin_quote\n  We toast the Lisp programmer who pens his thoughts within nests of parentheses.\n  #+end_quote\n\n  向以括号为画笔的Lisp程序员举杯，干杯！\n* 安装依赖\n  #+begin_src shell\n    raco pkg install --auto --batch # 类似 JavaScript 的 npm install\n  #+end_src\n* 习题\n  习题完成情况:\n  - 章节一: 43/46\n  - 章节二: 88/97\n  - 章节三: 72/82\n  - 章节四: TODO\n  - 章节五: TODO\n* 运行\n  运行所有的习题\n  #+begin_src shell\n    raco test -t .\n  #+end_src\n\n  运行指定的习题:\n  #+begin_src shell\n    raco test chapter1/exercise1-10.scm \n  #+end_src\n* 笔记\n** chapter2\n*** 图形语言\n    racket的 =sicp= package 包含了一个画图工具，可以画出类似书中的效果\n\n    #+begin_src scheme\n      #lang racket\n      (require sicp-pict)\n      (define (flipped-pairs painter)\n        (let ((painter2 (beside painter (flip-vert painter))))\n          (below painter2 painter2)))\n\n      (define (right-split painter n)\n        (if (= n 0)\n            painter\n            (let ((smaller (right-split painter (- n 1))))\n              (beside painter (below smaller smaller)))))\n\n      (define (up-split painter n)\n        (if (= n 0)\n            painter\n            (let ((smaller (up-split painter (- n 1))))\n              (below painter (beside smaller smaller)))))\n\n      (define (corner-split painter n)\n        (if (= n 0)\n            painter\n            (let ((up (up-split painter (- n 1)))\n                  (right (right-split painter (- n 1))))\n              (let ((top-left (beside up up))\n                    (bottom-right (below right right))\n                    (corner (corner-split painter (- n 1))))\n                (beside (below painter top-left)\n                        (below bottom-right corner))))))\n\n      (define (square-limit painter n)\n        (let ((quarter (corner-split painter n)))\n          (let ((half (beside (flip-horiz quarter) quarter)))\n            (below (flip-vert half) half))))\n\n      (paint (square-limit einstein 6))\n    #+end_src\n\n    在 =DrRacket= 的运行效果（只能在DrRacket 运行，在终端无法展示图片）：\n\n    [[file:img/chapter2/square-limit-einstein.png]]\n\n    配合 [[file:chapter2/exercise2-49.org][wave的实现]]，画出来的效果：\n\n[[file:img/chapter2/wave-square-limit.png]]\n** chapter3\n*** 蒙特卡罗模拟步骤来计算 π \n    3.1 赋值与局部变量, 155 页\n    #+begin_quote\n    举例来说，6/π^2 是随机选取的两个整数之间没有公因子（也就是说，它们的最大公因子是1）的概率。我们可以利用这一事实做出π的近似值。\n    #+end_quote\n\n    完全读不懂这段话，没理解是怎么可以算出π的近似值的。\n\n    查阅完资料都知道:\n\n    随机选取两个正整数，它们互质（即最大公约数GCD为1）的概率是 $\\frac{6}{\\pi^2}$ , 所谓的 互质指两个数没有公共因子（如8和15互质，但8和12不互质，因为公约数为4）。\n\n     而这一结论是源自数论中关于 *互质数的密度* 的研究，与黎曼ζ函数相关（难怪我看不懂了）。\n\n     而用蒙特卡罗模拟步骤来计算 ${\\pi}$:\n\n     随机实验：重复多次随机选取两个整数，检查它们的GCD是否为1。\n\n     例如：\n        - (3, 5) → GCD=1（计数+1）\n        - (4, 6) → GCD=2（不计数）\n\n     统计概率：\n\n     若总实验次数为 N，其中 k 次GCD=1，则互质概率的估计值为 $\\frac{k}{N}$ \n\n     关联π：\n\n     根据数论结论 $\\frac{k}{N} \\approx \\frac{6}{\\pi^2}$，解得 $\\pi \\approx \\sqrt{\\frac{6N}{k}}$。\n\n     当直接计算π困难时，可通过概率实验间接逼近。\n\n     这里利用了数论中的概率规律，将π与随机事件联系起来。(高数对于我来说已是雪泥鸿爪，更遑论数论的知识了)\n\n     #+begin_src racket\n       #lang racket\n\n       (define (estimate-pi trials)\n         (sqrt (/ 6 (monte-carlo trials cesaro-test))))\n\n       (define (cesaro-test)\n         (= (gcd (rand) (rand)) 1))\n\n       (define (monte-carlo trials experiment)\n         (define (iter trials-remaining trial-passed)\n           (cond ((= trials-remaining 0)\n                  (/ trials-passed trials))\n                 ((experiment)\n                  (iter (- trials-remaining 1) (+ trials-passed 1)))\n                 (else\n                  (iter (- trials-remaining 1) trials-passed))))\n         (iter trials 0))\n     #+end_src\n\n     这里的蒙特卡罗实现真的是优雅\n\n     而基于流的实现更是优美:\n\n     #+begin_src scheme\n       (define (monte-carlo experiment-stream passed failed)\n         (define (next passed failed)\n           (cons-stream\n            (/ passed (+ passed failed))\n            (monte-carlo\n             (stream-cdr experiment-stream)\n             passed\n             failed)))\n         (if (stream-car experiment-stream)\n             (next (+ passed 1) failed)\n             (next passed (+ failed 1))))\n     #+end_src\n** 翻译错误\n   第2版，238页，模块化，对象和状态，中文翻译是\n   #+begin_quote\n   练习3.70\n   b) 所有正正数序对 (i,j) 的流，其中要求 i\u003c=j, 而且这里的i或者j可以被2,3或者5整除\n   #+end_quote\n\n   原文是:\n   #+begin_quote\n   the stream of all pairs of positive integers ( i , j ) with i ≤ j , where neither i nor j is divisible by 2, 3, or 5,\n   #+end_quote\n\n   https://sarabander.github.io/sicp/html/3_002e5.xhtml#g_t3_002e5\n    \n   i和j不可以被2,3,5整除，翻译成了可以被2,3或者5整除，意思完全相反，真的是服了。\n** 排版错误\n   第2版，240页，模块化，对象和状态\n\n   练习3.74 输入信号流和过零点信号流完全没有对齐\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Framsayleung%2Fsicp_solution","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Framsayleung%2Fsicp_solution","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Framsayleung%2Fsicp_solution/lists"}