From def8fb5b3ae060fc5995d55018bb3984b48d7e69 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 4 Aug 2021 14:29:43 +0000 Subject: [PATCH] update(web-testing): Jest DOM expect API issue #105 2c4811bbfea4eca91495eeef6324187d9fb1791f --- .nojekyll | 0 assets/6_free_software_licenses.344bcf8c.png | Bin 0 -> 117471 bytes assets/AXI_Read_Burst.0e9ed250.png | Bin 0 -> 194294 bytes assets/AXI_Write_Burst.63cb974a.png | Bin 0 -> 205107 bytes assets/CSS3SelectorList.c7ec6bba.png | Bin 0 -> 48832 bytes assets/CriticalRenderPath.9e821854.svg | 1 + assets/DesignPatterns.df4b7baf.png | Bin 0 -> 60880 bytes assets/EventLoop.30d3251e.jpg | Bin 0 -> 21470 bytes assets/FordFulkersonAlgorithm.94aecb4b.png | Bin 0 -> 31437 bytes assets/Home.f03b71db.js | 1 + assets/ProgrammingParadigms.04c60b43.jpg | Bin 0 -> 1463982 bytes assets/Prototype.be11f8c6.png | Bin 0 -> 122471 bytes assets/ScriptingType.562e5309.svg | 1 + assets/SearchPerformance.866c6c75.jpg | Bin 0 -> 186022 bytes assets/SortingPerformance.caae88a8.png | Bin 0 -> 39007 bytes assets/app.6dd2a1b7.js | 1 + ...rithms_algorithmsBasicNotes.md.36b13240.js | 1 + ...s_algorithmsBasicNotes.md.36b13240.lean.js | 1 + ...nce_algorithms_ojBasicNotes.md.87451c39.js | 1 + ...lgorithms_ojBasicNotes.md.87451c39.lean.js | 1 + ...architecture_archBasicNotes.md.1ed20244.js | 1 + ...tecture_archBasicNotes.md.1ed20244.lean.js | 1 + ...e_graphProcessingBasicNotes.md.e60be5c5.js | 1 + ...phProcessingBasicNotes.md.e60be5c5.lean.js | 1 + ...mpilers_compilersBasicNotes.md.5ebb309b.js | 1 + ...rs_compilersBasicNotes.md.5ebb309b.lean.js | 1 + ...database_databaseBasicNotes.md.aff8f197.js | 1 + ...ase_databaseBasicNotes.md.aff8f197.lean.js | 1 + ...ience_latex_latexBasicNotes.md.d95b2977.js | 1 + ..._latex_latexBasicNotes.md.d95b2977.lean.js | 1 + ...e_network_networkBasicNotes.md.81a62821.js | 1 + ...work_networkBasicNotes.md.81a62821.lean.js | 1 + ...ence_operatingSystems_CSAPP.md.fa06cc16.js | 1 + ...operatingSystems_CSAPP.md.fa06cc16.lean.js | 1 + ..._operatingSystemsBasicNotes.md.5966c145.js | 1 + ...atingSystemsBasicNotes.md.5966c145.lean.js | 1 + ...rtualization_virtBasicNotes.md.f20c0b3e.js | 1 + ...ization_virtBasicNotes.md.f20c0b3e.lean.js | 1 + assets/ctype.h.b7c42e1e.jpg | Bin 0 -> 15117 bytes assets/foldl.8f7f9807.png | Bin 0 -> 8333 bytes assets/index.md.6d96cb4c.js | 1 + assets/index.md.6d96cb4c.lean.js | 1 + ...assembly_assemblyBasicNotes.md.8a26b6c6.js | 1 + ...bly_assemblyBasicNotes.md.8a26b6c6.lean.js | 1 + assets/language_c_cBasicNotes.md.4b46ee41.js | 1 + ...language_c_cBasicNotes.md.4b46ee41.lean.js | 1 + .../language_cpp_cppBasicNotes.md.212edeb8.js | 1 + ...uage_cpp_cppBasicNotes.md.212edeb8.lean.js | 1 + .../language_go_goBasicNotes.md.38086837.js | 1 + ...nguage_go_goBasicNotes.md.38086837.lean.js | 1 + ...e_haskell_haskellBasicNotes.md.998a4d73.js | 1 + ...kell_haskellBasicNotes.md.998a4d73.lean.js | 1 + ...anguage_java_javaBasicNotes.md.4f729496.js | 1 + ...ge_java_javaBasicNotes.md.4f729496.lean.js | 1 + ...age_python_pythonBasicNotes.md.f5d1a476.js | 1 + ...ython_pythonBasicNotes.md.f5d1a476.lean.js | 1 + ...e_verilog_verilogBasicNotes.md.8503596e.js | 1 + ...ilog_verilogBasicNotes.md.8503596e.lean.js | 1 + ...g_android_androidBasicNotes.md.4d20a147.js | 1 + ...roid_androidBasicNotes.md.4d20a147.lean.js | 1 + ..._devops_cleanCodeBasicNotes.md.f8256997.js | 1 + ...ps_cleanCodeBasicNotes.md.f8256997.lean.js | 1 + ...ps_designPatternsBasicNotes.md.0d5c71a8.js | 1 + ...signPatternsBasicNotes.md.0d5c71a8.lean.js | 1 + ...s_softwareTestingBasicNotes.md.a3d46251.js | 1 + ...twareTestingBasicNotes.md.a3d46251.lean.js | 1 + ...tionalProgrammingBasicNotes.md.140216fc.js | 1 + ...lProgrammingBasicNotes.md.140216fc.lean.js | 1 + ...g_game_gameDesignBasicNotes.md.fb3c7fed.js | 1 + ...e_gameDesignBasicNotes.md.fb3c7fed.lean.js | 1 + ...mming_linux_linuxBasicNotes.md.37adc63b.js | 1 + ..._linux_linuxBasicNotes.md.37adc63b.lean.js | 1 + ..._buildTools_CMakeBasicNotes.md.c21de6b5.js | 1 + ...dTools_CMakeBasicNotes.md.c21de6b5.lean.js | 1 + ...ing_tools_git_gitBasicNotes.md.abd5ba70.js | 1 + ...ools_git_gitBasicNotes.md.abd5ba70.lean.js | 1 + ...ing_tools_vim_vimBasicNotes.md.bfbb803e.js | 1 + ...ools_vim_vimBasicNotes.md.bfbb803e.lean.js | 1 + assets/stack_frame.daa8403a.png | Bin 0 -> 50714 bytes assets/style.c5400c29.css | 1 + ...b_angular_angularBasicNotes.md.85fd00dc.js | 1 + ...ular_angularBasicNotes.md.85fd00dc.lean.js | 1 + ...web_css_bootstrapBasicNotes.md.222d8e91.js | 1 + ...ss_bootstrapBasicNotes.md.222d8e91.lean.js | 1 + .../web_css_cssAdvancedNotes.md.fcd5d609.js | 1 + ...b_css_cssAdvancedNotes.md.fcd5d609.lean.js | 1 + assets/web_css_cssBasicNotes.md.8e99d3ef.js | 1 + .../web_css_cssBasicNotes.md.8e99d3ef.lean.js | 1 + assets/web_css_sassBasicNotes.md.77936725.js | 1 + ...web_css_sassBasicNotes.md.77936725.lean.js | 1 + ...ameworks_electronBasicNotes.md.22479f06.js | 1 + ...rks_electronBasicNotes.md.22479f06.lean.js | 1 + ...frameworks_jQueryBasicNotes.md.34d94b01.js | 1 + ...works_jQueryBasicNotes.md.34d94b01.lean.js | 1 + ...rameworks_libraryBasicNotes.md.d3a69904.js | 1 + ...orks_libraryBasicNotes.md.d3a69904.lean.js | 1 + assets/web_html_htmlBasicNotes.md.ec2fc2b7.js | 1 + ...eb_html_htmlBasicNotes.md.ec2fc2b7.lean.js | 1 + ...ipt_javascriptAdvancedNotes.md.ac0331e2.js | 1 + ...avascriptAdvancedNotes.md.ac0331e2.lean.js | 1 + ...script_javascriptBasicNotes.md.5a340318.js | 1 + ...t_javascriptBasicNotes.md.5a340318.lean.js | 1 + ...script_typescriptBasicNotes.md.75df9234.js | 1 + ...t_typescriptBasicNotes.md.75df9234.lean.js | 1 + .../web_node_expressBasicNotes.md.b23fd6b4.js | 1 + ...node_expressBasicNotes.md.b23fd6b4.lean.js | 1 + .../web_node_graphqlBasicNotes.md.bce30625.js | 1 + ...node_graphqlBasicNotes.md.bce30625.lean.js | 1 + ...node_messageQueueBasicNotes.md.32c3caa1.js | 1 + ...messageQueueBasicNotes.md.32c3caa1.lean.js | 1 + assets/web_node_nodeBasicNotes.md.50bd31ed.js | 1 + ...eb_node_nodeBasicNotes.md.50bd31ed.lean.js | 1 + .../web_react_reactBasicNotes.md.8f951eac.js | 1 + ..._react_reactBasicNotes.md.8f951eac.lean.js | 1 + ...react_reactRouterBasicNotes.md.9a8a404c.js | 1 + ..._reactRouterBasicNotes.md.9a8a404c.lean.js | 1 + .../web_react_reduxBasicNotes.md.d6face4d.js | 1 + ..._react_reduxBasicNotes.md.d6face4d.lean.js | 1 + ...security_securityBasicNotes.md.acb17233.js | 1 + ...ity_securityBasicNotes.md.acb17233.lean.js | 1 + assets/web_vue_vueBasicNotes.md.67c2506a.js | 1 + .../web_vue_vueBasicNotes.md.67c2506a.lean.js | 1 + .../algorithms/algorithmsBasicNotes.html | 379 ++ computerScience/algorithms/ojBasicNotes.html | 507 ++ .../architecture/archBasicNotes.html | 22 + .../graphProcessingBasicNotes.html | 34 + .../compilers/compilersBasicNotes.html | 1340 +++++ .../database/databaseBasicNotes.html | 233 + computerScience/latex/latexBasicNotes.html | 218 + .../network/networkBasicNotes.html | 46 + computerScience/operatingSystems/CSAPP.html | 299 ++ .../operatingSystemsBasicNotes.html | 310 ++ .../virtualization/virtBasicNotes.html | 119 + index.html | 27 + language/assembly/assemblyBasicNotes.html | 77 + language/c/cBasicNotes.html | 407 ++ language/cpp/cppBasicNotes.html | 488 ++ language/go/goBasicNotes.html | 368 ++ language/haskell/haskellBasicNotes.html | 1324 +++++ language/java/javaBasicNotes.html | 318 ++ language/python/pythonBasicNotes.html | 513 ++ language/verilog/verilogBasicNotes.html | 1195 +++++ logo.svg | 58 + programming/android/androidBasicNotes.html | 1056 ++++ programming/devops/cleanCodeBasicNotes.html | 277 + .../devops/designPatternsBasicNotes.html | 1358 +++++ .../devops/softwareTestingBasicNotes.html | 22 + .../functionalProgrammingBasicNotes.html | 98 + programming/game/gameDesignBasicNotes.html | 22 + programming/linux/linuxBasicNotes.html | 1105 ++++ .../tools/buildTools/CMakeBasicNotes.html | 497 ++ programming/tools/git/gitBasicNotes.html | 440 ++ programming/tools/vim/vimBasicNotes.html | 109 + web/angular/angularBasicNotes.html | 180 + web/css/bootstrapBasicNotes.html | 1318 +++++ web/css/cssAdvancedNotes.html | 93 + web/css/cssBasicNotes.html | 2538 ++++++++++ web/css/sassBasicNotes.html | 309 ++ web/frameworks/electronBasicNotes.html | 64 + web/frameworks/jQueryBasicNotes.html | 213 + web/frameworks/libraryBasicNotes.html | 22 + web/html/htmlBasicNotes.html | 605 +++ web/javascript/javascriptAdvancedNotes.html | 4444 +++++++++++++++++ web/javascript/javascriptBasicNotes.html | 2038 ++++++++ web/javascript/typescriptBasicNotes.html | 1306 +++++ web/node/expressBasicNotes.html | 36 + web/node/graphqlBasicNotes.html | 102 + web/node/messageQueueBasicNotes.html | 22 + web/node/nodeBasicNotes.html | 620 +++ web/react/reactBasicNotes.html | 3433 +++++++++++++ web/react/reactRouterBasicNotes.html | 327 ++ web/react/reduxBasicNotes.html | 349 ++ web/security/securityBasicNotes.html | 100 + web/vue/vueBasicNotes.html | 733 +++ 174 files changed, 32225 insertions(+) create mode 100644 .nojekyll create mode 100644 assets/6_free_software_licenses.344bcf8c.png create mode 100644 assets/AXI_Read_Burst.0e9ed250.png create mode 100644 assets/AXI_Write_Burst.63cb974a.png create mode 100644 assets/CSS3SelectorList.c7ec6bba.png create mode 100644 assets/CriticalRenderPath.9e821854.svg create mode 100644 assets/DesignPatterns.df4b7baf.png create mode 100644 assets/EventLoop.30d3251e.jpg create mode 100644 assets/FordFulkersonAlgorithm.94aecb4b.png create mode 100644 assets/Home.f03b71db.js create mode 100644 assets/ProgrammingParadigms.04c60b43.jpg create mode 100644 assets/Prototype.be11f8c6.png create mode 100644 assets/ScriptingType.562e5309.svg create mode 100644 assets/SearchPerformance.866c6c75.jpg create mode 100644 assets/SortingPerformance.caae88a8.png create mode 100644 assets/app.6dd2a1b7.js create mode 100644 assets/computerScience_algorithms_algorithmsBasicNotes.md.36b13240.js create mode 100644 assets/computerScience_algorithms_algorithmsBasicNotes.md.36b13240.lean.js create mode 100644 assets/computerScience_algorithms_ojBasicNotes.md.87451c39.js create mode 100644 assets/computerScience_algorithms_ojBasicNotes.md.87451c39.lean.js create mode 100644 assets/computerScience_architecture_archBasicNotes.md.1ed20244.js create mode 100644 assets/computerScience_architecture_archBasicNotes.md.1ed20244.lean.js create mode 100644 assets/computerScience_architecture_graphProcessingBasicNotes.md.e60be5c5.js create mode 100644 assets/computerScience_architecture_graphProcessingBasicNotes.md.e60be5c5.lean.js create mode 100644 assets/computerScience_compilers_compilersBasicNotes.md.5ebb309b.js create mode 100644 assets/computerScience_compilers_compilersBasicNotes.md.5ebb309b.lean.js create mode 100644 assets/computerScience_database_databaseBasicNotes.md.aff8f197.js create mode 100644 assets/computerScience_database_databaseBasicNotes.md.aff8f197.lean.js create mode 100644 assets/computerScience_latex_latexBasicNotes.md.d95b2977.js create mode 100644 assets/computerScience_latex_latexBasicNotes.md.d95b2977.lean.js create mode 100644 assets/computerScience_network_networkBasicNotes.md.81a62821.js create mode 100644 assets/computerScience_network_networkBasicNotes.md.81a62821.lean.js create mode 100644 assets/computerScience_operatingSystems_CSAPP.md.fa06cc16.js create mode 100644 assets/computerScience_operatingSystems_CSAPP.md.fa06cc16.lean.js create mode 100644 assets/computerScience_operatingSystems_operatingSystemsBasicNotes.md.5966c145.js create mode 100644 assets/computerScience_operatingSystems_operatingSystemsBasicNotes.md.5966c145.lean.js create mode 100644 assets/computerScience_virtualization_virtBasicNotes.md.f20c0b3e.js create mode 100644 assets/computerScience_virtualization_virtBasicNotes.md.f20c0b3e.lean.js create mode 100644 assets/ctype.h.b7c42e1e.jpg create mode 100644 assets/foldl.8f7f9807.png create mode 100644 assets/index.md.6d96cb4c.js create mode 100644 assets/index.md.6d96cb4c.lean.js create mode 100644 assets/language_assembly_assemblyBasicNotes.md.8a26b6c6.js create mode 100644 assets/language_assembly_assemblyBasicNotes.md.8a26b6c6.lean.js create mode 100644 assets/language_c_cBasicNotes.md.4b46ee41.js create mode 100644 assets/language_c_cBasicNotes.md.4b46ee41.lean.js create mode 100644 assets/language_cpp_cppBasicNotes.md.212edeb8.js create mode 100644 assets/language_cpp_cppBasicNotes.md.212edeb8.lean.js create mode 100644 assets/language_go_goBasicNotes.md.38086837.js create mode 100644 assets/language_go_goBasicNotes.md.38086837.lean.js create mode 100644 assets/language_haskell_haskellBasicNotes.md.998a4d73.js create mode 100644 assets/language_haskell_haskellBasicNotes.md.998a4d73.lean.js create mode 100644 assets/language_java_javaBasicNotes.md.4f729496.js create mode 100644 assets/language_java_javaBasicNotes.md.4f729496.lean.js create mode 100644 assets/language_python_pythonBasicNotes.md.f5d1a476.js create mode 100644 assets/language_python_pythonBasicNotes.md.f5d1a476.lean.js create mode 100644 assets/language_verilog_verilogBasicNotes.md.8503596e.js create mode 100644 assets/language_verilog_verilogBasicNotes.md.8503596e.lean.js create mode 100644 assets/programming_android_androidBasicNotes.md.4d20a147.js create mode 100644 assets/programming_android_androidBasicNotes.md.4d20a147.lean.js create mode 100644 assets/programming_devops_cleanCodeBasicNotes.md.f8256997.js create mode 100644 assets/programming_devops_cleanCodeBasicNotes.md.f8256997.lean.js create mode 100644 assets/programming_devops_designPatternsBasicNotes.md.0d5c71a8.js create mode 100644 assets/programming_devops_designPatternsBasicNotes.md.0d5c71a8.lean.js create mode 100644 assets/programming_devops_softwareTestingBasicNotes.md.a3d46251.js create mode 100644 assets/programming_devops_softwareTestingBasicNotes.md.a3d46251.lean.js create mode 100644 assets/programming_functionalProgramming_functionalProgrammingBasicNotes.md.140216fc.js create mode 100644 assets/programming_functionalProgramming_functionalProgrammingBasicNotes.md.140216fc.lean.js create mode 100644 assets/programming_game_gameDesignBasicNotes.md.fb3c7fed.js create mode 100644 assets/programming_game_gameDesignBasicNotes.md.fb3c7fed.lean.js create mode 100644 assets/programming_linux_linuxBasicNotes.md.37adc63b.js create mode 100644 assets/programming_linux_linuxBasicNotes.md.37adc63b.lean.js create mode 100644 assets/programming_tools_buildTools_CMakeBasicNotes.md.c21de6b5.js create mode 100644 assets/programming_tools_buildTools_CMakeBasicNotes.md.c21de6b5.lean.js create mode 100644 assets/programming_tools_git_gitBasicNotes.md.abd5ba70.js create mode 100644 assets/programming_tools_git_gitBasicNotes.md.abd5ba70.lean.js create mode 100644 assets/programming_tools_vim_vimBasicNotes.md.bfbb803e.js create mode 100644 assets/programming_tools_vim_vimBasicNotes.md.bfbb803e.lean.js create mode 100644 assets/stack_frame.daa8403a.png create mode 100644 assets/style.c5400c29.css create mode 100644 assets/web_angular_angularBasicNotes.md.85fd00dc.js create mode 100644 assets/web_angular_angularBasicNotes.md.85fd00dc.lean.js create mode 100644 assets/web_css_bootstrapBasicNotes.md.222d8e91.js create mode 100644 assets/web_css_bootstrapBasicNotes.md.222d8e91.lean.js create mode 100644 assets/web_css_cssAdvancedNotes.md.fcd5d609.js create mode 100644 assets/web_css_cssAdvancedNotes.md.fcd5d609.lean.js create mode 100644 assets/web_css_cssBasicNotes.md.8e99d3ef.js create mode 100644 assets/web_css_cssBasicNotes.md.8e99d3ef.lean.js create mode 100644 assets/web_css_sassBasicNotes.md.77936725.js create mode 100644 assets/web_css_sassBasicNotes.md.77936725.lean.js create mode 100644 assets/web_frameworks_electronBasicNotes.md.22479f06.js create mode 100644 assets/web_frameworks_electronBasicNotes.md.22479f06.lean.js create mode 100644 assets/web_frameworks_jQueryBasicNotes.md.34d94b01.js create mode 100644 assets/web_frameworks_jQueryBasicNotes.md.34d94b01.lean.js create mode 100644 assets/web_frameworks_libraryBasicNotes.md.d3a69904.js create mode 100644 assets/web_frameworks_libraryBasicNotes.md.d3a69904.lean.js create mode 100644 assets/web_html_htmlBasicNotes.md.ec2fc2b7.js create mode 100644 assets/web_html_htmlBasicNotes.md.ec2fc2b7.lean.js create mode 100644 assets/web_javascript_javascriptAdvancedNotes.md.ac0331e2.js create mode 100644 assets/web_javascript_javascriptAdvancedNotes.md.ac0331e2.lean.js create mode 100644 assets/web_javascript_javascriptBasicNotes.md.5a340318.js create mode 100644 assets/web_javascript_javascriptBasicNotes.md.5a340318.lean.js create mode 100644 assets/web_javascript_typescriptBasicNotes.md.75df9234.js create mode 100644 assets/web_javascript_typescriptBasicNotes.md.75df9234.lean.js create mode 100644 assets/web_node_expressBasicNotes.md.b23fd6b4.js create mode 100644 assets/web_node_expressBasicNotes.md.b23fd6b4.lean.js create mode 100644 assets/web_node_graphqlBasicNotes.md.bce30625.js create mode 100644 assets/web_node_graphqlBasicNotes.md.bce30625.lean.js create mode 100644 assets/web_node_messageQueueBasicNotes.md.32c3caa1.js create mode 100644 assets/web_node_messageQueueBasicNotes.md.32c3caa1.lean.js create mode 100644 assets/web_node_nodeBasicNotes.md.50bd31ed.js create mode 100644 assets/web_node_nodeBasicNotes.md.50bd31ed.lean.js create mode 100644 assets/web_react_reactBasicNotes.md.8f951eac.js create mode 100644 assets/web_react_reactBasicNotes.md.8f951eac.lean.js create mode 100644 assets/web_react_reactRouterBasicNotes.md.9a8a404c.js create mode 100644 assets/web_react_reactRouterBasicNotes.md.9a8a404c.lean.js create mode 100644 assets/web_react_reduxBasicNotes.md.d6face4d.js create mode 100644 assets/web_react_reduxBasicNotes.md.d6face4d.lean.js create mode 100644 assets/web_security_securityBasicNotes.md.acb17233.js create mode 100644 assets/web_security_securityBasicNotes.md.acb17233.lean.js create mode 100644 assets/web_vue_vueBasicNotes.md.67c2506a.js create mode 100644 assets/web_vue_vueBasicNotes.md.67c2506a.lean.js create mode 100644 computerScience/algorithms/algorithmsBasicNotes.html create mode 100644 computerScience/algorithms/ojBasicNotes.html create mode 100644 computerScience/architecture/archBasicNotes.html create mode 100644 computerScience/architecture/graphProcessingBasicNotes.html create mode 100644 computerScience/compilers/compilersBasicNotes.html create mode 100644 computerScience/database/databaseBasicNotes.html create mode 100644 computerScience/latex/latexBasicNotes.html create mode 100644 computerScience/network/networkBasicNotes.html create mode 100644 computerScience/operatingSystems/CSAPP.html create mode 100644 computerScience/operatingSystems/operatingSystemsBasicNotes.html create mode 100644 computerScience/virtualization/virtBasicNotes.html create mode 100644 index.html create mode 100644 language/assembly/assemblyBasicNotes.html create mode 100644 language/c/cBasicNotes.html create mode 100644 language/cpp/cppBasicNotes.html create mode 100644 language/go/goBasicNotes.html create mode 100644 language/haskell/haskellBasicNotes.html create mode 100644 language/java/javaBasicNotes.html create mode 100644 language/python/pythonBasicNotes.html create mode 100644 language/verilog/verilogBasicNotes.html create mode 100644 logo.svg create mode 100644 programming/android/androidBasicNotes.html create mode 100644 programming/devops/cleanCodeBasicNotes.html create mode 100644 programming/devops/designPatternsBasicNotes.html create mode 100644 programming/devops/softwareTestingBasicNotes.html create mode 100644 programming/functionalProgramming/functionalProgrammingBasicNotes.html create mode 100644 programming/game/gameDesignBasicNotes.html create mode 100644 programming/linux/linuxBasicNotes.html create mode 100644 programming/tools/buildTools/CMakeBasicNotes.html create mode 100644 programming/tools/git/gitBasicNotes.html create mode 100644 programming/tools/vim/vimBasicNotes.html create mode 100644 web/angular/angularBasicNotes.html create mode 100644 web/css/bootstrapBasicNotes.html create mode 100644 web/css/cssAdvancedNotes.html create mode 100644 web/css/cssBasicNotes.html create mode 100644 web/css/sassBasicNotes.html create mode 100644 web/frameworks/electronBasicNotes.html create mode 100644 web/frameworks/jQueryBasicNotes.html create mode 100644 web/frameworks/libraryBasicNotes.html create mode 100644 web/html/htmlBasicNotes.html create mode 100644 web/javascript/javascriptAdvancedNotes.html create mode 100644 web/javascript/javascriptBasicNotes.html create mode 100644 web/javascript/typescriptBasicNotes.html create mode 100644 web/node/expressBasicNotes.html create mode 100644 web/node/graphqlBasicNotes.html create mode 100644 web/node/messageQueueBasicNotes.html create mode 100644 web/node/nodeBasicNotes.html create mode 100644 web/react/reactBasicNotes.html create mode 100644 web/react/reactRouterBasicNotes.html create mode 100644 web/react/reduxBasicNotes.html create mode 100644 web/security/securityBasicNotes.html create mode 100644 web/vue/vueBasicNotes.html diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000000..e69de29bb2d diff --git a/assets/6_free_software_licenses.344bcf8c.png b/assets/6_free_software_licenses.344bcf8c.png new file mode 100644 index 0000000000000000000000000000000000000000..98a4eb4cd9615603442ef373501a3945abf1a680 GIT binary patch literal 117471 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 Nin6LQ)l#M*{|lA_q&WZp literal 0 HcmV?d00001 diff --git a/assets/AXI_Read_Burst.0e9ed250.png b/assets/AXI_Read_Burst.0e9ed250.png new file mode 100644 index 0000000000000000000000000000000000000000..523702d4c84de259703dd78e8d368906c7b539ab GIT binary patch literal 194294 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 z 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 z

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

bQNW?Dya!d97g4_#ZX35!exD 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

y&8-n0GfZwbQaZD7k+r3CfeTY?L_uWE!zjHzg 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 Hu0mjfOUD!S literal 0 HcmV?d00001 diff --git a/assets/CSS3SelectorList.c7ec6bba.png b/assets/CSS3SelectorList.c7ec6bba.png new file mode 100644 index 0000000000000000000000000000000000000000..5f97bf55664d8f95b619b8da7bd41e64fe70da0f GIT binary patch literal 48832 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%0DGXARelaiQP_sc~0iy=I% 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 B+)e-h literal 0 HcmV?d00001 diff --git a/assets/CriticalRenderPath.9e821854.svg b/assets/CriticalRenderPath.9e821854.svg new file mode 100644 index 00000000000..dbf82cfcf76 --- /dev/null +++ b/assets/CriticalRenderPath.9e821854.svg @@ -0,0 +1 @@ + diff --git a/assets/DesignPatterns.df4b7baf.png b/assets/DesignPatterns.df4b7baf.png new file mode 100644 index 0000000000000000000000000000000000000000..7ef020645e854588ce6de73d2ecec2771a622251 GIT binary patch literal 60880 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ɱ! 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

FDS? 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 SC2o))@Omhxe6Lj2IN*P4_|;JW literal 0 HcmV?d00001 diff --git a/assets/EventLoop.30d3251e.jpg b/assets/EventLoop.30d3251e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2367b59a1cb58c4586c62523551789623e64294c GIT binary patch literal 21470 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 literal 0 HcmV?d00001 diff --git a/assets/FordFulkersonAlgorithm.94aecb4b.png b/assets/FordFulkersonAlgorithm.94aecb4b.png new file mode 100644 index 0000000000000000000000000000000000000000..782c2ecafd79aa0aa681d17ce761f311d330f02c GIT binary patch literal 31437 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 UM8;2|wy6d*RdrQrl&s{const{heroImage:t,heroText:e,tagline:a,actionLink:s,actionText:i}=u.value;return t||e||a||s&&i})),m=a((()=>u.value.heroText||v.value.title));return(t,e)=>s(f)?(i(),o("header",h,[s(u).heroImage?(i(),o("figure",g,[l("img",{class:"image",src:s(n)(s(u).heroImage),alt:s(u).heroAlt},null,8,["src","alt"])])):c("v-if",!0),s(m)?(i(),o("h1",y,r(s(m)),1)):c("v-if",!0),s(u).tagline?(i(),o("p",x,r(s(u).tagline),1)):c("v-if",!0),s(u).actionLink&&s(u).actionText?(i(),o(d,{key:3,item:{link:s(u).actionLink,text:s(u).actionText},class:"action"},null,8,["item"])):c("v-if",!0),s(u).altActionLink&&s(u).altActionText?(i(),o(d,{key:4,item:{link:s(u).altActionLink,text:s(u).altActionText},class:"action alt"},null,8,["item"])):c("v-if",!0)])):c("v-if",!0)}});_.__scopeId="data-v-1154499e",v("data-v-58405b12");const I={key:0,class:"home-features"},T={class:"wrapper"},b={class:"container"},A={class:"features"},L={key:0,class:"title"},$={key:1,class:"details"};u();var j=t({setup(t){const{frontmatter:n}=e(),d=a((()=>n.value.features&&n.value.features.length>0)),v=a((()=>n.value.features?n.value.features:[]));return(t,e)=>s(d)?(i(),o("div",I,[l("div",T,[l("div",b,[l("div",A,[(i(!0),o(f,null,m(s(v),((t,e)=>(i(),o("section",{key:e,class:"feature"},[t.title?(i(),o("h2",L,r(t.title),1)):c("v-if",!0),t.details?(i(),o("p",$,r(t.details),1)):c("v-if",!0)])))),128))])])])])):c("v-if",!0)}});j.__scopeId="data-v-58405b12",v("data-v-d7c9d38c");const w={key:0,class:"footer"},C={class:"container"},F={class:"text"};u();var q=t({setup(t){const{frontmatter:a}=e();return(t,e)=>s(a).footer?(i(),o("footer",w,[l("div",C,[l("p",F,r(s(a).footer),1)])])):c("v-if",!0)}});q.__scopeId="data-v-d7c9d38c",v("data-v-46076ded");const z={class:"home","aria-labelledby":"main-title"},B={class:"home-content"};u();var D=t({setup:t=>(t,e)=>{const a=k("Content");return i(),o("main",z,[l(_),p(t.$slots,"hero",{},void 0,!0),l(j),l("div",B,[l(a)]),p(t.$slots,"features",{},void 0,!0),l(q),p(t.$slots,"footer",{},void 0,!0)])}});D.__scopeId="data-v-46076ded";export default D; diff --git a/assets/ProgrammingParadigms.04c60b43.jpg b/assets/ProgrammingParadigms.04c60b43.jpg new file mode 100644 index 0000000000000000000000000000000000000000..28d159115fc603d0fbb40eb6bd49418eee151dbb GIT binary patch literal 1463982 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

}3GoJ*X3%U8nI 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

wEg%%`c|h|nV=^<7Fobn2^irYp9#>`zb9 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≤mH~EbX4Tq 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%0AAO09$%r}sfM0n58*!L)ln(fhazrEiD}J@; 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

;&8=`pRe`#s%2*Caq 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 z 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

cHt(r)R=OU!5voXY9}~< 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%0A^eKPYX; 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%0Dka5DBc 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%0DY!z!Zxz+ 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 z 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

HZ-R1CfQ_7jm#Zv<}ZpQg$6QS#6E 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

  • !o#e;uTnufOs1j9C9O1 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 jCRBW`mDVgud83^2 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 literal 0 HcmV?d00001 diff --git a/assets/Prototype.be11f8c6.png b/assets/Prototype.be11f8c6.png new file mode 100644 index 0000000000000000000000000000000000000000..dc83547b3eec433cba8a20e9b7ade6b5596c8ef5 GIT binary patch literal 122471 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 DGfdLh literal 0 HcmV?d00001 diff --git a/assets/ScriptingType.562e5309.svg b/assets/ScriptingType.562e5309.svg new file mode 100644 index 00000000000..688b89f7ad6 --- /dev/null +++ b/assets/ScriptingType.562e5309.svg @@ -0,0 +1 @@ +<script>Scripting:HTML Parser:<script defer>Scripting:HTML Parser:<script async>Scripting:HTML Parser:<script type="module">Scripting:HTML Parser:<script type="module" async>Scripting:HTML Parser:parserfetchexecutionruntime → diff --git a/assets/SearchPerformance.866c6c75.jpg b/assets/SearchPerformance.866c6c75.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3c8d9b342589befd841caed9173de44d0332fc5d GIT binary patch literal 186022 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�?S9T4fB{0Z#+3z=H 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 z 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 literal 0 HcmV?d00001 diff --git a/assets/SortingPerformance.caae88a8.png b/assets/SortingPerformance.caae88a8.png new file mode 100644 index 0000000000000000000000000000000000000000..544c747b319ee454df87a06155b4ef0d9ed784a1 GIT binary patch literal 39007 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 in t?e(t,n,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[n]=o,i=(e,t)=>{for(var n in t||(t={}))r.call(t,n)&&l(e,n,t[n]);if(o)for(var n of o(t))s.call(t,n)&&l(e,n,t[n]);return e},a=(e,o)=>t(e,n(o));function c(e,t){const n=Object.create(null),o=e.split(",");for(let r=0;r!!n[e.toLowerCase()]:e=>!!n[e]}const u=c("Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt"),d=c("itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly");function p(e){if(E(e)){const t={};for(let n=0;n{if(e){const n=e.split(h);n.length>1&&(t[n[0].trim()]=n[1].trim())}})),t}function v(e){let t="";if(T(e))t=e;else if(E(e))for(let n=0;nnull==e?"":M(e)?JSON.stringify(e,b,2):String(e),b=(e,t)=>L(t)?{[`Map(${t.size})`]:[...t.entries()].reduce(((e,[t,n])=>(e[`${t} =>`]=n,e)),{})}:$(t)?{[`Set(${t.size})`]:[...t.values()]}:!M(t)||E(t)||U(t)?t:String(t),y={},x=[],k=()=>{},_=()=>!1,w=/^on[^a-z]/,S=e=>w.test(e),C=e=>e.startsWith("onUpdate:"),N=Object.assign,B=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},P=Object.prototype.hasOwnProperty,A=(e,t)=>P.call(e,t),E=Array.isArray,L=e=>"[object Map]"===I(e),$=e=>"[object Set]"===I(e),O=e=>"function"==typeof e,T=e=>"string"==typeof e,j=e=>"symbol"==typeof e,M=e=>null!==e&&"object"==typeof e,R=e=>M(e)&&O(e.then)&&O(e.catch),F=Object.prototype.toString,I=e=>F.call(e),U=e=>"[object Object]"===I(e),V=e=>T(e)&&"NaN"!==e&&"-"!==e[0]&&""+parseInt(e,10)===e,D=c(",key,ref,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),W=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},z=/-(\w)/g,H=W((e=>e.replace(z,((e,t)=>t?t.toUpperCase():"")))),q=/\B([A-Z])/g,G=W((e=>e.replace(q,"-$1").toLowerCase())),J=W((e=>e.charAt(0).toUpperCase()+e.slice(1))),Q=W((e=>e?`on${J(e)}`:"")),K=(e,t)=>e!==t&&(e==e||t==t),Y=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Z=e=>{const t=parseFloat(e);return isNaN(t)?e:t},ee=new WeakMap,te=[];let ne;const oe=Symbol(""),re=Symbol("");function se(e,t=y){(function(e){return e&&!0===e._isEffect})(e)&&(e=e.raw);const n=function(e,t){const n=function(){if(!n.active)return e();if(!te.includes(n)){ae(n);try{return ue.push(ce),ce=!0,te.push(n),ne=n,e()}finally{te.pop(),pe(),ne=te[te.length-1]}}};return n.id=ie++,n.allowRecurse=!!t.allowRecurse,n._isEffect=!0,n.active=!0,n.raw=e,n.deps=[],n.options=t,n}(e,t);return t.lazy||n(),n}function le(e){e.active&&(ae(e),e.options.onStop&&e.options.onStop(),e.active=!1)}let ie=0;function ae(e){const{deps:t}=e;if(t.length){for(let n=0;n{e&&e.forEach((e=>{(e!==ne||e.allowRecurse)&&i.add(e)}))};if("clear"===t)l.forEach(a);else if("length"===n&&E(e))l.forEach(((e,t)=>{("length"===t||t>=o)&&a(e)}));else switch(void 0!==n&&a(l.get(n)),t){case"add":E(e)?V(n)&&a(l.get("length")):(a(l.get(oe)),L(e)&&a(l.get(re)));break;case"delete":E(e)||(a(l.get(oe)),L(e)&&a(l.get(re)));break;case"set":L(e)&&a(l.get(oe))}i.forEach((e=>{e.options.scheduler?e.options.scheduler(e):e()}))}const me=c("__proto__,__v_isRef,__isVue"),ve=new Set(Object.getOwnPropertyNames(Symbol).map((e=>Symbol[e])).filter(j)),ge=_e(),be=_e(!1,!0),ye=_e(!0),xe=ke();function ke(){const e={};return["includes","indexOf","lastIndexOf"].forEach((t=>{e[t]=function(...e){const n=it(this);for(let t=0,r=this.length;t{e[t]=function(...e){de();const n=it(this)[t].apply(this,e);return pe(),n}})),e}function _e(e=!1,t=!1){return function(n,o,r){if("__v_isReactive"===o)return!e;if("__v_isReadonly"===o)return e;if("__v_raw"===o&&r===(e?t?Ze:Xe:t?Ye:Ke).get(n))return n;const s=E(n);if(!e&&s&&A(xe,o))return Reflect.get(xe,o,r);const l=Reflect.get(n,o,r);if(j(o)?ve.has(o):me(o))return l;if(e||fe(n,0,o),t)return l;if(ut(l)){return!s||!V(o)?l.value:l}return M(l)?e?nt(l):tt(l):l}}function we(e=!1){return function(t,n,o,r){let s=t[n];if(!e&&(o=it(o),s=it(s),!E(t)&&ut(s)&&!ut(o)))return s.value=o,!0;const l=E(t)&&V(n)?Number(n)!0,deleteProperty:(e,t)=>!0},Ne=N({},Se,{get:be,set:we(!0)}),Be=e=>M(e)?tt(e):e,Pe=e=>M(e)?nt(e):e,Ae=e=>e,Ee=e=>Reflect.getPrototypeOf(e);function Le(e,t,n=!1,o=!1){const r=it(e=e.__v_raw),s=it(t);t!==s&&!n&&fe(r,0,t),!n&&fe(r,0,s);const{has:l}=Ee(r),i=o?Ae:n?Pe:Be;return l.call(r,t)?i(e.get(t)):l.call(r,s)?i(e.get(s)):void(e!==r&&e.get(t))}function $e(e,t=!1){const n=this.__v_raw,o=it(n),r=it(e);return e!==r&&!t&&fe(o,0,e),!t&&fe(o,0,r),e===r?n.has(e):n.has(e)||n.has(r)}function Oe(e,t=!1){return e=e.__v_raw,!t&&fe(it(e),0,oe),Reflect.get(e,"size",e)}function Te(e){e=it(e);const t=it(this);return Ee(t).has.call(t,e)||(t.add(e),he(t,"add",e,e)),this}function je(e,t){t=it(t);const n=it(this),{has:o,get:r}=Ee(n);let s=o.call(n,e);s||(e=it(e),s=o.call(n,e));const l=r.call(n,e);return n.set(e,t),s?K(t,l)&&he(n,"set",e,t):he(n,"add",e,t),this}function Me(e){const t=it(this),{has:n,get:o}=Ee(t);let r=n.call(t,e);r||(e=it(e),r=n.call(t,e)),o&&o.call(t,e);const s=t.delete(e);return r&&he(t,"delete",e,void 0),s}function Re(){const e=it(this),t=0!==e.size,n=e.clear();return t&&he(e,"clear",void 0,void 0),n}function Fe(e,t){return function(n,o){const r=this,s=r.__v_raw,l=it(s),i=t?Ae:e?Pe:Be;return!e&&fe(l,0,oe),s.forEach(((e,t)=>n.call(o,i(e),i(t),r)))}}function Ie(e,t,n){return function(...o){const r=this.__v_raw,s=it(r),l=L(s),i="entries"===e||e===Symbol.iterator&&l,a="keys"===e&&l,c=r[e](...o),u=n?Ae:t?Pe:Be;return!t&&fe(s,0,a?re:oe),{next(){const{value:e,done:t}=c.next();return t?{value:e,done:t}:{value:i?[u(e[0]),u(e[1])]:u(e),done:t}},[Symbol.iterator](){return this}}}}function Ue(e){return function(...t){return"delete"!==e&&this}}function Ve(){const e={get(e){return Le(this,e)},get size(){return Oe(this)},has:$e,add:Te,set:je,delete:Me,clear:Re,forEach:Fe(!1,!1)},t={get(e){return Le(this,e,!1,!0)},get size(){return Oe(this)},has:$e,add:Te,set:je,delete:Me,clear:Re,forEach:Fe(!1,!0)},n={get(e){return Le(this,e,!0)},get size(){return Oe(this,!0)},has(e){return $e.call(this,e,!0)},add:Ue("add"),set:Ue("set"),delete:Ue("delete"),clear:Ue("clear"),forEach:Fe(!0,!1)},o={get(e){return Le(this,e,!0,!0)},get size(){return Oe(this,!0)},has(e){return $e.call(this,e,!0)},add:Ue("add"),set:Ue("set"),delete:Ue("delete"),clear:Ue("clear"),forEach:Fe(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach((r=>{e[r]=Ie(r,!1,!1),n[r]=Ie(r,!0,!1),t[r]=Ie(r,!1,!0),o[r]=Ie(r,!0,!0)})),[e,n,t,o]}const[De,We,ze,He]=Ve();function qe(e,t){const n=t?e?He:ze:e?We:De;return(t,o,r)=>"__v_isReactive"===o?!e:"__v_isReadonly"===o?e:"__v_raw"===o?t:Reflect.get(A(n,o)&&o in t?n:t,o,r)}const Ge={get:qe(!1,!1)},Je={get:qe(!1,!0)},Qe={get:qe(!0,!1)},Ke=new WeakMap,Ye=new WeakMap,Xe=new WeakMap,Ze=new WeakMap;function et(e){return e.__v_skip||!Object.isExtensible(e)?0:function(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}((e=>I(e).slice(8,-1))(e))}function tt(e){return e&&e.__v_isReadonly?e:ot(e,!1,Se,Ge,Ke)}function nt(e){return ot(e,!0,Ce,Qe,Xe)}function ot(e,t,n,o,r){if(!M(e))return e;if(e.__v_raw&&(!t||!e.__v_isReactive))return e;const s=r.get(e);if(s)return s;const l=et(e);if(0===l)return e;const i=new Proxy(e,2===l?o:n);return r.set(e,i),i}function rt(e){return st(e)?rt(e.__v_raw):!(!e||!e.__v_isReactive)}function st(e){return!(!e||!e.__v_isReadonly)}function lt(e){return rt(e)||st(e)}function it(e){return e&&it(e.__v_raw)||e}function at(e){return X(e,"__v_skip",!0),e}const ct=e=>M(e)?tt(e):e;function ut(e){return Boolean(e&&!0===e.__v_isRef)}function dt(e){return function(e,t=!1){if(ut(e))return e;return new pt(e,t)}(e)}class pt{constructor(e,t=!1){this._shallow=t,this.__v_isRef=!0,this._rawValue=t?e:it(e),this._value=t?e:ct(e)}get value(){return fe(it(this),0,"value"),this._value}set value(e){e=this._shallow?e:it(e),K(e,this._rawValue)&&(this._rawValue=e,this._value=this._shallow?e:ct(e),he(it(this),"set","value",e))}}function ft(e){return ut(e)?e.value:e}const ht={get:(e,t,n)=>ft(Reflect.get(e,t,n)),set:(e,t,n,o)=>{const r=e[t];return ut(r)&&!ut(n)?(r.value=n,!0):Reflect.set(e,t,n,o)}};function mt(e){return rt(e)?e:new Proxy(e,ht)}function vt(e){const t=E(e)?new Array(e.length):{};for(const n in e)t[n]=bt(e,n);return t}class gt{constructor(e,t){this._object=e,this._key=t,this.__v_isRef=!0}get value(){return this._object[this._key]}set value(e){this._object[this._key]=e}}function bt(e,t){return ut(e[t])?e[t]:new gt(e,t)}class yt{constructor(e,t,n){this._setter=t,this._dirty=!0,this.__v_isRef=!0,this.effect=se(e,{lazy:!0,scheduler:()=>{this._dirty||(this._dirty=!0,he(it(this),"set","value"))}}),this.__v_isReadonly=n}get value(){const e=it(this);return e._dirty&&(e._value=this.effect(),e._dirty=!1),fe(e,0,"value"),e._value}set value(e){this._setter(e)}}function xt(e,t,n,o){let r;try{r=o?e(...o):e()}catch(s){_t(s,t,n)}return r}function kt(e,t,n,o){if(O(e)){const r=xt(e,t,n,o);return r&&R(r)&&r.catch((e=>{_t(e,t,n)})),r}const r=[];for(let s=0;s>>1;Dt(Ct[e])-1?Ct.splice(t,0,e):Ct.push(e),Ft()}}function Ft(){wt||St||(St=!0,Tt=Ot.then(Wt))}function It(e,t,n,o){E(e)?n.push(...e):t&&t.includes(e,e.allowRecurse?o+1:o)||n.push(e),Ft()}function Ut(e,t=null){if(Bt.length){for(jt=t,Pt=[...new Set(Bt)],Bt.length=0,At=0;AtDt(e)-Dt(t))),$t=0;$tnull==e.id?1/0:e.id;function Wt(e){St=!1,wt=!0,Ut(e),Ct.sort(((e,t)=>Dt(e)-Dt(t)));try{for(Nt=0;Nte.trim())):t&&(r=n.map(Z))}let i,a=o[i=Q(t)]||o[i=Q(H(t))];!a&&s&&(a=o[i=Q(G(t))]),a&&kt(a,e,6,r);const c=o[i+"Once"];if(c){if(e.emitted){if(e.emitted[i])return}else e.emitted={};e.emitted[i]=!0,kt(c,e,6,r)}}function Ht(e,t,n=!1){const o=t.emitsCache,r=o.get(e);if(void 0!==r)return r;const s=e.emits;let l={},i=!1;if(!O(e)){const o=e=>{const n=Ht(e,t,!0);n&&(i=!0,N(l,n))};!n&&t.mixins.length&&t.mixins.forEach(o),e.extends&&o(e.extends),e.mixins&&e.mixins.forEach(o)}return s||i?(E(s)?s.forEach((e=>l[e]=null)):N(l,s),o.set(e,l),l):(o.set(e,null),null)}function qt(e,t){return!(!e||!S(t))&&(t=t.slice(2).replace(/Once$/,""),A(e,t[0].toLowerCase()+t.slice(1))||A(e,G(t))||A(e,t))}let Gt=null,Jt=null;function Qt(e){const t=Gt;return Gt=e,Jt=e&&e.type.__scopeId||null,t}function Kt(e){Jt=e}function Yt(){Jt=null}function Xt(e,t=Gt,n){if(!t)return e;if(e._n)return e;const o=(...n)=>{o._d&&Mo(-1);const r=Qt(t),s=e(...n);return Qt(r),o._d&&Mo(1),s};return o._n=!0,o._c=!0,o._d=!0,o}function Zt(e){const{type:t,vnode:n,proxy:o,withProxy:r,props:s,propsOptions:[l],slots:i,attrs:a,emit:c,render:u,renderCache:d,data:p,setupState:f,ctx:h,inheritAttrs:m}=e;let v;const g=Qt(e);try{let e;if(4&n.shapeFlag){const t=r||o;v=Jo(u.call(t,t,d,s,f,p,h)),e=a}else{const n=t;0,v=Jo(n.length>1?n(s,{attrs:a,slots:i,emit:c}):n(s,null)),e=t.props?a:en(a)}let g=v;if(e&&!1!==m){const t=Object.keys(e),{shapeFlag:n}=g;t.length&&(1&n||6&n)&&(l&&t.some(C)&&(e=tn(e,l)),g=zo(g,e))}0,n.dirs&&(g.dirs=g.dirs?g.dirs.concat(n.dirs):n.dirs),n.transition&&(g.transition=n.transition),v=g}catch(b){$o.length=0,_t(b,e,1),v=Wo(Eo)}return Qt(g),v}const en=e=>{let t;for(const n in e)("class"===n||"style"===n||S(n))&&((t||(t={}))[n]=e[n]);return t},tn=(e,t)=>{const n={};for(const o in e)C(o)&&o.slice(9)in t||(n[o]=e[o]);return n};function nn(e,t,n){const o=Object.keys(t);if(o.length!==Object.keys(e).length)return!0;for(let r=0;r1)return n&&O(t)?t.call(o.proxy):t}}const sn={};function ln(e,t,n){return an(e,t,n)}function an(e,t,{immediate:n,deep:o,flush:r,onTrack:s,onTrigger:l}=y,i=ir){let a,c,u=!1,d=!1;if(ut(e)?(a=()=>e.value,u=!!e._shallow):rt(e)?(a=()=>e,o=!0):E(e)?(d=!0,u=e.some(rt),a=()=>e.map((e=>ut(e)?e.value:rt(e)?dn(e):O(e)?xt(e,i,2):void 0))):a=O(e)?t?()=>xt(e,i,2):()=>{if(!i||!i.isUnmounted)return c&&c(),kt(e,i,3,[p])}:k,t&&o){const e=a;a=()=>dn(e())}let p=e=>{c=v.options.onStop=()=>{xt(e,i,4)}},f=d?[]:sn;const h=()=>{if(v.active)if(t){const e=v();(o||u||(d?e.some(((e,t)=>K(e,f[t]))):K(e,f)))&&(c&&c(),kt(t,i,3,[e,f===sn?void 0:f,p]),f=e)}else v()};let m;h.allowRecurse=!!t,m="sync"===r?h:"post"===r?()=>xo(h,i&&i.suspense):()=>{!i||i.isMounted?function(e){It(e,Pt,Bt,At)}(h):h()};const v=se(a,{lazy:!0,onTrack:s,onTrigger:l,scheduler:m});return mr(v,i),t?n?h():f=v():"post"===r?xo(v,i&&i.suspense):v(),()=>{le(v),i&&B(i.effects,v)}}function cn(e,t,n){const o=this.proxy,r=T(e)?e.includes(".")?un(o,e):()=>o[e]:e.bind(o,o);let s;return O(t)?s=t:(s=t.handler,n=t),an(r,s.bind(o),n,this)}function un(e,t){const n=t.split(".");return()=>{let t=e;for(let e=0;e{dn(e,t)}));else if(U(e))for(const n in e)dn(e[n],t);return e}const pn=[Function,Array];Boolean,Boolean;function fn(e,t){const{leavingVNodes:n}=e;let o=n.get(t.type);return o||(o=Object.create(null),n.set(t.type,o)),o}function hn(e,t,n,o){const{appear:r,mode:s,persisted:l=!1,onBeforeEnter:i,onEnter:a,onAfterEnter:c,onEnterCancelled:u,onBeforeLeave:d,onLeave:p,onAfterLeave:f,onLeaveCancelled:h,onBeforeAppear:m,onAppear:v,onAfterAppear:g,onAppearCancelled:b}=t,y=String(e.key),x=fn(n,e),k=(e,t)=>{e&&kt(e,o,9,t)},_={mode:s,persisted:l,beforeEnter(t){let o=i;if(!n.isMounted){if(!r)return;o=m||i}t._leaveCb&&t._leaveCb(!0);const s=x[y];s&&Io(e,s)&&s.el._leaveCb&&s.el._leaveCb(),k(o,[t])},enter(e){let t=a,o=c,s=u;if(!n.isMounted){if(!r)return;t=v||a,o=g||c,s=b||u}let l=!1;const i=e._enterCb=t=>{l||(l=!0,k(t?s:o,[e]),_.delayedLeave&&_.delayedLeave(),e._enterCb=void 0)};t?(t(e,i),t.length<=1&&i()):i()},leave(t,o){const r=String(e.key);if(t._enterCb&&t._enterCb(!0),n.isUnmounting)return o();k(d,[t]);let s=!1;const l=t._leaveCb=n=>{s||(s=!0,o(),k(n?h:f,[t]),t._leaveCb=void 0,x[r]===e&&delete x[r])};x[r]=e,p?(p(t,l),p.length<=1&&l()):l()},clone:e=>hn(e,t,n,o)};return _}function mn(e){if(wn(e))return(e=zo(e)).children=null,e}function vn(e){return wn(e)?e.children?e.children[0]:void 0:e}function gn(e,t){6&e.shapeFlag&&e.component?gn(e.component.subTree,t):128&e.shapeFlag?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function bn(e,t=!1){let n=[],o=0;for(let r=0;r1)for(let r=0;r!!e.type.__asyncLoader;function kn(e){O(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:o,delay:r=200,timeout:s,suspensible:l=!0,onError:i}=e;let a,c=null,u=0;const d=()=>{let e;return c||(e=c=t().catch((e=>{if(e=e instanceof Error?e:new Error(String(e)),i)return new Promise(((t,n)=>{i(e,(()=>t((u++,c=null,d()))),(()=>n(e)),u+1)}));throw e})).then((t=>e!==c&&c?c:(t&&(t.__esModule||"Module"===t[Symbol.toStringTag])&&(t=t.default),a=t,t))))};return yn({name:"AsyncComponentWrapper",__asyncLoader:d,get __asyncResolved(){return a},setup(){const e=ir;if(a)return()=>_n(a,e);const t=t=>{c=null,_t(t,e,13,!o)};if(l&&e.suspense)return d().then((t=>()=>_n(t,e))).catch((e=>(t(e),()=>o?Wo(o,{error:e}):null)));const i=dt(!1),u=dt(),p=dt(!!r);return r&&setTimeout((()=>{p.value=!1}),r),null!=s&&setTimeout((()=>{if(!i.value&&!u.value){const e=new Error(`Async component timed out after ${s}ms.`);t(e),u.value=e}}),s),d().then((()=>{i.value=!0,e.parent&&wn(e.parent.vnode)&&Rt(e.parent.update)})).catch((e=>{t(e),u.value=e})),()=>i.value&&a?_n(a,e):u.value&&o?Wo(o,{error:u.value}):n&&!p.value?Wo(n):void 0}})}function _n(e,{vnode:{ref:t,props:n,children:o}}){const r=Wo(e,n,o);return r.ref=t,r}const wn=e=>e.type.__isKeepAlive;function Sn(e,t){Nn(e,"a",t)}function Cn(e,t){Nn(e,"da",t)}function Nn(e,t,n=ir){const o=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}e()});if(Pn(t,o,n),n){let e=n.parent;for(;e&&e.parent;)wn(e.parent.vnode)&&Bn(o,t,n,e),e=e.parent}}function Bn(e,t,n,o){const r=Pn(t,e,o,!0);jn((()=>{B(o[t],r)}),n)}function Pn(e,t,n=ir,o=!1){if(n){const r=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...o)=>{if(n.isUnmounted)return;de(),cr(n);const r=kt(t,n,e,o);return cr(null),pe(),r});return o?r.unshift(s):r.push(s),s}}const An=e=>(t,n=ir)=>(!dr||"sp"===e)&&Pn(e,t,n),En=An("bm"),Ln=An("m"),$n=An("bu"),On=An("u"),Tn=An("bum"),jn=An("um"),Mn=An("sp"),Rn=An("rtg"),Fn=An("rtc");function In(e,t=ir){Pn("ec",e,t)}let Un=!0;function Vn(e){const t=zn(e),n=e.proxy,o=e.ctx;Un=!1,t.beforeCreate&&Dn(t.beforeCreate,e,"bc");const{data:r,computed:s,methods:l,watch:i,provide:a,inject:c,created:u,beforeMount:d,mounted:p,beforeUpdate:f,updated:h,activated:m,deactivated:v,beforeDestroy:g,beforeUnmount:b,destroyed:y,unmounted:x,render:_,renderTracked:w,renderTriggered:S,errorCaptured:C,serverPrefetch:N,expose:B,inheritAttrs:P,components:A,directives:L,filters:$}=t;if(c&&function(e,t,n=k){E(e)&&(e=Jn(e));for(const o in e){const n=e[o];M(n)?t[o]="default"in n?rn(n.from||o,n.default,!0):rn(n.from||o):t[o]=rn(n)}}(c,o,null),l)for(const k in l){const e=l[k];O(e)&&(o[k]=e.bind(n))}if(r){const t=r.call(n,n);M(t)&&(e.data=tt(t))}if(Un=!0,s)for(const E in s){const e=s[E],t=gr({get:O(e)?e.bind(n,n):O(e.get)?e.get.bind(n,n):k,set:!O(e)&&O(e.set)?e.set.bind(n):k});Object.defineProperty(o,E,{enumerable:!0,configurable:!0,get:()=>t.value,set:e=>t.value=e})}if(i)for(const k in i)Wn(i[k],o,n,k);if(a){const e=O(a)?a.call(n):a;Reflect.ownKeys(e).forEach((t=>{!function(e,t){if(ir){let n=ir.provides;const o=ir.parent&&ir.parent.provides;o===n&&(n=ir.provides=Object.create(o)),n[e]=t}}(t,e[t])}))}function T(e,t){E(t)?t.forEach((t=>e(t.bind(n)))):t&&e(t.bind(n))}if(u&&Dn(u,e,"c"),T(En,d),T(Ln,p),T($n,f),T(On,h),T(Sn,m),T(Cn,v),T(In,C),T(Fn,w),T(Rn,S),T(Tn,b),T(jn,x),T(Mn,N),E(B))if(B.length){const t=e.exposed||(e.exposed={});B.forEach((e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t})}))}else e.exposed||(e.exposed={});_&&e.render===k&&(e.render=_),null!=P&&(e.inheritAttrs=P),A&&(e.components=A),L&&(e.directives=L)}function Dn(e,t,n){kt(E(e)?e.map((e=>e.bind(t.proxy))):e.bind(t.proxy),t,n)}function Wn(e,t,n,o){const r=o.includes(".")?un(n,o):()=>n[o];if(T(e)){const n=t[e];O(n)&&ln(r,n)}else if(O(e))ln(r,e.bind(n));else if(M(e))if(E(e))e.forEach((e=>Wn(e,t,n,o)));else{const o=O(e.handler)?e.handler.bind(n):t[e.handler];O(o)&&ln(r,o,e)}}function zn(e){const t=e.type,{mixins:n,extends:o}=t,{mixins:r,optionsCache:s,config:{optionMergeStrategies:l}}=e.appContext,i=s.get(t);let a;return i?a=i:r.length||n||o?(a={},r.length&&r.forEach((e=>Hn(a,e,l,!0))),Hn(a,t,l)):a=t,s.set(t,a),a}function Hn(e,t,n,o=!1){const{mixins:r,extends:s}=t;s&&Hn(e,s,n,!0),r&&r.forEach((t=>Hn(e,t,n,!0)));for(const l in t)if(o&&"expose"===l);else{const o=qn[l]||n&&n[l];e[l]=o?o(e[l],t[l]):t[l]}return e}const qn={data:Gn,props:Kn,emits:Kn,methods:Kn,computed:Kn,beforeCreate:Qn,created:Qn,beforeMount:Qn,mounted:Qn,beforeUpdate:Qn,updated:Qn,beforeDestroy:Qn,destroyed:Qn,activated:Qn,deactivated:Qn,errorCaptured:Qn,serverPrefetch:Qn,components:Kn,directives:Kn,watch:function(e,t){if(!e)return t;if(!t)return e;const n=N(Object.create(null),e);for(const o in t)n[o]=Qn(e[o],t[o]);return n},provide:Gn,inject:function(e,t){return Kn(Jn(e),Jn(t))}};function Gn(e,t){return t?e?function(){return N(O(e)?e.call(this,this):e,O(t)?t.call(this,this):t)}:t:e}function Jn(e){if(E(e)){const t={};for(let n=0;n{a=!0;const[n,o]=eo(e,t,!0);N(l,n),o&&i.push(...o)};!n&&t.mixins.length&&t.mixins.forEach(o),e.extends&&o(e.extends),e.mixins&&e.mixins.forEach(o)}if(!s&&!a)return o.set(e,x),x;if(E(s))for(let u=0;u-1,n[1]=o<0||t-1||A(n,"default"))&&i.push(e)}}}const c=[l,i];return o.set(e,c),c}function to(e){return"$"!==e[0]}function no(e){const t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:""}function oo(e,t){return no(e)===no(t)}function ro(e,t){return E(t)?t.findIndex((t=>oo(t,e))):O(t)&&oo(t,e)?0:-1}const so=e=>"_"===e[0]||"$stable"===e,lo=e=>E(e)?e.map(Jo):[Jo(e)],io=(e,t,n)=>{const o=Xt((e=>lo(t(e))),n);return o._c=!1,o},ao=(e,t,n)=>{const o=e._ctx;for(const r in e){if(so(r))continue;const n=e[r];if(O(n))t[r]=io(0,n,o);else if(null!=n){const e=lo(n);t[r]=()=>e}}},co=(e,t)=>{const n=lo(t);e.slots.default=()=>n};function uo(e,t,n,o){const r=e.dirs,s=t&&t.dirs;for(let l=0;l(s.has(e)||(e&&O(e.install)?(s.add(e),e.install(i,...t)):O(e)&&(s.add(e),e(i,...t))),i),mixin:e=>(r.mixins.includes(e)||r.mixins.push(e),i),component:(e,t)=>t?(r.components[e]=t,i):r.components[e],directive:(e,t)=>t?(r.directives[e]=t,i):r.directives[e],mount(s,a,c){if(!l){const u=Wo(n,o);return u.appContext=r,a&&t?t(u,s):e(u,s,c),l=!0,i._container=s,s.__vue_app__=i,u.component.proxy}},unmount(){l&&(e(null,i._container),delete i._container.__vue_app__)},provide:(e,t)=>(r.provides[e]=t,i)};return i}}let mo=!1;const vo=e=>/svg/.test(e.namespaceURI)&&"foreignObject"!==e.tagName,go=e=>8===e.nodeType;function bo(e){const{mt:t,p:n,o:{patchProp:o,nextSibling:r,parentNode:s,remove:l,insert:i,createComment:a}}=e,c=(n,o,l,i,a,m=!1)=>{const v=go(n)&&"["===n.data,g=()=>f(n,o,l,i,a,v),{type:b,ref:y,shapeFlag:x}=o,k=n.nodeType;o.el=n;let _=null;switch(b){case Ao:3!==k?_=g():(n.data!==o.children&&(mo=!0,n.data=o.children),_=r(n));break;case Eo:_=8!==k||v?g():r(n);break;case Lo:if(1===k){_=n;const e=!o.children.length;for(let t=0;t{i=i||!!t.dynamicChildren;const{type:a,props:c,patchFlag:u,shapeFlag:p,dirs:f}=t,h="input"===a&&f||"option"===a;if(h||-1!==u){if(f&&uo(t,null,n,"created"),c)if(h||!i||16&u||32&u)for(const t in c)(h&&t.endsWith("value")||S(t)&&!D(t))&&o(e,t,null,c[t]);else c.onClick&&o(e,"onClick",null,c.onClick);let a;if((a=c&&c.onVnodeBeforeMount)&&wo(a,n,t),f&&uo(t,null,n,"beforeMount"),((a=c&&c.onVnodeMounted)||f)&&on((()=>{a&&wo(a,n,t),f&&uo(t,null,n,"mounted")}),r),16&p&&(!c||!c.innerHTML&&!c.textContent)){let o=d(e.firstChild,t,e,n,r,s,i);for(;o;){mo=!0;const e=o;o=o.nextSibling,l(e)}}else 8&p&&e.textContent!==t.children&&(mo=!0,e.textContent=t.children)}return e.nextSibling},d=(e,t,o,r,s,l,i)=>{i=i||!!t.dynamicChildren;const a=t.children,u=a.length;for(let d=0;d{const{slotScopeIds:u}=t;u&&(l=l?l.concat(u):u);const p=s(e),f=d(r(e),t,p,n,o,l,c);return f&&go(f)&&"]"===f.data?r(t.anchor=f):(mo=!0,i(t.anchor=a("]"),p,f),f)},f=(e,t,o,i,a,c)=>{if(mo=!0,t.el=null,c){const t=h(e);for(;;){const n=r(e);if(!n||n===t)break;l(n)}}const u=r(e),d=s(e);return l(e),n(null,t,d,u,o,i,vo(d),a),u},h=e=>{let t=0;for(;e;)if((e=r(e))&&go(e)&&("["===e.data&&t++,"]"===e.data)){if(0===t)return r(e);t--}return e};return[(e,t)=>{if(!t.hasChildNodes())return n(null,e,t),void Vt();mo=!1,c(t.firstChild,e,null,null,null),Vt(),mo&&console.error("Hydration completed but contains mismatches.")},c]}const yo={scheduler:Rt,allowRecurse:!0},xo=on,ko=(e,t,n,o,r=!1)=>{if(E(e))return void e.forEach(((e,s)=>ko(e,t&&(E(t)?t[s]:t),n,o,r)));if(xn(o)&&!r)return;const s=4&o.shapeFlag?hr(o.component)||o.component.proxy:o.el,l=r?null:s,{i:i,r:a}=e,c=t&&t.r,u=i.refs===y?i.refs={}:i.refs,d=i.setupState;if(null!=c&&c!==a&&(T(c)?(u[c]=null,A(d,c)&&(d[c]=null)):ut(c)&&(c.value=null)),T(a)){const e=()=>{u[a]=l,A(d,a)&&(d[a]=l)};l?(e.id=-1,xo(e,n)):e()}else if(ut(a)){const e=()=>{a.value=l};l?(e.id=-1,xo(e,n)):e()}else O(a)&&xt(a,i,12,[l,u])};function _o(e){return function(e,t){const{insert:n,remove:o,patchProp:r,forcePatchProp:s,createElement:l,createText:i,createComment:a,setText:c,setElementText:u,parentNode:d,nextSibling:p,setScopeId:f=k,cloneNode:h,insertStaticContent:m}=e,v=(e,t,n,o=null,r=null,s=null,l=!1,i=null,a=!!t.dynamicChildren)=>{e&&!Io(e,t)&&(o=te(e),J(e,r,s,!0),e=null),-2===t.patchFlag&&(a=!1,t.dynamicChildren=null);const{type:c,ref:u,shapeFlag:d}=t;switch(c){case Ao:g(e,t,n,o);break;case Eo:b(e,t,n,o);break;case Lo:null==e&&_(t,n,o,l);break;case Po:T(e,t,n,o,r,s,l,i,a);break;default:1&d?C(e,t,n,o,r,s,l,i,a):6&d?j(e,t,n,o,r,s,l,i,a):(64&d||128&d)&&c.process(e,t,n,o,r,s,l,i,a,oe)}null!=u&&r&&ko(u,e&&e.ref,s,t||e,!t)},g=(e,t,o,r)=>{if(null==e)n(t.el=i(t.children),o,r);else{const n=t.el=e.el;t.children!==e.children&&c(n,t.children)}},b=(e,t,o,r)=>{null==e?n(t.el=a(t.children||""),o,r):t.el=e.el},_=(e,t,n,o)=>{[e.el,e.anchor]=m(e.children,t,n,o)},w=({el:e,anchor:t},o,r)=>{let s;for(;e&&e!==t;)s=p(e),n(e,o,r),e=s;n(t,o,r)},S=({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=p(e),o(e),e=n;o(t)},C=(e,t,n,o,r,s,l,i,a)=>{l=l||"svg"===t.type,null==e?B(t,n,o,r,s,l,i,a):L(e,t,r,s,l,i,a)},B=(e,t,o,s,i,a,c,d)=>{let p,f;const{type:m,props:v,shapeFlag:g,transition:b,patchFlag:y,dirs:x}=e;if(e.el&&void 0!==h&&-1===y)p=e.el=h(e.el);else{if(p=e.el=l(e.type,a,v&&v.is,v),8&g?u(p,e.children):16&g&&E(e.children,p,null,s,i,a&&"foreignObject"!==m,c,d),x&&uo(e,null,s,"created"),v){for(const t in v)D(t)||r(p,t,null,v[t],a,e.children,s,i,ee);(f=v.onVnodeBeforeMount)&&wo(f,s,e)}P(p,e,e.scopeId,c,s)}x&&uo(e,null,s,"beforeMount");const k=(!i||i&&!i.pendingBranch)&&b&&!b.persisted;k&&b.beforeEnter(p),n(p,t,o),((f=v&&v.onVnodeMounted)||k||x)&&xo((()=>{f&&wo(f,s,e),k&&b.enter(p),x&&uo(e,null,s,"mounted")}),i)},P=(e,t,n,o,r)=>{if(n&&f(e,n),o)for(let s=0;s{for(let c=a;c{const c=t.el=e.el;let{patchFlag:d,dynamicChildren:p,dirs:f}=t;d|=16&e.patchFlag;const h=e.props||y,m=t.props||y;let v;if((v=m.onVnodeBeforeUpdate)&&wo(v,n,t,e),f&&uo(t,e,n,"beforeUpdate"),d>0){if(16&d)O(c,t,h,m,n,o,l);else if(2&d&&h.class!==m.class&&r(c,"class",null,m.class,l),4&d&&r(c,"style",h.style,m.style,l),8&d){const i=t.dynamicProps;for(let t=0;t{v&&wo(v,n,t,e),f&&uo(t,e,n,"updated")}),o)},$=(e,t,n,o,r,s,l)=>{for(let i=0;i{if(n!==o){for(const c in o){if(D(c))continue;const u=o[c],d=n[c];(u!==d||s&&s(e,c))&&r(e,c,d,u,a,t.children,l,i,ee)}if(n!==y)for(const s in n)D(s)||s in o||r(e,s,n[s],null,a,t.children,l,i,ee)}},T=(e,t,o,r,s,l,a,c,u)=>{const d=t.el=e?e.el:i(""),p=t.anchor=e?e.anchor:i("");let{patchFlag:f,dynamicChildren:h,slotScopeIds:m}=t;h&&(u=!0),m&&(c=c?c.concat(m):m),null==e?(n(d,o,r),n(p,o,r),E(t.children,o,p,s,l,a,c,u)):f>0&&64&f&&h&&e.dynamicChildren?($(e.dynamicChildren,h,o,s,l,a,c),(null!=t.key||s&&t===s.subTree)&&So(e,t,!0)):V(e,t,o,p,s,l,a,c,u)},j=(e,t,n,o,r,s,l,i,a)=>{t.slotScopeIds=i,null==e?512&t.shapeFlag?r.ctx.activate(t,n,o,l,a):M(t,n,o,r,s,l,a):F(e,t,a)},M=(e,t,n,o,r,s,l)=>{const i=e.component=function(e,t,n){const o=e.type,r=(t?t.appContext:e.appContext)||sr,s={uid:lr++,vnode:e,type:o,parent:t,appContext:r,root:null,next:null,subTree:null,update:null,render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,effects:null,provides:t?t.provides:Object.create(r.provides),accessCache:null,renderCache:[],components:null,directives:null,propsOptions:eo(o,r),emitsOptions:Ht(o,r),emit:null,emitted:null,propsDefaults:y,inheritAttrs:o.inheritAttrs,ctx:y,data:y,props:y,attrs:y,slots:y,refs:y,setupState:y,setupContext:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return s.ctx={_:s},s.root=t?t.root:s,s.emit=zt.bind(null,s),s}(e,o,r);if(wn(e)&&(i.ctx.renderer=oe),function(e,t=!1){dr=t;const{props:n,children:o}=e.vnode,r=ur(e);Yn(e,n,r,t),((e,t)=>{if(32&e.vnode.shapeFlag){const n=t._;n?(e.slots=it(t),X(t,"_",n)):ao(t,e.slots={})}else e.slots={},t&&co(e,t);X(e.slots,Uo,1)})(e,o);const s=r?function(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=at(new Proxy(e.ctx,or));const{setup:o}=n;if(o){const n=e.setupContext=o.length>1?function(e){const t=t=>{e.exposed=t||{}};return{attrs:e.attrs,slots:e.slots,emit:e.emit,expose:t}}(e):null;ir=e,de();const r=xt(o,e,0,[e.props,n]);if(pe(),ir=null,R(r)){const n=()=>{ir=null};if(r.then(n,n),t)return r.then((t=>{pr(e,t)})).catch((t=>{_t(t,e,0)}));e.asyncDep=r}else pr(e,r)}else fr(e)}(e,t):void 0;dr=!1}(i),i.asyncDep){if(r&&r.registerDep(i,I),!e.el){const e=i.subTree=Wo(Eo);b(null,e,t,n)}}else I(i,e,t,n,r,s,l)},F=(e,t,n)=>{const o=t.component=e.component;if(function(e,t,n){const{props:o,children:r,component:s}=e,{props:l,children:i,patchFlag:a}=t,c=s.emitsOptions;if(t.dirs||t.transition)return!0;if(!(n&&a>=0))return!(!r&&!i||i&&i.$stable)||o!==l&&(o?!l||nn(o,l,c):!!l);if(1024&a)return!0;if(16&a)return o?nn(o,l,c):!!l;if(8&a){const e=t.dynamicProps;for(let t=0;tNt&&Ct.splice(t,1)}(o.update),o.update()}else t.component=e.component,t.el=e.el,o.vnode=t},I=(e,t,n,o,r,s,l)=>{e.update=se((function(){if(e.isMounted){let t,{next:n,bu:o,u:i,parent:a,vnode:c}=e,u=n;n?(n.el=c.el,U(e,n,l)):n=c,o&&Y(o),(t=n.props&&n.props.onVnodeBeforeUpdate)&&wo(t,a,n,c);const p=Zt(e),f=e.subTree;e.subTree=p,v(f,p,d(f.el),te(f),e,r,s),n.el=p.el,null===u&&function({vnode:e,parent:t},n){for(;t&&t.subTree===e;)(e=t.vnode).el=n,t=t.parent}(e,p.el),i&&xo(i,r),(t=n.props&&n.props.onVnodeUpdated)&&xo((()=>wo(t,a,n,c)),r)}else{let l;const{el:i,props:a}=t,{bm:c,m:u,parent:d}=e;if(c&&Y(c),(l=a&&a.onVnodeBeforeMount)&&wo(l,d,t),i&&ie){const n=()=>{e.subTree=Zt(e),ie(i,e.subTree,e,r,null)};xn(t)?t.type.__asyncLoader().then((()=>!e.isUnmounted&&n())):n()}else{const l=e.subTree=Zt(e);v(null,l,n,o,e,r,s),t.el=l.el}if(u&&xo(u,r),l=a&&a.onVnodeMounted){const e=t;xo((()=>wo(l,d,e)),r)}256&t.shapeFlag&&e.a&&xo(e.a,r),e.isMounted=!0,t=n=o=null}}),yo)},U=(e,t,n)=>{t.component=e;const o=e.vnode.props;e.vnode=t,e.next=null,function(e,t,n,o){const{props:r,attrs:s,vnode:{patchFlag:l}}=e,i=it(r),[a]=e.propsOptions;let c=!1;if(!(o||l>0)||16&l){let o;Xn(e,t,r,s)&&(c=!0);for(const s in i)t&&(A(t,s)||(o=G(s))!==s&&A(t,o))||(a?!n||void 0===n[s]&&void 0===n[o]||(r[s]=Zn(a,i,s,void 0,e,!0)):delete r[s]);if(s!==i)for(const e in s)t&&A(t,e)||(delete s[e],c=!0)}else if(8&l){const n=e.vnode.dynamicProps;for(let o=0;o{const{vnode:o,slots:r}=e;let s=!0,l=y;if(32&o.shapeFlag){const e=t._;e?n&&1===e?s=!1:(N(r,t),n||1!==e||delete r._):(s=!t.$stable,ao(t,r)),l=t}else t&&(co(e,t),l={default:1});if(s)for(const i in r)so(i)||i in l||delete r[i]})(e,t.children,n),de(),Ut(void 0,e.update),pe()},V=(e,t,n,o,r,s,l,i,a=!1)=>{const c=e&&e.children,d=e?e.shapeFlag:0,p=t.children,{patchFlag:f,shapeFlag:h}=t;if(f>0){if(128&f)return void z(c,p,n,o,r,s,l,i,a);if(256&f)return void W(c,p,n,o,r,s,l,i,a)}8&h?(16&d&&ee(c,r,s),p!==c&&u(n,p)):16&d?16&h?z(c,p,n,o,r,s,l,i,a):ee(c,r,s,!0):(8&d&&u(n,""),16&h&&E(p,n,o,r,s,l,i,a))},W=(e,t,n,o,r,s,l,i,a)=>{t=t||x;const c=(e=e||x).length,u=t.length,d=Math.min(c,u);let p;for(p=0;pu?ee(e,r,s,!0,!1,d):E(t,n,o,r,s,l,i,a,d)},z=(e,t,n,o,r,s,l,i,a)=>{let c=0;const u=t.length;let d=e.length-1,p=u-1;for(;c<=d&&c<=p;){const o=e[c],u=t[c]=a?Qo(t[c]):Jo(t[c]);if(!Io(o,u))break;v(o,u,n,null,r,s,l,i,a),c++}for(;c<=d&&c<=p;){const o=e[d],c=t[p]=a?Qo(t[p]):Jo(t[p]);if(!Io(o,c))break;v(o,c,n,null,r,s,l,i,a),d--,p--}if(c>d){if(c<=p){const e=p+1,d=ep)for(;c<=d;)J(e[c],r,s,!0),c++;else{const f=c,h=c,m=new Map;for(c=h;c<=p;c++){const e=t[c]=a?Qo(t[c]):Jo(t[c]);null!=e.key&&m.set(e.key,c)}let g,b=0;const y=p-h+1;let k=!1,_=0;const w=new Array(y);for(c=0;c=y){J(o,r,s,!0);continue}let u;if(null!=o.key)u=m.get(o.key);else for(g=h;g<=p;g++)if(0===w[g-h]&&Io(o,t[g])){u=g;break}void 0===u?J(o,r,s,!0):(w[u-h]=c+1,u>=_?_=u:k=!0,v(o,t[u],n,null,r,s,l,i,a),b++)}const S=k?function(e){const t=e.slice(),n=[0];let o,r,s,l,i;const a=e.length;for(o=0;o0&&(t[o]=n[s-1]),n[s]=o)}}s=n.length,l=n[s-1];for(;s-- >0;)n[s]=l,l=t[l];return n}(w):x;for(g=S.length-1,c=y-1;c>=0;c--){const e=h+c,d=t[e],p=e+1{const{el:l,type:i,transition:a,children:c,shapeFlag:u}=e;if(6&u)return void q(e.component.subTree,t,o,r);if(128&u)return void e.suspense.move(t,o,r);if(64&u)return void i.move(e,t,o,oe);if(i===Po){n(l,t,o);for(let e=0;ea.enter(l)),s);else{const{leave:e,delayLeave:r,afterLeave:s}=a,i=()=>n(l,t,o),c=()=>{e(l,(()=>{i(),s&&s()}))};r?r(l,i,c):c()}else n(l,t,o)},J=(e,t,n,o=!1,r=!1)=>{const{type:s,props:l,ref:i,children:a,dynamicChildren:c,shapeFlag:u,patchFlag:d,dirs:p}=e;if(null!=i&&ko(i,null,n,e,!0),256&u)return void t.ctx.deactivate(e);const f=1&u&&p;let h;if((h=l&&l.onVnodeBeforeUnmount)&&wo(h,t,e),6&u)Z(e.component,n,o);else{if(128&u)return void e.suspense.unmount(n,o);f&&uo(e,null,t,"beforeUnmount"),64&u?e.type.remove(e,t,n,r,oe,o):c&&(s!==Po||d>0&&64&d)?ee(c,t,n,!1,!0):(s===Po&&(128&d||256&d)||!r&&16&u)&&ee(a,t,n),o&&Q(e)}((h=l&&l.onVnodeUnmounted)||f)&&xo((()=>{h&&wo(h,t,e),f&&uo(e,null,t,"unmounted")}),n)},Q=e=>{const{type:t,el:n,anchor:r,transition:s}=e;if(t===Po)return void K(n,r);if(t===Lo)return void S(e);const l=()=>{o(n),s&&!s.persisted&&s.afterLeave&&s.afterLeave()};if(1&e.shapeFlag&&s&&!s.persisted){const{leave:t,delayLeave:o}=s,r=()=>t(n,l);o?o(e.el,l,r):r()}else l()},K=(e,t)=>{let n;for(;e!==t;)n=p(e),o(e),e=n;o(t)},Z=(e,t,n)=>{const{bum:o,effects:r,update:s,subTree:l,um:i}=e;if(o&&Y(o),r)for(let a=0;a{e.isUnmounted=!0}),t),t&&t.pendingBranch&&!t.isUnmounted&&e.asyncDep&&!e.asyncResolved&&e.suspenseId===t.pendingId&&(t.deps--,0===t.deps&&t.resolve())},ee=(e,t,n,o=!1,r=!1,s=0)=>{for(let l=s;l6&e.shapeFlag?te(e.component.subTree):128&e.shapeFlag?e.suspense.next():p(e.anchor||e.el),ne=(e,t,n)=>{null==e?t._vnode&&J(t._vnode,null,null,!0):v(t._vnode||null,e,t,null,null,null,n),Vt(),t._vnode=e},oe={p:v,um:J,m:q,r:Q,mt:M,mc:E,pc:V,pbc:$,n:te,o:e};let re,ie;t&&([re,ie]=t(oe));return{render:ne,hydrate:re,createApp:ho(ne,re)}}(e,bo)}function wo(e,t,n,o=null){kt(e,t,7,[n,o])}function So(e,t,n=!1){const o=e.children,r=t.children;if(E(o)&&E(r))for(let s=0;s0?Oo||x:null,$o.pop(),Oo=$o[$o.length-1]||null,jo>0&&Oo&&Oo.push(s),s}function Fo(e){return!!e&&!0===e.__v_isVNode}function Io(e,t){return e.type===t.type&&e.key===t.key}const Uo="__vInternal",Vo=({key:e})=>null!=e?e:null,Do=({ref:e})=>null!=e?T(e)||ut(e)||O(e)?{i:Gt,r:e}:e:null,Wo=function(e,t=null,n=null,o=0,r=null,s=!1){e&&e!==No||(e=Eo);if(Fo(e)){const o=zo(e,t,!0);return n&&Ko(o,n),o}l=e,O(l)&&"__vccOpts"in l&&(e=e.__vccOpts);var l;if(t){(lt(t)||Uo in t)&&(t=N({},t));let{class:e,style:n}=t;e&&!T(e)&&(t.class=v(e)),M(n)&&(lt(n)&&!E(n)&&(n=N({},n)),t.style=p(n))}const i=T(e)?1:(e=>e.__isSuspense)(e)?128:(e=>e.__isTeleport)(e)?64:M(e)?4:O(e)?2:0,a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Vo(t),ref:t&&Do(t),scopeId:Jt,slotScopeIds:null,children:null,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,shapeFlag:i,patchFlag:o,dynamicProps:r,dynamicChildren:null,appContext:null};Ko(a,n),128&i&&e.normalize(a);jo>0&&!s&&Oo&&(o>0||6&i)&&32!==o&&Oo.push(a);return a};function zo(e,t,n=!1){const{props:o,ref:r,patchFlag:s,children:l}=e,i=t?Yo(o||{},t):o;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:i,key:i&&Vo(i),ref:t&&t.ref?n&&r?E(r)?r.concat(Do(t)):[r,Do(t)]:Do(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Po?-1===s?16:16|s:s,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&zo(e.ssContent),ssFallback:e.ssFallback&&zo(e.ssFallback),el:e.el,anchor:e.anchor}}function Ho(e=" ",t=0){return Wo(Ao,null,e,t)}function qo(e,t){const n=Wo(Lo,null,e);return n.staticCount=t,n}function Go(e="",t=!1){return t?(To(),Ro(Eo,null,e)):Wo(Eo,null,e)}function Jo(e){return null==e||"boolean"==typeof e?Wo(Eo):E(e)?Wo(Po,null,e.slice()):"object"==typeof e?Qo(e):Wo(Ao,null,String(e))}function Qo(e){return null===e.el?e:zo(e)}function Ko(e,t){let n=0;const{shapeFlag:o}=e;if(null==t)t=null;else if(E(t))n=16;else if("object"==typeof t){if(1&o||64&o){const n=t.default;return void(n&&(n._c&&(n._d=!1),Ko(e,n()),n._c&&(n._d=!0)))}{n=32;const o=t._;o||Uo in t?3===o&&Gt&&(1===Gt.slots._?t._=1:(t._=2,e.patchFlag|=1024)):t._ctx=Gt}}else O(t)?(t={default:t,_ctx:Gt},n=32):(t=String(t),64&o?(n=16,t=[Ho(t)]):n=8);e.children=t,e.shapeFlag|=n}function Yo(...e){const t=N({},e[0]);for(let n=1;n!Fo(e)||e.type!==Eo&&!(e.type===Po&&!er(e.children))))?e:null}const tr=e=>e?ur(e)?hr(e)||e.proxy:tr(e.parent):null,nr=N(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>tr(e.parent),$root:e=>tr(e.root),$emit:e=>e.emit,$options:e=>zn(e),$forceUpdate:e=>()=>Rt(e.update),$nextTick:e=>Mt.bind(e.proxy),$watch:e=>cn.bind(e)}),or={get({_:e},t){const{ctx:n,setupState:o,data:r,props:s,accessCache:l,type:i,appContext:a}=e;let c;if("$"!==t[0]){const i=l[t];if(void 0!==i)switch(i){case 0:return o[t];case 1:return r[t];case 3:return n[t];case 2:return s[t]}else{if(o!==y&&A(o,t))return l[t]=0,o[t];if(r!==y&&A(r,t))return l[t]=1,r[t];if((c=e.propsOptions[0])&&A(c,t))return l[t]=2,s[t];if(n!==y&&A(n,t))return l[t]=3,n[t];Un&&(l[t]=4)}}const u=nr[t];let d,p;return u?("$attrs"===t&&fe(e,0,t),u(e)):(d=i.__cssModules)&&(d=d[t])?d:n!==y&&A(n,t)?(l[t]=3,n[t]):(p=a.config.globalProperties,A(p,t)?p[t]:void 0)},set({_:e},t,n){const{data:o,setupState:r,ctx:s}=e;if(r!==y&&A(r,t))r[t]=n;else if(o!==y&&A(o,t))o[t]=n;else if(A(e.props,t))return!1;return("$"!==t[0]||!(t.slice(1)in e))&&(s[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:o,appContext:r,propsOptions:s}},l){let i;return void 0!==n[l]||e!==y&&A(e,l)||t!==y&&A(t,l)||(i=s[0])&&A(i,l)||A(o,l)||A(nr,l)||A(r.config.globalProperties,l)}},rr=N({},or,{get(e,t){if(t!==Symbol.unscopables)return or.get(e,t,e)},has:(e,t)=>"_"!==t[0]&&!u(t)}),sr=po();let lr=0;let ir=null;const ar=()=>ir||Gt,cr=e=>{ir=e};function ur(e){return 4&e.vnode.shapeFlag}let dr=!1;function pr(e,t,n){O(t)?e.render=t:M(t)&&(e.setupState=mt(t)),fr(e)}function fr(e,t,n){const o=e.type;e.render||(e.render=o.render||k,e.render._rc&&(e.withProxy=new Proxy(e.ctx,rr))),ir=e,de(),Vn(e),pe(),ir=null}function hr(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(mt(at(e.exposed)),{get:(t,n)=>n in t?t[n]:n in nr?nr[n](e):void 0}))}function mr(e,t=ir){t&&(t.effects||(t.effects=[])).push(e)}function vr(e){return O(e)&&e.displayName||e.name}function gr(e){const t=function(e){let t,n;return O(e)?(t=e,n=k):(t=e.get,n=e.set),new yt(t,n,O(e)||!e.set)}(e);return mr(t.effect),t}function br(e,t,n){const o=arguments.length;return 2===o?M(t)&&!E(t)?Fo(t)?Wo(e,null,[t]):Wo(e,t):Wo(e,null,t):(o>3?n=Array.prototype.slice.call(arguments,2):3===o&&Fo(n)&&(n=[n]),Wo(e,t,n))}const yr="3.1.5",xr="undefined"!=typeof document?document:null,kr=new Map,_r={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,o)=>{const r=t?xr.createElementNS("http://www.w3.org/2000/svg",e):xr.createElement(e,n?{is:n}:void 0);return"select"===e&&o&&null!=o.multiple&&r.setAttribute("multiple",o.multiple),r},createText:e=>xr.createTextNode(e),createComment:e=>xr.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>xr.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},cloneNode(e){const t=e.cloneNode(!0);return"_value"in e&&(t._value=e._value),t},insertStaticContent(e,t,n,o){const r=n?n.previousSibling:t.lastChild;let s=kr.get(e);if(!s){const t=xr.createElement("template");if(t.innerHTML=o?`${e}`:e,s=t.content,o){const e=s.firstChild;for(;e.firstChild;)s.appendChild(e.firstChild);s.removeChild(e)}kr.set(e,s)}return t.insertBefore(s.cloneNode(!0),n),[r?r.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};const wr=/\s*!important$/;function Sr(e,t,n){if(E(n))n.forEach((n=>Sr(e,t,n)));else if(t.startsWith("--"))e.setProperty(t,n);else{const o=function(e,t){const n=Nr[t];if(n)return n;let o=H(t);if("filter"!==o&&o in e)return Nr[t]=o;o=J(o);for(let r=0;rdocument.createEvent("Event").timeStamp&&(Pr=()=>performance.now());const e=navigator.userAgent.match(/firefox\/(\d+)/i);Ar=!!(e&&Number(e[1])<=53)}let Er=0;const Lr=Promise.resolve(),$r=()=>{Er=0};function Or(e,t,n,o,r=null){const s=e._vei||(e._vei={}),l=s[t];if(o&&l)l.value=o;else{const[n,i]=function(e){let t;if(Tr.test(e)){let n;for(t={};n=e.match(Tr);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[G(e.slice(2)),t]}(t);if(o){!function(e,t,n,o){e.addEventListener(t,n,o)}(e,n,s[t]=function(e,t){const n=e=>{const o=e.timeStamp||Pr();(Ar||o>=n.attached-1)&&kt(function(e,t){if(E(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map((e=>t=>!t._stopped&&e(t)))}return t}(e,n.value),t,5,[e])};return n.value=e,n.attached=(()=>Er||(Lr.then($r),Er=Pr()))(),n}(o,r),i)}else l&&(!function(e,t,n,o){e.removeEventListener(t,n,o)}(e,n,l,i),s[t]=void 0)}}const Tr=/(?:Once|Passive|Capture)$/;const jr=/^on[a-z]/;Boolean;const Mr=N({patchProp:(e,t,n,o,r=!1,s,l,i,a)=>{switch(t){case"class":!function(e,t,n){const o=e._vtc;o&&(t=(t?[t,...o]:[...o]).join(" ")),null==t?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}(e,o,r);break;case"style":!function(e,t,n){const o=e.style;if(n)if(T(n)){if(t!==n){const t=o.display;o.cssText=n,"_vod"in e&&(o.display=t)}}else{for(const e in n)Sr(o,e,n[e]);if(t&&!T(t))for(const e in t)null==n[e]&&Sr(o,e,"")}else e.removeAttribute("style")}(e,n,o);break;default:S(t)?C(t)||Or(e,t,0,o,l):function(e,t,n,o){if(o)return"innerHTML"===t||!!(t in e&&jr.test(t)&&O(n));if("spellcheck"===t||"draggable"===t)return!1;if("form"===t)return!1;if("list"===t&&"INPUT"===e.tagName)return!1;if("type"===t&&"TEXTAREA"===e.tagName)return!1;if(jr.test(t)&&T(n))return!1;return t in e}(e,t,o,r)?function(e,t,n,o,r,s,l){if("innerHTML"===t||"textContent"===t)return o&&l(o,r,s),void(e[t]=null==n?"":n);if("value"===t&&"PROGRESS"!==e.tagName){e._value=n;const o=null==n?"":n;return e.value!==o&&(e.value=o),void(null==n&&e.removeAttribute(t))}if(""===n||null==n){const o=typeof e[t];if(""===n&&"boolean"===o)return void(e[t]=!0);if(null==n&&"string"===o)return e[t]="",void e.removeAttribute(t);if("number"===o){try{e[t]=0}catch(i){}return void e.removeAttribute(t)}}try{e[t]=n}catch(a){}}(e,t,o,s,l,i,a):("true-value"===t?e._trueValue=o:"false-value"===t&&(e._falseValue=o),function(e,t,n,o,r){if(o&&t.startsWith("xlink:"))null==n?e.removeAttributeNS(Br,t.slice(6,t.length)):e.setAttributeNS(Br,t,n);else{const o=d(t);null==n||o&&!1===n?e.removeAttribute(t):e.setAttribute(t,o?"":n)}}(e,t,o,r))}},forcePatchProp:(e,t)=>"value"===t},_r);let Rr,Fr=!1;const Ir=(...e)=>{const t=(Rr=Fr?Rr:_o(Mr),Fr=!0,Rr).createApp(...e),{mount:n}=t;return t.mount=e=>{const t=function(e){if(T(e)){return document.querySelector(e)}return e}(e);if(t)return n(t,!0,t instanceof SVGElement)},t};const Ur=/^https?:/i,Vr="undefined"!=typeof window;function Dr(e,t){const n=function(e,t){t.sort(((e,t)=>{const n=t.split("/").length-e.split("/").length;return 0!==n?n:t.length-e.length}));for(const n of t)if(e.startsWith(n))return}(t,Object.keys(e));return n?e[n]:void 0}function Wr(e,t){t=function(e,t){if(!Vr)return t;const n=e.base,o=n.endsWith("/")?n.slice(0,-1):n;return t.slice(o.length)}(e,t);const n=Dr(e.locales||{},t)||{},o=Dr(e.themeConfig&&e.themeConfig.locales||{},t)||{};return a(i(i({},e),n),{themeConfig:a(i(i({},e.themeConfig),o),{locales:{}}),lang:o.lang||e.lang,locales:{}})}const zr=Symbol(),Hr=dt((qr='{"lang":"en-US","title":"Awesome Notes","description":"Daily Notes I Learned.","base":"/awesome-notes/","head":[["link",{"rel":"icon","type":"image/svg+xml","href":"/awesome-notes/logo.svg"}]],"themeConfig":{"repo":"sabertazimi/awesome-notes","logo":"/logo.svg","docsDir":"notes","docsBranch":"main","editLinks":true,"editLinkText":"Edit this page on GitHub","lastUpdated":"Last Updated","nav":[{"text":"Notes","link":"/","activeMatch":"^/$"},{"text":"Computer Science","link":"/computerScience/virtualization/virtBasicNotes","activeMatch":"^/computerScience/"},{"text":"Language","link":"/language/verilog/verilogBasicNotes","activeMatch":"^/language/"},{"text":"Programming","link":"/programming/tools/vim/vimBasicNotes","activeMatch":"^/programming/"},{"text":"Web","link":"/web/security/securityBasicNotes","activeMatch":"^/web/"},{"text":"Links","items":[{"text":"Twitter","link":"https://twitter.com/sabertazimi"},{"text":"Facebook","link":"https://facebook.com/sabertazimi"},{"text":"Weibo","link":"https://weibo.com/sabertazimi"}]},{"text":"GitBook","link":"https://notes.tazimi.dev"}],"sidebar":{"/computerScience/":[{"text":"Computer Science","children":[{"text":"Algorithms","link":"/computerScience/algorithms/algorithmsBasicNotes"},{"text":"OJ","link":"/computerScience/algorithms/ojBasicNotes"},{"text":"Architecture","link":"/computerScience/architecture/archBasicNotes"},{"text":"Graph Processing","link":"/computerScience/architecture/graphProcessingBasicNotes"},{"text":"Compiler","link":"/computerScience/compilers/compilersBasicNotes"},{"text":"Database","link":"/computerScience/database/databaseBasicNotes"},{"text":"Latex","link":"/computerScience/latex/latexBasicNotes"},{"text":"Network","link":"/computerScience/network/networkBasicNotes"},{"text":"CSAPP","link":"/computerScience/operatingSystems/CSAPP"},{"text":"Operating Systems","link":"/computerScience/operatingSystems/operatingSystemsBasicNotes"},{"text":"Virtualization","link":"/computerScience/virtualization/virtBasicNotes"}]}],"/language/":[{"text":"Language","children":[{"text":"Assembly","link":"/language/assembly/assemblyBasicNotes"},{"text":"C","link":"/language/c/cBasicNotes"},{"text":"C++","link":"/language/cpp/cppBasicNotes"},{"text":"Go","link":"/language/go/goBasicNotes"},{"text":"Haskell","link":"/language/haskell/haskellBasicNotes"},{"text":"Java","link":"/language/java/javaBasicNotes"},{"text":"Python","link":"/language/python/pythonBasicNotes"},{"text":"Verilog","link":"/language/verilog/verilogBasicNotes"}]}],"/programming/":[{"text":"Programming","children":[{"text":"Android","link":"/programming/android/androidBasicNotes"},{"text":"Clean Code","link":"/programming/devops/cleanCodeBasicNotes"},{"text":"Design Patterns","link":"/programming/devops/designPatternsBasicNotes"},{"text":"Software Testing","link":"/programming/devops/softwareTestingBasicNotes"},{"text":"Functional Programming","link":"/programming/functionalProgramming/functionalProgrammingBasicNotes"},{"text":"Game Design","link":"/programming/game/gameDesignBasicNotes"},{"text":"Linux","link":"/programming/linux/linuxBasicNotes"},{"text":"CMake","link":"/programming/tools/buildTools/CMakeBasicNotes"},{"text":"Git","link":"/programming/tools/git/gitBasicNotes"},{"text":"Vim","link":"/programming/tools/vim/vimBasicNotes"}]}],"/web/":[{"text":"Web","children":[{"text":"HTML","link":"/web/html/htmlBasicNotes"},{"text":"CSS","link":"/web/css/cssBasicNotes"},{"text":"Advanced CSS","link":"/web/css/cssAdvancedNotes"},{"text":"Sass","link":"/web/css/sassBasicNotes"},{"text":"Bootstrap","link":"/web/css/bootstrapBasicNotes"},{"text":"JavaScript","link":"/web/javascript/javascriptBasicNotes"},{"text":"Advanced JavaScript","link":"/web/javascript/javascriptAdvancedNotes"},{"text":"TypeScript","link":"/web/javascript/typescriptBasicNotes"},{"text":"Angular","link":"/web/angular/angularBasicNotes"},{"text":"React","link":"/web/react/reactBasicNotes"},{"text":"React Router","link":"/web/react/reactRouterBasicNotes"},{"text":"Redux","link":"/web/react/reduxBasicNotes"},{"text":"Vue","link":"/web/vue/vueBasicNotes"},{"text":"Library","link":"/web/frameworks/libraryBasicNotes"},{"text":"jQuery","link":"/web/frameworks/jQueryBasicNotes"},{"text":"Electron","link":"/web/frameworks/electronBasicNotes"},{"text":"Node","link":"/web/node/nodeBasicNotes"},{"text":"Express","link":"/web/node/expressBasicNotes"},{"text":"GraphQL","link":"/web/node/graphqlBasicNotes"},{"text":"Message Queue","link":"/web/node/messageQueueBasicNotes"},{"text":"Web Security","link":"/web/security/securityBasicNotes"}]}],"/":[{"text":"Computer Science","children":[{"text":"Algorithms","link":"/computerScience/algorithms/algorithmsBasicNotes"},{"text":"OJ","link":"/computerScience/algorithms/ojBasicNotes"},{"text":"Architecture","link":"/computerScience/architecture/archBasicNotes"},{"text":"Graph Processing","link":"/computerScience/architecture/graphProcessingBasicNotes"},{"text":"Compiler","link":"/computerScience/compilers/compilersBasicNotes"},{"text":"Database","link":"/computerScience/database/databaseBasicNotes"},{"text":"Latex","link":"/computerScience/latex/latexBasicNotes"},{"text":"Network","link":"/computerScience/network/networkBasicNotes"},{"text":"CSAPP","link":"/computerScience/operatingSystems/CSAPP"},{"text":"Operating Systems","link":"/computerScience/operatingSystems/operatingSystemsBasicNotes"},{"text":"Virtualization","link":"/computerScience/virtualization/virtBasicNotes"}]},{"text":"Language","children":[{"text":"Assembly","link":"/language/assembly/assemblyBasicNotes"},{"text":"C","link":"/language/c/cBasicNotes"},{"text":"C++","link":"/language/cpp/cppBasicNotes"},{"text":"Go","link":"/language/go/goBasicNotes"},{"text":"Haskell","link":"/language/haskell/haskellBasicNotes"},{"text":"Java","link":"/language/java/javaBasicNotes"},{"text":"Python","link":"/language/python/pythonBasicNotes"},{"text":"Verilog","link":"/language/verilog/verilogBasicNotes"}]},{"text":"Programming","children":[{"text":"Android","link":"/programming/android/androidBasicNotes"},{"text":"Clean Code","link":"/programming/devops/cleanCodeBasicNotes"},{"text":"Design Patterns","link":"/programming/devops/designPatternsBasicNotes"},{"text":"Software Testing","link":"/programming/devops/softwareTestingBasicNotes"},{"text":"Functional Programming","link":"/programming/functionalProgramming/functionalProgrammingBasicNotes"},{"text":"Game Design","link":"/programming/game/gameDesignBasicNotes"},{"text":"Linux","link":"/programming/linux/linuxBasicNotes"},{"text":"CMake","link":"/programming/tools/buildTools/CMakeBasicNotes"},{"text":"Git","link":"/programming/tools/git/gitBasicNotes"},{"text":"Vim","link":"/programming/tools/vim/vimBasicNotes"}]},{"text":"Web","children":[{"text":"HTML","link":"/web/html/htmlBasicNotes"},{"text":"CSS","link":"/web/css/cssBasicNotes"},{"text":"Advanced CSS","link":"/web/css/cssAdvancedNotes"},{"text":"Sass","link":"/web/css/sassBasicNotes"},{"text":"Bootstrap","link":"/web/css/bootstrapBasicNotes"},{"text":"JavaScript","link":"/web/javascript/javascriptBasicNotes"},{"text":"Advanced JavaScript","link":"/web/javascript/javascriptAdvancedNotes"},{"text":"TypeScript","link":"/web/javascript/typescriptBasicNotes"},{"text":"Angular","link":"/web/angular/angularBasicNotes"},{"text":"React","link":"/web/react/reactBasicNotes"},{"text":"React Router","link":"/web/react/reactRouterBasicNotes"},{"text":"Redux","link":"/web/react/reduxBasicNotes"},{"text":"Vue","link":"/web/vue/vueBasicNotes"},{"text":"Library","link":"/web/frameworks/libraryBasicNotes"},{"text":"jQuery","link":"/web/frameworks/jQueryBasicNotes"},{"text":"Electron","link":"/web/frameworks/electronBasicNotes"},{"text":"Node","link":"/web/node/nodeBasicNotes"},{"text":"Express","link":"/web/node/expressBasicNotes"},{"text":"GraphQL","link":"/web/node/graphqlBasicNotes"},{"text":"Message Queue","link":"/web/node/messageQueueBasicNotes"},{"text":"Web Security","link":"/web/security/securityBasicNotes"}]}]}},"locales":{},"customData":{}}',nt(JSON.parse(qr))));var qr;function Gr(){const e=rn(zr);if(!e)throw new Error("vitepress data not properly injected in app");return e}function Jr(e){return Ur.test(e)?e:function(e,t){return`${e}${t}`.replace(/\/+/g,"/")}(Hr.value.base,e)}function Qr(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t.endsWith("/")&&(t+="index"),Vr){const e="/awesome-notes/";t=t.slice(e.length).replace(/\//g,"_")+".md";const n=__VP_HASH_MAP__[t.toLowerCase()];t=`${e}assets/${t}.${n}.js`}else t=`./${t.slice(1).replace(/\//g,"_")}.md.js`;return t}const Kr=Symbol();function Yr(){return function(){const e=rn(Kr);if(!e)throw new Error("useRouter() is called without provider.");return e}().route}function Xr(e,t,n=!1){const o=e.classList.contains(".header-anchor")?e:document.querySelector(decodeURIComponent(t));if(o){const e=o.offsetTop;!n||Math.abs(e-window.scrollY)>window.innerHeight?window.scrollTo(0,e):window.scrollTo({left:0,top:e,behavior:"smooth"})}}function Zr(e,t){let n=[],o=!0;var r;an((()=>{const r=e.data,s=t.value,l=r&&r.title,i=r&&r.description,a=r&&r.frontmatter.head;var c;document.title=(l?l+" | ":"")+s.title,document.querySelector("meta[name=description]").setAttribute("content",i||s.description),(e=>{if(o)return void(o=!1);const t=[],r=Math.min(n.length,e.length);for(let o=0;odocument.head.removeChild(e))),e.slice(r).forEach((e=>{const n=es(e);document.head.appendChild(n),t.push(n)})),n=t})([...a?(c=a,c.filter((e=>{return!("meta"===(t=e)[0]&&t[1]&&"description"===t[1].name);var t}))):[]])}),null,r)}function es([e,t,n]){const o=document.createElement(e);for(const r in t)o.setAttribute(r,t[r]);return n&&(o.innerHTML=n),o}const ts=yn({name:"VitePressContent",setup(){const e=Yr();return()=>br("div",{style:{position:"relative"}},[e.component?br(e.component):null])}});Kt("data-v-edc1134c");const ns=Wo("p",{class:"title"},"Debug",-1),os={class:"block"};Yt();yn({setup(e){const t=Gr(),n=dt(null),o=dt(!1);return ln(o,(e=>{!1===e&&(n.value.scrollTop=0)})),(e,r)=>(To(),Ro("div",{class:["debug",{open:o.value}],ref:n,onClick:r[1]||(r[1]=e=>o.value=!o.value)},[ns,Wo("pre",os,g(ft(t)),1)],2))}}).__scopeId="data-v-edc1134c";const rs=/#.*$/,ss=/(index)?\.(md|html)$/,ls=/\/$/,is=/^[a-z]+:/i;function as(e){return Array.isArray(e)}function cs(e){return is.test(e)}function us(e){return decodeURI(e).replace(rs,"").replace(ss,"")}function ds(e){return/^\//.test(e)?e:`/${e}`}function ps(e){return e.replace(/(index)?(\.(md|html))?$/,"")||"/"}function fs(e,t){if(function(e){return!1===e||"auto"===e||as(e)}(e))return e;t=ds(t);for(const n in e)if(t.startsWith(ds(n)))return e[n];return"auto"}function hs(e){return e.reduce(((e,t)=>(t.link&&e.push({text:t.text,link:ps(t.link)}),function(e){return void 0!==e.children}(t)&&(e=[...e,...hs(t.children)]),e)),[])}var ms=yn({setup(e){const{site:t,theme:n,localePath:o}=Gr();return(e,r)=>(To(),Ro("a",{class:"nav-bar-title",href:ft(o),"aria-label":`${ft(t).title}, back to home`},[ft(n).logo?(To(),Ro("img",{key:0,class:"logo",src:ft(Jr)(ft(n).logo),alt:"Logo"},null,8,["src"])):Go("v-if",!0),Ho(" "+g(ft(t).title),1)],8,["href","aria-label"]))}});ms.__scopeId="data-v-f07481ba";const vs=["GitHub","GitLab","Bitbucket"].map((e=>[e,new RegExp(e,"i")]));function gs(){const{site:e}=Gr();return gr((()=>{const t=e.value.themeConfig,n=t.docsRepo||t.repo;if(!n)return null;const o=/^https?:/.test(r=n)?r:`https://github.com/${r}`;var r;return{text:function(e,t){if(t)return t;const n=e.match(/^https?:\/\/[^/]+/);if(!n)return"Source";const o=vs.find((([e,t])=>t.test(n[0])));if(o&&o[0])return o[0];return"Source"}(o,t.repoLabel),link:o}}))}function bs(e){const t=Yr(),n=cs(e.value.link);return{props:gr((()=>{const o=ys(`/${t.data.relativePath}`);let r=!1;if(e.value.activeMatch)r=new RegExp(e.value.activeMatch).test(o);else{const t=ys(Jr(e.value.link));r="/"===t?t===o:o.startsWith(t)}return{class:{active:r,isExternal:n},href:n?e.value.link:Jr(e.value.link),target:e.value.target||n?"_blank":null,rel:e.value.rel||n?"noopener noreferrer":null,"aria-label":e.value.ariaLabel}})),isExternal:n}}function ys(e){return e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\.(html|md)$/,"").replace(/\/index$/,"/")}const xs={},ks={class:"icon outbound",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"},_s=Wo("path",{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"},null,-1),ws=Wo("polygon",{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"},null,-1);xs.render=function(e,t){return To(),Ro("svg",ks,[_s,ws])},Kt("data-v-2c9af77b");const Ss={class:"nav-link"};Yt();var Cs=yn({props:{item:{type:null,required:!0}},setup(e){const t=vt(e),{props:n,isExternal:o}=bs(t.item);return(t,r)=>(To(),Ro("div",Ss,[Wo("a",Yo({class:"item"},ft(n)),[Ho(g(e.item.text)+" ",1),ft(o)?(To(),Ro(xs,{key:0})):Go("v-if",!0)],16)]))}});Cs.__scopeId="data-v-2c9af77b",Kt("data-v-22d28cf1");const Ns={class:"nav-dropdown-link-item"},Bs=Wo("span",{class:"arrow"},null,-1),Ps={class:"text"},As={class:"icon"};Yt();var Es=yn({props:{item:{type:null,required:!0}},setup(e){const t=vt(e),{props:n,isExternal:o}=bs(t.item);return(t,r)=>(To(),Ro("div",Ns,[Wo("a",Yo({class:"item"},ft(n)),[Bs,Wo("span",Ps,g(e.item.text),1),Wo("span",As,[ft(o)?(To(),Ro(xs,{key:0})):Go("v-if",!0)])],16)]))}});Es.__scopeId="data-v-22d28cf1",Kt("data-v-2a5d8d7e");const Ls={class:"button-text"},$s={class:"dialog"};Yt();var Os=yn({props:{item:{type:null,required:!0}},setup(e){const t=Yr(),n=dt(!1);function o(){n.value=!n.value}return ln((()=>t.path),(()=>{n.value=!1})),(t,r)=>(To(),Ro("div",{class:["nav-dropdown-link",{open:n.value}]},[Wo("button",{class:"button","aria-label":e.item.ariaLabel,onClick:o},[Wo("span",Ls,g(e.item.text),1),Wo("span",{class:["button-arrow",n.value?"down":"right"]},null,2)],8,["aria-label"]),Wo("ul",$s,[(To(!0),Ro(Po,null,Xo(e.item.items,(e=>(To(),Ro("li",{key:e.text,class:"dialog-item"},[Wo(Es,{item:e},null,8,["item"])])))),128))])],2))}});Os.__scopeId="data-v-2a5d8d7e",Kt("data-v-74485887");const Ts={key:0,class:"nav-links"},js={key:1,class:"item"},Ms={key:2,class:"item"};Yt();var Rs=yn({setup(e){const{theme:t}=Gr(),n=function(){const e=Yr(),{site:t}=Gr();return gr((()=>{const n=t.value.themeConfig.locales;if(!n)return null;const o=Object.keys(n);if(o.length<=1)return null;const r=Vr?t.value.base:"/",s=r.endsWith("/")?r.slice(0,-1):r,l=e.path.slice(s.length),i=o.find((e=>"/"!==e&&l.startsWith(e))),a=i?l.substring(i.length-1):l,c=o.map((e=>{const t=e.endsWith("/")?e.slice(0,-1):e;return{text:n[e].label,link:`${t}${a}`}})),u=i||"/";return{text:n[u].selectText?n[u].selectText:"Languages",items:c}}))}(),o=gs(),r=gr((()=>t.value.nav||o.value||n.value));return(e,s)=>ft(r)?(To(),Ro("nav",Ts,[ft(t).nav?(To(!0),Ro(Po,{key:0},Xo(ft(t).nav,(e=>(To(),Ro("div",{key:e.text,class:"item"},[e.items?(To(),Ro(Os,{key:0,item:e},null,8,["item"])):(To(),Ro(Cs,{key:1,item:e},null,8,["item"]))])))),128)):Go("v-if",!0),ft(n)?(To(),Ro("div",js,[Wo(Os,{item:ft(n)},null,8,["item"])])):Go("v-if",!0),ft(o)?(To(),Ro("div",Ms,[Wo(Cs,{item:ft(o)},null,8,["item"])])):Go("v-if",!0)])):Go("v-if",!0)}});Rs.__scopeId="data-v-74485887";var Fs={emits:["toggle"]};const Is=Wo("svg",{class:"icon",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",role:"img",viewBox:"0 0 448 512"},[Wo("path",{fill:"currentColor",d:"M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z",class:""})],-1);Fs.render=function(e,t,n,o,r,s){return To(),Ro("div",{class:"sidebar-button",onClick:t[1]||(t[1]=t=>e.$emit("toggle"))},[Is])},Kt("data-v-dd1cb1ee");const Us={class:"nav-bar"},Vs=Wo("div",{class:"flex-grow"},null,-1),Ds={class:"nav"};Yt();var Ws=yn({emits:["toggle"],setup:e=>(e,t)=>(To(),Ro("header",Us,[Wo(Fs,{onToggle:t[1]||(t[1]=t=>e.$emit("toggle"))}),Wo(ms),Vs,Wo("div",Ds,[Wo(Rs)]),Zo(e.$slots,"search",{},void 0,!0)]))});function zs(){let e=null,t=null;const n=function(e,t){let n,o=!1;return()=>{n&&clearTimeout(n),o?n=setTimeout(e,t):(e(),o=!0,setTimeout((()=>{o=!1}),t))}}(o,300);function o(){const e=function(e){return[].slice.call(document.querySelectorAll(".header-anchor")).filter((t=>e.some((e=>e.hash===t.hash))))}([].slice.call(document.querySelectorAll(".sidebar a.sidebar-link-item")));for(let t=0;t ul > li");o&&o!==t.parentElement?(e=o.querySelector("a"),e&&e.classList.add("active")):e=null}function s(e){e&&e.classList.remove("active")}Ln((()=>{o(),window.addEventListener("scroll",n)})),On((()=>{r(decodeURIComponent(location.hash))})),jn((()=>{window.removeEventListener("scroll",n)}))}function Hs(e){const t=document.querySelector(".nav-bar").offsetHeight;return e.parentElement.offsetTop-t-15}function qs(e,t,n){const o=window.scrollY;return 0===e&&0===o?[!0,null]:o{if(e-1>t)return;const l={text:r,link:`#${s}`};2===e?(o=l,n.push(l)):o&&(o.children||(o.children=[])).push(l)})),n}Ws.__scopeId="data-v-dd1cb1ee";const Js=e=>{const t=Yr(),{site:n,frontmatter:o}=Gr(),r=e.depth||1,s=o.value.sidebarDepth||1/0,l=t.data.headers,i=e.item.text,a=function(e,t){if(void 0===t)return t;if(t.startsWith("#"))return t;return function(e,t){const n=e.endsWith("/"),o=t.startsWith("/");return n&&o?e.slice(0,-1)+t:n||o?e+t:`${e}/${t}`}(e,t)}(n.value.base,e.item.link),c=e.item.children,u=function(e,t){return void 0!==t&&us(`/${e.data.relativePath}`)===us(t)}(t,e.item.link),d=r0?br("ul",{class:"sidebar-links"},t.map((e=>br(Js,{item:e,depth:o})))):e&&n?Qs(!1,function(e){return Ks(function(e){let t;return(e=e.map((e=>Object.assign({},e)))).forEach((e=>{2===e.level?t=e:t&&(t.children||(t.children=[])).push(e)})),e.filter((e=>2===e.level))}(e))}(n),void 0,o):null}function Ks(e){return e.map((e=>({text:e.title,link:`#${e.slug}`,children:e.children?Ks(e.children):void 0})))}const Ys={key:0,class:"sidebar-links"};var Xs=yn({setup(e){const t=function(){const e=Yr(),{site:t}=Gr();return zs(),gr((()=>{const n=e.data.headers,o=e.data.frontmatter.sidebar,r=e.data.frontmatter.sidebarDepth;if(!1===o)return[];if("auto"===o)return Gs(n,r);const s=fs(t.value.themeConfig.sidebar,e.data.relativePath);return!1===s?[]:"auto"===s?Gs(n,r):s}))}();return(e,n)=>ft(t).length>0?(To(),Ro("ul",Ys,[(To(!0),Ro(Po,null,Xo(ft(t),(e=>(To(),Ro(ft(Js),{item:e},null,8,["item"])))),256))])):Go("v-if",!0)}}),Zs=yn({props:{open:{type:Boolean,required:!0}},setup:e=>(t,n)=>(To(),Ro("aside",{class:["sidebar",{open:e.open}]},[Wo(Rs,{class:"nav"}),Zo(t.$slots,"sidebar-top",{},void 0,!0),Wo(Xs),Zo(t.$slots,"sidebar-bottom",{},void 0,!0)],2))});Zs.__scopeId="data-v-74188dea";const el=/bitbucket.org/;function tl(){const{page:e,theme:t,frontmatter:n}=Gr();return{url:gr((()=>{const{repo:o,docsDir:r="",docsBranch:s="master",docsRepo:l=o,editLinks:i}=t.value,a=null!=n.value.editLink?n.value.editLink:i,{relativePath:c}=e.value;return a&&c&&o?function(e,t,n,o,r){return el.test(e)?function(e,t,n,o,r){return(cs(t)?t:e).replace(ls,"")+`/src/${o}/`+(n?n.replace(ls,"")+"/":"")+r+`?mode=edit&spa=0&at=${o}&fileviewer=file-view-default`}(e,t,n,o,r):function(e,t,n,o,r){return(cs(t)?t:`https://github.com/${t}`).replace(ls,"")+`/edit/${o}/`+(n?n.replace(ls,"")+"/":"")+r}(0,t,n,o,r)}(o,l,r,s,c):null})),text:gr((()=>t.value.editLinkText||"Edit this page"))}}Kt("data-v-93821cda");const nl={class:"edit-link"};Yt();var ol=yn({setup(e){const{url:t,text:n}=tl();return(e,o)=>(To(),Ro("div",nl,[ft(t)?(To(),Ro("a",{key:0,class:"link",href:ft(t),target:"_blank",rel:"noopener noreferrer"},[Ho(g(ft(n))+" ",1),Wo(xs,{class:"icon"})],8,["href"])):Go("v-if",!0)]))}});ol.__scopeId="data-v-93821cda",Kt("data-v-694e09d6");const rl={key:0,class:"last-updated"},sl={class:"prefix"},ll={class:"datetime"};Yt();var il=yn({setup(e){const{theme:t,page:n}=Gr(),o=gr((()=>{const e=t.value.lastUpdated;return void 0!==e&&!1!==e})),r=gr((()=>{const e=t.value.lastUpdated;return!0===e?"Last Updated":e})),s=dt("");return Ln((()=>{s.value=new Date(n.value.lastUpdated).toLocaleString("en-US")})),On((()=>{s.value=new Date(n.value.lastUpdated).toLocaleString("en-US")})),(e,t)=>ft(o)?(To(),Ro("p",rl,[Wo("span",sl,g(ft(r))+":",1),Wo("span",ll,g(s.value),1)])):Go("v-if",!0)}});il.__scopeId="data-v-694e09d6",Kt("data-v-3538c8db");const al={class:"page-footer"},cl={class:"edit"},ul={class:"updated"};Yt();var dl=yn({setup:e=>(e,t)=>(To(),Ro("footer",al,[Wo("div",cl,[Wo(ol)]),Wo("div",ul,[Wo(il)])]))});function pl(){const{page:e,theme:t}=Gr(),n=gr((()=>ps(ds(e.value.relativePath)))),o=gr((()=>{const e=fs(t.value.sidebar,n.value);return as(e)?hs(e):[]})),r=gr((()=>o.value.findIndex((e=>e.link===n.value)))),s=gr((()=>{if(!1!==t.value.nextLinks&&r.value>-1&&r.value{if(!1!==t.value.prevLinks&&r.value>0)return o.value[r.value-1]})),i=gr((()=>!!s.value||!!l.value));return{next:s,prev:l,hasLinks:i}}dl.__scopeId="data-v-3538c8db";const fl={},hl={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},ml=Wo("path",{d:"M19,11H7.4l5.3-5.3c0.4-0.4,0.4-1,0-1.4s-1-0.4-1.4,0l-7,7c-0.1,0.1-0.2,0.2-0.2,0.3c-0.1,0.2-0.1,0.5,0,0.8c0.1,0.1,0.1,0.2,0.2,0.3l7,7c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3c0.4-0.4,0.4-1,0-1.4L7.4,13H19c0.6,0,1-0.4,1-1S19.6,11,19,11z"},null,-1);fl.render=function(e,t){return To(),Ro("svg",hl,[ml])};const vl={},gl={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},bl=Wo("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1);vl.render=function(e,t){return To(),Ro("svg",gl,[bl])},Kt("data-v-5ae8aee1");const yl={key:0,class:"next-and-prev-link"},xl={class:"container"},kl={class:"prev"},_l={class:"text"},wl={class:"next"},Sl={class:"text"};Yt();var Cl=yn({setup(e){const{hasLinks:t,prev:n,next:o}=pl();return(e,r)=>ft(t)?(To(),Ro("div",yl,[Wo("div",xl,[Wo("div",kl,[ft(n)?(To(),Ro("a",{key:0,class:"link",href:ft(Jr)(ft(n).link)},[Wo(fl,{class:"icon icon-prev"}),Wo("span",_l,g(ft(n).text),1)],8,["href"])):Go("v-if",!0)]),Wo("div",wl,[ft(o)?(To(),Ro("a",{key:0,class:"link",href:ft(Jr)(ft(o).link)},[Wo("span",Sl,g(ft(o).text),1),Wo(vl,{class:"icon icon-next"})],8,["href"])):Go("v-if",!0)])])])):Go("v-if",!0)}});Cl.__scopeId="data-v-5ae8aee1",Kt("data-v-d004a6fc");const Nl={class:"page"},Bl={class:"container"};Yt();var Pl=yn({setup:e=>(e,t)=>{const n=Co("Content");return To(),Ro("main",Nl,[Wo("div",Bl,[Zo(e.$slots,"top",{},void 0,!0),Wo(n,{class:"content"}),Wo(dl),Wo(Cl),Zo(e.$slots,"bottom",{},void 0,!0)])])}});Pl.__scopeId="data-v-d004a6fc";const Al={key:0,id:"ads-container"};var El=yn({setup(e){const t=kn((()=>import("./Home.f03b71db.js"))),n=()=>null,o=n,r=n,s=n,l=Yr(),{site:i,page:a,theme:c,frontmatter:u}=Gr(),d=gr((()=>!!u.value.customLayout)),p=gr((()=>!!u.value.home)),f=gr((()=>Object.keys(c.value.locales||{}).length>0)),h=gr((()=>{const e=c.value;return!1!==u.value.navbar&&!1!==e.navbar&&(i.value.title||e.logo||e.repo||e.nav)})),m=dt(!1),v=gr((()=>{return!u.value.home&&!1!==u.value.sidebar&&!(as(e=fs(c.value.sidebar,l.data.relativePath))?0===e.length:!e);var e})),g=e=>{m.value="boolean"==typeof e?e:!m.value},b=g.bind(null,!1);ln(l,b);const y=gr((()=>[{"no-navbar":!h.value,"sidebar-open":m.value,"no-sidebar":!v.value}]));return(e,n)=>{const l=Co("Content"),u=Co("Debug");return To(),Ro(Po,null,[Wo("div",{class:["theme",ft(y)]},[ft(h)?(To(),Ro(Ws,{key:0,onToggle:g},{search:Xt((()=>[Zo(e.$slots,"navbar-search",{},(()=>[ft(c).algolia?(To(),Ro(ft(s),{options:ft(c).algolia,multilang:ft(f),key:ft(i).lang},null,8,["options","multilang"])):Go("v-if",!0)]))])),_:3})):Go("v-if",!0),Wo(Zs,{open:m.value},{"sidebar-top":Xt((()=>[Zo(e.$slots,"sidebar-top")])),"sidebar-bottom":Xt((()=>[Zo(e.$slots,"sidebar-bottom")])),_:3},8,["open"]),Go(" TODO: make this button accessible "),Wo("div",{class:"sidebar-mask",onClick:n[1]||(n[1]=e=>g(!1))}),ft(d)?(To(),Ro(l,{key:1})):ft(p)?(To(),Ro(ft(t),{key:2},{hero:Xt((()=>[Zo(e.$slots,"home-hero")])),features:Xt((()=>[Zo(e.$slots,"home-features")])),footer:Xt((()=>[Zo(e.$slots,"home-footer")])),_:3})):(To(),Ro(Pl,{key:3},{top:Xt((()=>[Zo(e.$slots,"page-top-ads",{},(()=>[ft(c).carbonAds&&ft(c).carbonAds.carbon?(To(),Ro("div",Al,[Wo(ft(o),{key:"carbon"+ft(a).relativePath,code:ft(c).carbonAds.carbon,placement:ft(c).carbonAds.placement},null,8,["code","placement"])])):Go("v-if",!0)])),Zo(e.$slots,"page-top")])),bottom:Xt((()=>[Zo(e.$slots,"page-bottom"),Zo(e.$slots,"page-bottom-ads",{},(()=>[ft(c).carbonAds&&ft(c).carbonAds.custom?(To(),Ro(ft(r),{key:"custom"+ft(a).relativePath,code:ft(c).carbonAds.custom,placement:ft(c).carbonAds.placement},null,8,["code","placement"])):Go("v-if",!0)]))])),_:3}))],2),Wo(u)],64)}}});const Ll={class:"theme"},$l=Wo("h1",null,"404",-1);const Ol={Layout:El,NotFound:yn({setup(e){const t=["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."];return(e,n)=>(To(),Ro("div",Ll,[$l,Wo("blockquote",null,g(t[Math.floor(Math.random()*t.length)]),1),Wo("a",{href:e.$site.base,"aria-label":"go to home"},"Take me home.",8,["href"])]))}})},Tl=new Set,jl=()=>document.createElement("link");let Ml;const Rl=Vr&&(Ml=jl())&&Ml.relList&&Ml.relList.supports&&Ml.relList.supports("prefetch")?e=>{const t=jl();t.rel="prefetch",t.href=e,document.head.appendChild(t)}:e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};const Fl=yn({setup(e,{slots:t}){const n=dt(!1);return Ln((()=>{n.value=!0})),()=>n.value&&t.default?t.default():null}}),Il=Ol.NotFound||(()=>"404 Not Found"),Ul={name:"VitePressApp",setup(){const{site:e}=Gr();return Ln((()=>{ln((()=>e.value.lang),(e=>{document.documentElement.lang=e}),{immediate:!0})})),function(){if(!Vr)return;if(!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const o=()=>{n&&n.disconnect(),n=new IntersectionObserver((e=>{e.forEach((e=>{if(e.isIntersecting){const t=e.target;n.unobserve(t);const{pathname:o}=t;if(!Tl.has(o)){Tl.add(o);const e=Qr(o);Rl(e)}}}))})),t((()=>{document.querySelectorAll("#app a").forEach((e=>{const{target:t,hostname:o,pathname:r}=e,s=r.match(/\.\w+$/);s&&".html"!==s[0]||"_blank"!==t&&o===location.hostname&&(r!==location.pathname?n.observe(e):Tl.add(r))}))}))};Ln(o);const r=Yr();ln((()=>r.path),o),jn((()=>{n&&n.disconnect()}))}(),()=>br(Ol.Layout)}};function Vl(){const e=function(){let e,t=Vr;return function(e,t){const n=tt({path:"/",component:null,data:null});function o(e=(Vr?location.href:"/")){const t=new URL(e,"http://a.com");return t.pathname.endsWith("/")||t.pathname.endsWith(".html")||(t.pathname+=".html",e=t.pathname+t.search+t.hash),Vr&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",e)),s(e)}let r=null;async function s(o,s=0){const l=new URL(o,"http://a.com"),i=r=l.pathname;try{let t=e(i);if("then"in t&&"function"==typeof t.then&&(t=await t),r===i){r=null;const{default:e,__pageData:o}=t;if(!e)throw new Error(`Invalid route component: ${e}`);n.path=i,n.component=at(e),n.data=nt(JSON.parse(o)),Vr&&Mt((()=>{if(l.hash&&!s){const e=document.querySelector(decodeURIComponent(l.hash));if(e)return void Xr(e,l.hash)}window.scrollTo(0,s)}))}}catch(a){a.message.match(/fetch/)||console.error(a),r===i&&(r=null,n.path=i,n.component=t?at(t):null)}}return Vr&&(window.addEventListener("click",(e=>{const t=e.target.closest("a");if(t){const{href:n,protocol:r,hostname:s,pathname:l,hash:i,target:a}=t,c=window.location,u=l.match(/\.\w+$/);e.ctrlKey||e.shiftKey||e.altKey||e.metaKey||"_blank"===a||r!==c.protocol||s!==c.hostname||u&&".html"!==u[0]||(e.preventDefault(),l===c.pathname?i&&i!==c.hash&&(history.pushState(null,"",i),Xr(t,i,t.classList.contains("header-anchor"))):o(n))}}),{capture:!0}),window.addEventListener("popstate",(e=>{s(location.href,e.state&&e.state.scrollPosition||0)})),window.addEventListener("hashchange",(e=>{e.preventDefault()}))),{route:n,go:o}}((n=>{let o=Qr(n);return t&&(e=o),(t||e===o)&&(o=o.replace(/\.js$/,".lean.js")),Vr?(t=!1,import(o)):require(o)}),Il)}(),t=Ir(Ul);t.provide(Kr,e);const n=function(e){const t=gr((()=>Wr(Hr.value,e.path)));return{site:t,theme:gr((()=>t.value.themeConfig)),page:gr((()=>e.data)),frontmatter:gr((()=>e.data.frontmatter)),lang:gr((()=>t.value.lang)),localePath:gr((()=>{const{locales:e,lang:n}=t.value,o=Object.keys(e).find((t=>e[t].lang===n));return Jr(e&&o||"/")})),title:gr((()=>e.data.title?e.data.title+" | "+t.value.title:t.value.title)),description:gr((()=>e.data.description||t.value.description))}}(e.route);return t.provide(zr,n),Vr&&Zr(e.route,n.site),t.component("Content",ts),t.component("ClientOnly",Fl),t.component("Debug",(()=>null)),Object.defineProperty(t.config.globalProperties,"$frontmatter",{get:()=>n.frontmatter.value}),{app:t,router:e}}if(Vr){const{app:e,router:t}=Vl();t.go().then((()=>{e.mount("#app")}))}export{Po as F,Cs as _,qo as a,Wo as b,Ro as c,Vl as createApp,Ho as d,Go as e,yn as f,gr as g,ft as h,Yt as i,Co as j,Zo as k,To as o,Kt as p,Xo as r,g as t,Gr as u,Jr as w}; diff --git a/assets/computerScience_algorithms_algorithmsBasicNotes.md.36b13240.js b/assets/computerScience_algorithms_algorithmsBasicNotes.md.36b13240.js new file mode 100644 index 00000000000..213793ab71e --- /dev/null +++ b/assets/computerScience_algorithms_algorithmsBasicNotes.md.36b13240.js @@ -0,0 +1 @@ +import{o as n,c as s,b as a,d as t}from"./app.6dd2a1b7.js";const e='{"title":"Algorithm Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Sorting Algorithm","slug":"sorting-algorithm"},{"level":3,"title":"Summary","slug":"summary"},{"level":3,"title":"Selection Sort","slug":"selection-sort"},{"level":3,"title":"Insertion Sort","slug":"insertion-sort"},{"level":3,"title":"Shell Sort","slug":"shell-sort"},{"level":3,"title":"Merge Sort","slug":"merge-sort"},{"level":3,"title":"Quick Sort","slug":"quick-sort"},{"level":3,"title":"Heap Sort","slug":"heap-sort"},{"level":3,"title":"Radix Sort","slug":"radix-sort"},{"level":2,"title":"Tree Algorithm","slug":"tree-algorithm"},{"level":3,"title":"Binary Search Tree","slug":"binary-search-tree"},{"level":3,"title":"2-3 Tree","slug":"_2-3-tree"},{"level":3,"title":"Red-Black BST","slug":"red-black-bst"},{"level":3,"title":"B Tree","slug":"b-tree"},{"level":3,"title":"Fibonacci Heap","slug":"fibonacci-heap"},{"level":3,"title":"K-Dimensional Tree","slug":"k-dimensional-tree"},{"level":2,"title":"Search Algorithm","slug":"search-algorithm"},{"level":3,"title":"First Search","slug":"first-search"},{"level":3,"title":"cycle detection","slug":"cycle-detection"},{"level":2,"title":"Dynamic Programming","slug":"dynamic-programming"},{"level":3,"title":"子问题","slug":"子问题"},{"level":3,"title":"范例","slug":"范例"},{"level":2,"title":"Greedy Algorithm","slug":"greedy-algorithm"},{"level":2,"title":"Map Algorithm","slug":"map-algorithm"},{"level":3,"title":"图的表示","slug":"图的表示"},{"level":3,"title":"广度优先遍历","slug":"广度优先遍历"},{"level":3,"title":"深度优先遍历","slug":"深度优先遍历"},{"level":3,"title":"拓扑排序","slug":"拓扑排序"},{"level":3,"title":"单源最短路径","slug":"单源最短路径"},{"level":3,"title":"结点对最短路径","slug":"结点对最短路径"},{"level":3,"title":"最大流问题","slug":"最大流问题"},{"level":2,"title":"Tree Edit Distance","slug":"tree-edit-distance"},{"level":3,"title":"Definition","slug":"definition"}],"relativePath":"computerScience/algorithms/algorithmsBasicNotes.md","lastUpdated":1627194884000}',o={},l=a("h1",{id:"algorithm-basic-notes"},[a("a",{class:"header-anchor",href:"#algorithm-basic-notes","aria-hidden":"true"},"#"),t(" Algorithm Basic Notes")],-1),c=a("p",null,[a("div",{class:"table-of-contents"},[a("ul",null,[a("li",null,[a("a",{href:"#algorithm-basic-notes"},"Algorithm Basic Notes"),a("ul",null,[a("li",null,[a("a",{href:"#sorting-algorithm"},"Sorting Algorithm")]),a("li",null,[a("a",{href:"#tree-algorithm"},"Tree Algorithm")]),a("li",null,[a("a",{href:"#search-algorithm"},"Search Algorithm")]),a("li",null,[a("a",{href:"#dynamic-programming"},"Dynamic Programming")]),a("li",null,[a("a",{href:"#greedy-algorithm"},"Greedy Algorithm")]),a("li",null,[a("a",{href:"#map-algorithm"},"Map Algorithm")]),a("li",null,[a("a",{href:"#tree-edit-distance"},"Tree Edit Distance")])])])])])],-1),p=a("h2",{id:"sorting-algorithm"},[a("a",{class:"header-anchor",href:"#sorting-algorithm","aria-hidden":"true"},"#"),t(" Sorting Algorithm")],-1),u=a("h3",{id:"summary"},[a("a",{class:"header-anchor",href:"#summary","aria-hidden":"true"},"#"),t(" Summary")],-1),i=a("ul",null,[a("li",null,"强制稳定: 增加(唯一)时间戳, 修改 CompareTo 接口定义 => 当主元素相同时, 时间戳小的元素更小")],-1),r=a("h3",{id:"selection-sort"},[a("a",{class:"header-anchor",href:"#selection-sort","aria-hidden":"true"},"#"),t(" Selection Sort")],-1),k=a("ul",null,[a("li",null,"swap: O(n)"),a("li",null,"compare: O(n^2)")],-1),b=a("h3",{id:"insertion-sort"},[a("a",{class:"header-anchor",href:"#insertion-sort","aria-hidden":"true"},"#"),t(" Insertion Sort")],-1),m=a("ul",null,[a("li",null,"swap: O(n^2/4)"),a("li",null,"compare: O(n^2/4)")],-1),d=a("h3",{id:"shell-sort"},[a("a",{class:"header-anchor",href:"#shell-sort","aria-hidden":"true"},"#"),t(" Shell Sort")],-1),h=a("ul",null,[a("li",null,"swap: O(n^2/4)"),a("li",null,"compare: O(n^2/4)")],-1),f=a("h3",{id:"merge-sort"},[a("a",{class:"header-anchor",href:"#merge-sort","aria-hidden":"true"},"#"),t(" Merge Sort")],-1),y=a("ul",null,[a("li",null,"利用 Merge Sort 计算逆序对个数: left[i] > right[j] => inversions += (mid - i + 1), 即所有 i~mid 元素都与 j 元素为逆序对")],-1),g=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[t(" "),a("span",{class:"token comment"},"// merge and count"),t("\n "),a("span",{class:"token keyword"},"private"),t(),a("span",{class:"token keyword"},"static"),t(),a("span",{class:"token keyword"},"long"),t(),a("span",{class:"token function"},"merge"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),t(" a"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),t(" aux"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),t(" lo"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),t(" mid"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),t(" hi"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"long"),t(" inversions "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// copy to aux[]"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" k "),a("span",{class:"token operator"},"="),t(" lo"),a("span",{class:"token punctuation"},";"),t(" k "),a("span",{class:"token operator"},"<="),t(" hi"),a("span",{class:"token punctuation"},";"),t(" k"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n aux"),a("span",{class:"token punctuation"},"["),t("k"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" a"),a("span",{class:"token punctuation"},"["),t("k"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// merge back to a[]"),t("\n "),a("span",{class:"token keyword"},"int"),t(" i "),a("span",{class:"token operator"},"="),t(" lo"),a("span",{class:"token punctuation"},","),t(" j "),a("span",{class:"token operator"},"="),t(" mid"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" k "),a("span",{class:"token operator"},"="),t(" lo"),a("span",{class:"token punctuation"},";"),t(" k "),a("span",{class:"token operator"},"<="),t(" hi"),a("span",{class:"token punctuation"},";"),t(" k"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(" "),a("span",{class:"token punctuation"},"("),t("i "),a("span",{class:"token operator"},">"),t(" mid"),a("span",{class:"token punctuation"},")"),t(" a"),a("span",{class:"token punctuation"},"["),t("k"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" aux"),a("span",{class:"token punctuation"},"["),t("j"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("j "),a("span",{class:"token operator"},">"),t(" hi"),a("span",{class:"token punctuation"},")"),t(" a"),a("span",{class:"token punctuation"},"["),t("k"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" aux"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("aux"),a("span",{class:"token punctuation"},"["),t("j"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"<"),t(" aux"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t(" a"),a("span",{class:"token punctuation"},"["),t("k"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" aux"),a("span",{class:"token punctuation"},"["),t("j"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t(" inversions "),a("span",{class:"token operator"},"+="),t(),a("span",{class:"token punctuation"},"("),t("mid "),a("span",{class:"token operator"},"-"),t("\n i "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t(),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"else"),t(" a"),a("span",{class:"token punctuation"},"["),t("k"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" aux"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"return"),t(" inversions"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// return the number of inversions in the subArray b[lo..hi]"),t("\n "),a("span",{class:"token comment"},"// side effect b[lo..hi] is rearranged in ascending order"),t("\n "),a("span",{class:"token keyword"},"private"),t(),a("span",{class:"token keyword"},"static"),t(),a("span",{class:"token keyword"},"long"),t(),a("span",{class:"token function"},"count"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),t(" a"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),t(" b"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),t(" aux"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),t(" lo"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),t(" hi"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"long"),t(" inversions "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("hi "),a("span",{class:"token operator"},"<="),t(" lo"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"int"),t(" mid "),a("span",{class:"token operator"},"="),t(" lo "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token punctuation"},"("),t("hi "),a("span",{class:"token operator"},"-"),t(" lo"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"/"),t(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},";"),t("\n inversions "),a("span",{class:"token operator"},"+="),t(),a("span",{class:"token function"},"count"),a("span",{class:"token punctuation"},"("),t("a"),a("span",{class:"token punctuation"},","),t(" b"),a("span",{class:"token punctuation"},","),t(" aux"),a("span",{class:"token punctuation"},","),t(" lo"),a("span",{class:"token punctuation"},","),t(" mid"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n inversions "),a("span",{class:"token operator"},"+="),t(),a("span",{class:"token function"},"count"),a("span",{class:"token punctuation"},"("),t("a"),a("span",{class:"token punctuation"},","),t(" b"),a("span",{class:"token punctuation"},","),t(" aux"),a("span",{class:"token punctuation"},","),t(" mid"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),t(" hi"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n inversions "),a("span",{class:"token operator"},"+="),t(),a("span",{class:"token function"},"merge"),a("span",{class:"token punctuation"},"("),t("b"),a("span",{class:"token punctuation"},","),t(" aux"),a("span",{class:"token punctuation"},","),t(" lo"),a("span",{class:"token punctuation"},","),t(" mid"),a("span",{class:"token punctuation"},","),t(" hi"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"assert"),t(" inversions "),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token function"},"brute"),a("span",{class:"token punctuation"},"("),t("a"),a("span",{class:"token punctuation"},","),t(" lo"),a("span",{class:"token punctuation"},","),t(" hi"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(" inversions"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n\n "),a("span",{class:"token comment"},"/**\n * Returns the number of inversions in the integer array.\n * The argument array is not modified.\n * @param a the array\n * @return the number of inversions in the array. An inversion is a pair of\n * indices {@code i} and {@code j} such that {@code i < j}\n * and {@code a[i]} > {@code a[j]}.\n */"),t("\n "),a("span",{class:"token keyword"},"public"),t(),a("span",{class:"token keyword"},"static"),t(),a("span",{class:"token keyword"},"long"),t(),a("span",{class:"token function"},"count"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),t(" a"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),t(" b "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),t("a"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),t(" aux "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),t("a"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(" a"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},";"),t(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t("\n b"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" a"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"long"),t(" inversions "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"count"),a("span",{class:"token punctuation"},"("),t("a"),a("span",{class:"token punctuation"},","),t(" b"),a("span",{class:"token punctuation"},","),t(" aux"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),t(" a"),a("span",{class:"token punctuation"},"."),t("length "),a("span",{class:"token operator"},"-"),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(" inversions"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br")])],-1),w=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[t(" "),a("span",{class:"token comment"},"// return Kendall tau distance between two permutations"),t("\n "),a("span",{class:"token keyword"},"public"),t(),a("span",{class:"token keyword"},"static"),t(),a("span",{class:"token keyword"},"long"),t(),a("span",{class:"token function"},"distance"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),t(" a"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),t(" b"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("a"),a("span",{class:"token punctuation"},"."),t("length "),a("span",{class:"token operator"},"!="),t(" b"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"throw"),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"IllegalArgumentException"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"Array dimensions disagree"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"int"),t(" n "),a("span",{class:"token operator"},"="),t(" a"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),t(" ainV "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),t("n"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(" n"),a("span",{class:"token punctuation"},";"),t(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t("\n ainV"),a("span",{class:"token punctuation"},"["),t("a"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" i"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token class-name"},"Integer"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),t(" bNew "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Integer"),a("span",{class:"token punctuation"},"["),t("n"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(" n"),a("span",{class:"token punctuation"},";"),t(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t("\n bNew"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" ainV"),a("span",{class:"token punctuation"},"["),t("b"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token class-name"},"Inversions"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"count"),a("span",{class:"token punctuation"},"("),t("bNew"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br")])],-1),v=a("h3",{id:"quick-sort"},[a("a",{class:"header-anchor",href:"#quick-sort","aria-hidden":"true"},"#"),t(" Quick Sort")],-1),x=a("ul",null,[a("li",null,"partition: 哨兵(最后再将其归位) + 大循环 + 2 小循环, 交换元素法"),a("li",null,"partition: 辅助数组 brr, 3 循环(3 次扫描 arr) 分别将小/等/大于 guard 的数加入 brr"),a("li",null,"partition: 哨兵(最后再将其归位) + lo + hi, 外加 2 个动指针 leftLimit 与 rightLimit, 表示小于区的上界和大于区的上界")],-1),R=a("div",{class:"language-cpp line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// lt eq gt three parts"),t("\n"),a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"quick3waySort"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(),a("span",{class:"token operator"},"*"),t("a"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),t(" lo"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),t(" hi"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("hi "),a("span",{class:"token operator"},"<="),t(" lo"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token keyword"},"return"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"int"),t(" lt "),a("span",{class:"token operator"},"="),t(" lo"),a("span",{class:"token punctuation"},","),t(" i "),a("span",{class:"token operator"},"="),t(" lo"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),t(" gt "),a("span",{class:"token operator"},"="),t(" hi"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"int"),t(" v "),a("span",{class:"token operator"},"="),t(" a"),a("span",{class:"token punctuation"},"["),t("lo"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"while"),t(),a("span",{class:"token punctuation"},"("),t("i "),a("span",{class:"token operator"},"<="),t(" gt"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"int"),t(" cmp "),a("span",{class:"token operator"},"="),t(" a"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"compareTo"),a("span",{class:"token punctuation"},"("),t("v"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(" "),a("span",{class:"token punctuation"},"("),t("cmp "),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token function"},"exch"),a("span",{class:"token punctuation"},"("),t("a"),a("span",{class:"token punctuation"},","),t(" lt"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},","),t(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("cmp "),a("span",{class:"token operator"},">"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token function"},"exch"),a("span",{class:"token punctuation"},"("),t("a"),a("span",{class:"token punctuation"},","),t(" i"),a("span",{class:"token punctuation"},","),t(" gt"),a("span",{class:"token operator"},"--"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"else"),t(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token function"},"sort"),a("span",{class:"token punctuation"},"("),t("a"),a("span",{class:"token punctuation"},","),t(" lo"),a("span",{class:"token punctuation"},","),t(" lt "),a("span",{class:"token operator"},"-"),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"sort"),a("span",{class:"token punctuation"},"("),t("a"),a("span",{class:"token punctuation"},","),t(" gt "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),t(" hi"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br")])],-1),S=a("h3",{id:"heap-sort"},[a("a",{class:"header-anchor",href:"#heap-sort","aria-hidden":"true"},"#"),t(" Heap Sort")],-1),N=a("ul",null,[a("li",null,"Built on Priority Queue"),a("li",null,"swap: 2NlgN + 2N (2NlgN for sink N times, 2N for construct MaxHeap)"),a("li",null,"compare: NlgN + N (NlgN for sink N times, N for construct MaxHeap)")],-1),j=a("div",{class:"language-cpp line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// MaxPQ"),t("\n"),a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"swim"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" k"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"while"),t(),a("span",{class:"token punctuation"},"("),t("k "),a("span",{class:"token operator"},">"),t(),a("span",{class:"token number"},"1"),t(),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token function"},"less"),a("span",{class:"token punctuation"},"("),t("k"),a("span",{class:"token operator"},"/"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),t(" k"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"exch"),a("span",{class:"token punctuation"},"("),t("k"),a("span",{class:"token operator"},"/"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),t(" k"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n k "),a("span",{class:"token operator"},"="),t(" k"),a("span",{class:"token operator"},"/"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"sink"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" k"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"while"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token operator"},"*"),t("k "),a("span",{class:"token operator"},"<="),t(" N"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"int"),t(" j "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"2"),a("span",{class:"token operator"},"*"),t("k"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("j "),a("span",{class:"token operator"},"<"),t(" N "),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token function"},"less"),a("span",{class:"token punctuation"},"("),t("j"),a("span",{class:"token punctuation"},","),t(" j"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(" j"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"less"),a("span",{class:"token punctuation"},"("),t("k"),a("span",{class:"token punctuation"},","),t(" j"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token keyword"},"break"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"exch"),a("span",{class:"token punctuation"},"("),t("k"),a("span",{class:"token punctuation"},","),t(" j"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n k "),a("span",{class:"token operator"},"="),t(" j"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br")])],-1),A=a("h3",{id:"radix-sort"},[a("a",{class:"header-anchor",href:"#radix-sort","aria-hidden":"true"},"#"),t(" Radix Sort")],-1),T=a("p",null,"基数排序 (可用于混乱 shuffle 数组):",-1),D=a("ul",null,[a("li",null,"从个位到高位放入桶"),a("li",null,"从高位到个位放入桶")],-1),E=a("blockquote",null,[a("p",null,"Sorting Algorithms Performance")],-1),B=a("p",null,[a("img",{src:"/awesome-notes/assets/SortingPerformance.caae88a8.png",alt:"Performance"})],-1),M=a("h2",{id:"tree-algorithm"},[a("a",{class:"header-anchor",href:"#tree-algorithm","aria-hidden":"true"},"#"),t(" Tree Algorithm")],-1),F=a("h3",{id:"binary-search-tree"},[a("a",{class:"header-anchor",href:"#binary-search-tree","aria-hidden":"true"},"#"),t(" Binary Search Tree")],-1),z=a("p",null,"Hibbard Deletion",-1),C=a("h3",{id:"_2-3-tree"},[a("a",{class:"header-anchor",href:"#_2-3-tree","aria-hidden":"true"},"#"),t(" 2-3 Tree")],-1),P=a("p",null,"2-3 Tree is Balance Tree:",-1),L=a("p",null,"插入:",-1),K=a("ul",null,[a("li",null,"1+1=2node -> 3node"),a("li",null,[a("strong",null,"1+2=3node -> 4node"),t(" -> 2node")]),a("li",null,"将 4node 结点中间元素移至父结点, 其余 2 元素分离为子 2node 节点")],-1),q=a("h3",{id:"red-black-bst"},[a("a",{class:"header-anchor",href:"#red-black-bst","aria-hidden":"true"},"#"),t(" Red-Black BST")],-1),I=a("ul",null,[a("li",null,"基于 2-3Tree, 将 3node 用红色标记"),a("li",null,"关键: 将红色标记向上传递至根部")],-1),O=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[t(" "),a("span",{class:"token comment"},"// is node x red; false if x is null ?"),t("\n "),a("span",{class:"token keyword"},"private"),t(),a("span",{class:"token keyword"},"boolean"),t(),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Node"),t(" x"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("x "),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token keyword"},"null"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token boolean"},"false"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(" x"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"=="),t(" RED"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),H=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[t(" "),a("span",{class:"token comment"},"// make a right-leaning link lean to the left"),t("\n "),a("span",{class:"token keyword"},"private"),t(),a("span",{class:"token class-name"},"Node"),t(),a("span",{class:"token function"},"rotateLeft"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Node"),t(" h"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// assert (h != null) && isRed(h.right);"),t("\n "),a("span",{class:"token class-name"},"Node"),t(" x "),a("span",{class:"token operator"},"="),t(" h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},";"),t("\n\n h"),a("span",{class:"token punctuation"},"."),t("right "),a("span",{class:"token operator"},"="),t(" x"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},";"),t("\n x"),a("span",{class:"token punctuation"},"."),t("left "),a("span",{class:"token operator"},"="),t(" h"),a("span",{class:"token punctuation"},";"),t("\n\n x"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" x"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},"."),t("color"),a("span",{class:"token punctuation"},";"),t("\n x"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" RED"),a("span",{class:"token punctuation"},";"),t("\n\n x"),a("span",{class:"token punctuation"},"."),t("size "),a("span",{class:"token operator"},"="),t(" h"),a("span",{class:"token punctuation"},"."),t("size"),a("span",{class:"token punctuation"},";"),t("\n h"),a("span",{class:"token punctuation"},"."),t("size "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"size"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token function"},"size"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" x"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// make a left-leaning link lean to the right"),t("\n "),a("span",{class:"token keyword"},"private"),t(),a("span",{class:"token class-name"},"Node"),t(),a("span",{class:"token function"},"rotateRight"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Node"),t(" h"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// assert (h != null) && isRed(h.left);"),t("\n "),a("span",{class:"token class-name"},"Node"),t(" x "),a("span",{class:"token operator"},"="),t(" h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},";"),t("\n\n h"),a("span",{class:"token punctuation"},"."),t("left "),a("span",{class:"token operator"},"="),t(" x"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},";"),t("\n x"),a("span",{class:"token punctuation"},"."),t("right "),a("span",{class:"token operator"},"="),t(" h"),a("span",{class:"token punctuation"},";"),t("\n\n x"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" x"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},"."),t("color"),a("span",{class:"token punctuation"},";"),t("\n x"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" RED"),a("span",{class:"token punctuation"},";"),t("\n\n x"),a("span",{class:"token punctuation"},"."),t("size "),a("span",{class:"token operator"},"="),t(" h"),a("span",{class:"token punctuation"},"."),t("size"),a("span",{class:"token punctuation"},";"),t("\n h"),a("span",{class:"token punctuation"},"."),t("size "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"size"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token function"},"size"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" x"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// flip the colors of a node and its two children"),t("\n "),a("span",{class:"token keyword"},"private"),t(),a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"flipColors"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Node"),t(" h"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// h must have opposite color of its two children"),t("\n "),a("span",{class:"token comment"},"// assert (h != null) && (h.left != null) && (h.right != null);"),t("\n "),a("span",{class:"token comment"},"// assert (!isRed(h) && isRed(h.left) && isRed(h.right))"),t("\n "),a("span",{class:"token comment"},"// || (isRed(h) && !isRed(h.left) && !isRed(h.right));"),t("\n h"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token operator"},"!"),t("h"),a("span",{class:"token punctuation"},"."),t("color"),a("span",{class:"token punctuation"},";"),t("\n h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token operator"},"!"),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},"."),t("color"),a("span",{class:"token punctuation"},";"),t("\n h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token operator"},"!"),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},"."),t("color"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br")])],-1),G=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[t(" "),a("span",{class:"token comment"},"// insert the key-value pair in the subtree rooted at h"),t("\n "),a("span",{class:"token keyword"},"private"),t(),a("span",{class:"token class-name"},"Node"),t(),a("span",{class:"token function"},"put"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Node"),t(" h"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token class-name"},"Key"),t(" key"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token class-name"},"Value"),t(" val"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// insert/put new node as left/right child of leaf node"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("h "),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token keyword"},"null"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Node"),a("span",{class:"token punctuation"},"("),t("key"),a("span",{class:"token punctuation"},","),t(" val"),a("span",{class:"token punctuation"},","),t(" RED"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"int"),t(" cmp "),a("span",{class:"token operator"},"="),t(" key"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"compareTo"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("key"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(" "),a("span",{class:"token punctuation"},"("),t("cmp "),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(" h"),a("span",{class:"token punctuation"},"."),t("left "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"put"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},","),t(" key"),a("span",{class:"token punctuation"},","),t(" val"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("cmp "),a("span",{class:"token operator"},">"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(" h"),a("span",{class:"token punctuation"},"."),t("right "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"put"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},","),t(" key"),a("span",{class:"token punctuation"},","),t(" val"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"else"),t(" h"),a("span",{class:"token punctuation"},"."),t("val "),a("span",{class:"token operator"},"="),t(" val"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// fix-up any right-leaning links"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(" h "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"rotateLeft"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),t(" "),a("span",{class:"token operator"},"&&"),t(" "),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(" h "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"rotateRight"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),t(" "),a("span",{class:"token operator"},"&&"),t(" "),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(" "),a("span",{class:"token function"},"flipColors"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n h"),a("span",{class:"token punctuation"},"."),t("size "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"size"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token function"},"size"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" h"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"public"),t(),a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"put"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Key"),t(" key"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token class-name"},"Value"),t(" val"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("key "),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token keyword"},"null"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"throw"),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"IllegalArgumentException"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"first argument to put() is null"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("val "),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token keyword"},"null"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"delete"),a("span",{class:"token punctuation"},"("),t("key"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n root "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"put"),a("span",{class:"token punctuation"},"("),t("root"),a("span",{class:"token punctuation"},","),t(" key"),a("span",{class:"token punctuation"},","),t(" val"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n root"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" BLACK"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token comment"},"// assert check();"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br")])],-1),_=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[t(" "),a("span",{class:"token comment"},"// Assuming that h is red and both h.left and h.left.left"),t("\n "),a("span",{class:"token comment"},"// are black, make h.left or one of its children red."),t("\n "),a("span",{class:"token keyword"},"private"),t(),a("span",{class:"token class-name"},"Node"),t(),a("span",{class:"token function"},"moveRedLeft"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Node"),t(" h"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// assert (h != null);"),t("\n "),a("span",{class:"token comment"},"// assert isRed(h) && !isRed(h.left) && !isRed(h.left.left);"),t("\n\n "),a("span",{class:"token function"},"flipColors"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n h"),a("span",{class:"token punctuation"},"."),t("right "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"rotateRight"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n h "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"rotateLeft"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"flipColors"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"return"),t(" h"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// Assuming that h is red and both h.right and h.right.left"),t("\n "),a("span",{class:"token comment"},"// are black, make h.right or one of its children red."),t("\n "),a("span",{class:"token keyword"},"private"),t(),a("span",{class:"token class-name"},"Node"),t(),a("span",{class:"token function"},"moveRedRight"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Node"),t(" h"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// assert (h != null);"),t("\n "),a("span",{class:"token comment"},"// assert isRed(h) && !isRed(h.right) && !isRed(h.right.left);"),t("\n "),a("span",{class:"token function"},"flipColors"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n h "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"rotateRight"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"flipColors"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"return"),t(" h"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// restore red-black tree invariant"),t("\n "),a("span",{class:"token keyword"},"private"),t(),a("span",{class:"token class-name"},"Node"),t(),a("span",{class:"token function"},"balance"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Node"),t(" h"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// assert (h != null);"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(" h "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"rotateLeft"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(" h "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"rotateRight"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(" "),a("span",{class:"token function"},"flipColors"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n h"),a("span",{class:"token punctuation"},"."),t("size "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"size"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token function"},"size"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(" h"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br")])],-1),V=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[t(" "),a("span",{class:"token comment"},"// delete the key-value pair with the minimum key rooted at h"),t("\n "),a("span",{class:"token keyword"},"private"),t(),a("span",{class:"token class-name"},"Node"),t(),a("span",{class:"token function"},"deleteMin"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Node"),t(" h"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left "),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token keyword"},"null"),a("span",{class:"token punctuation"},")"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"null"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t("\n h "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"moveRedLeft"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n h"),a("span",{class:"token punctuation"},"."),t("left "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"deleteMin"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token function"},"balance"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"/**\n * Removes the smallest key and associated value from the symbol table.\n * @throws NoSuchElementException if the symbol table is empty\n */"),t("\n "),a("span",{class:"token keyword"},"public"),t(),a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"deleteMin"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"isEmpty"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token keyword"},"throw"),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"NoSuchElementException"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"BST underflow"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// if both children of root are black, set root to red"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("root"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("root"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t("\n root"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" RED"),a("span",{class:"token punctuation"},";"),t("\n\n root "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"deleteMin"),a("span",{class:"token punctuation"},"("),t("root"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isEmpty"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(" root"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" BLACK"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token comment"},"// assert check();"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// delete the key-value pair with the maximum key rooted at h"),t("\n "),a("span",{class:"token keyword"},"private"),t(),a("span",{class:"token class-name"},"Node"),t(),a("span",{class:"token function"},"deleteMax"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Node"),t(" h"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t("\n h "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"rotateRight"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right "),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token keyword"},"null"),a("span",{class:"token punctuation"},")"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"null"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t("\n h "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"moveRedRight"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n h"),a("span",{class:"token punctuation"},"."),t("right "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"deleteMax"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token function"},"balance"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"/**\n * Removes the largest key and associated value from the symbol table.\n * @throws NoSuchElementException if the symbol table is empty\n */"),t("\n "),a("span",{class:"token keyword"},"public"),t(),a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"deleteMax"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"isEmpty"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token keyword"},"throw"),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"NoSuchElementException"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"BST underflow"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// if both children of root are black, set root to red"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("root"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("root"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t("\n root"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" RED"),a("span",{class:"token punctuation"},";"),t("\n\n root "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"deleteMax"),a("span",{class:"token punctuation"},"("),t("root"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isEmpty"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(" root"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" BLACK"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token comment"},"// assert check();"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// delete the key-value pair with the given key rooted at h"),t("\n "),a("span",{class:"token keyword"},"private"),t(),a("span",{class:"token class-name"},"Node"),t(),a("span",{class:"token function"},"delete"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Node"),t(" h"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token class-name"},"Key"),t(" key"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// assert get(h, key) != null;"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("key"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"compareTo"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("key"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(" "),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t("\n h "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"moveRedLeft"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n h"),a("span",{class:"token punctuation"},"."),t("left "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"delete"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},","),t(" key"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t("\n h "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"rotateRight"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("key"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"compareTo"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("key"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token number"},"0"),t(),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right "),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token keyword"},"null"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"null"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t("\n h "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"moveRedRight"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("key"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"compareTo"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("key"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token class-name"},"Node"),t(" x "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"min"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n h"),a("span",{class:"token punctuation"},"."),t("key "),a("span",{class:"token operator"},"="),t(" x"),a("span",{class:"token punctuation"},"."),t("key"),a("span",{class:"token punctuation"},";"),t("\n h"),a("span",{class:"token punctuation"},"."),t("val "),a("span",{class:"token operator"},"="),t(" x"),a("span",{class:"token punctuation"},"."),t("val"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token comment"},"// h.val = get(h.right, min(h.right).key);"),t("\n "),a("span",{class:"token comment"},"// h.key = min(h.right).key;"),t("\n h"),a("span",{class:"token punctuation"},"."),t("right "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"deleteMin"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"else"),t(" h"),a("span",{class:"token punctuation"},"."),t("right "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"delete"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},","),t(" key"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token function"},"balance"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"/**\n * Removes the specified key and its associated value from this symbol table\n * (if the key is in this symbol table).\n *\n * @param key the key\n * @throws IllegalArgumentException if {@code key} is {@code null}\n */"),t("\n "),a("span",{class:"token keyword"},"public"),t(),a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"delete"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Key"),t(" key"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("key "),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token keyword"},"null"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token keyword"},"throw"),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"IllegalArgumentException"),a("span",{class:"token punctuation"},"("),t('"argument '),a("span",{class:"token keyword"},"to"),t("\n "),a("span",{class:"token namespace"},"delete"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(" is "),a("span",{class:"token keyword"},"null"),t('"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"contains"),a("span",{class:"token punctuation"},"("),t("key"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token keyword"},"return"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// if both children of root are black, set root to red"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("root"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("root"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t("\n root"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" RED"),a("span",{class:"token punctuation"},";"),t("\n\n root "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"delete"),a("span",{class:"token punctuation"},"("),t("root"),a("span",{class:"token punctuation"},","),t(" key"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isEmpty"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(" root"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" BLACK"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token comment"},"// assert check();"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br"),a("span",{class:"line-number"},"58"),a("br"),a("span",{class:"line-number"},"59"),a("br"),a("span",{class:"line-number"},"60"),a("br"),a("span",{class:"line-number"},"61"),a("br"),a("span",{class:"line-number"},"62"),a("br"),a("span",{class:"line-number"},"63"),a("br"),a("span",{class:"line-number"},"64"),a("br"),a("span",{class:"line-number"},"65"),a("br"),a("span",{class:"line-number"},"66"),a("br"),a("span",{class:"line-number"},"67"),a("br"),a("span",{class:"line-number"},"68"),a("br"),a("span",{class:"line-number"},"69"),a("br"),a("span",{class:"line-number"},"70"),a("br"),a("span",{class:"line-number"},"71"),a("br"),a("span",{class:"line-number"},"72"),a("br"),a("span",{class:"line-number"},"73"),a("br"),a("span",{class:"line-number"},"74"),a("br"),a("span",{class:"line-number"},"75"),a("br"),a("span",{class:"line-number"},"76"),a("br"),a("span",{class:"line-number"},"77"),a("br"),a("span",{class:"line-number"},"78"),a("br"),a("span",{class:"line-number"},"79"),a("br"),a("span",{class:"line-number"},"80"),a("br"),a("span",{class:"line-number"},"81"),a("br"),a("span",{class:"line-number"},"82"),a("br"),a("span",{class:"line-number"},"83"),a("br"),a("span",{class:"line-number"},"84"),a("br"),a("span",{class:"line-number"},"85"),a("br"),a("span",{class:"line-number"},"86"),a("br"),a("span",{class:"line-number"},"87"),a("br"),a("span",{class:"line-number"},"88"),a("br"),a("span",{class:"line-number"},"89"),a("br"),a("span",{class:"line-number"},"90"),a("br"),a("span",{class:"line-number"},"91"),a("br"),a("span",{class:"line-number"},"92"),a("br"),a("span",{class:"line-number"},"93"),a("br"),a("span",{class:"line-number"},"94"),a("br"),a("span",{class:"line-number"},"95"),a("br"),a("span",{class:"line-number"},"96"),a("br"),a("span",{class:"line-number"},"97"),a("br"),a("span",{class:"line-number"},"98"),a("br"),a("span",{class:"line-number"},"99"),a("br"),a("span",{class:"line-number"},"100"),a("br"),a("span",{class:"line-number"},"101"),a("br"),a("span",{class:"line-number"},"102"),a("br"),a("span",{class:"line-number"},"103"),a("br"),a("span",{class:"line-number"},"104"),a("br"),a("span",{class:"line-number"},"105"),a("br"),a("span",{class:"line-number"},"106"),a("br"),a("span",{class:"line-number"},"107"),a("br"),a("span",{class:"line-number"},"108"),a("br"),a("span",{class:"line-number"},"109"),a("br")])],-1),Q=a("h4",{id:"基本性质"},[a("a",{class:"header-anchor",href:"#基本性质","aria-hidden":"true"},"#"),t(" 基本性质")],-1),W=a("ol",null,[a("li",null,"非红即黑"),a("li",null,"根黑"),a("li",null,"叶黑 e.g T.null 黑哨兵"),a("li",null,"红父孩子黑"),a("li",null,"简单路径同黑"),a("li",null,"右孩子不红 e.g 父黑两孩红 -> 父红两孩黑(flip); 父黑右红 -> 父左旋变红, 右孩子变黑(left-rotate)")],-1),J=a("h4",{id:"基本操作"},[a("a",{class:"header-anchor",href:"#基本操作","aria-hidden":"true"},"#"),t(" 基本操作")],-1),U=a("ol",null,[a("li",null,"插入(插入红点, 旋转+重新着色(反色)保持红黑性质)"),a("li",null,"删除(删除红点, 旋转+重新着色(反色)保持红黑性质)")],-1),X=a("h3",{id:"b-tree"},[a("a",{class:"header-anchor",href:"#b-tree","aria-hidden":"true"},"#"),t(" B Tree")],-1),Y=a("p",null,"t: 每个内部结点至少 t 个孩子(t-1 个 key), 至多 2t 个孩子(2t-1 个 key)",-1),Z=a("h4",{id:"插入-删除"},[a("a",{class:"header-anchor",href:"#插入-删除","aria-hidden":"true"},"#"),t(" 插入/删除")],-1),$=a("p",null,"下溯的同时,分裂满结点",-1),nn=a("h3",{id:"fibonacci-heap"},[a("a",{class:"header-anchor",href:"#fibonacci-heap","aria-hidden":"true"},"#"),t(" Fibonacci Heap")],-1),sn=a("p",null,"BST + 循环双向链表:",-1),an=a("ul",null,[a("li",null,"一个根树(根结点)循环双向链表"),a("li",null,"n 个孩子循环双向链表: 每个根树的每层结点形成一个循环双向链表")],-1),tn=a("h3",{id:"k-dimensional-tree"},[a("a",{class:"header-anchor",href:"#k-dimensional-tree","aria-hidden":"true"},"#"),t(" K-Dimensional Tree")],-1),en=a("ul",null,[a("li",null,"分隔空间数据")],-1),on=a("p",null,"e.g 左子树:左下方 右子树:右上方",-1),ln=a("h2",{id:"search-algorithm"},[a("a",{class:"header-anchor",href:"#search-algorithm","aria-hidden":"true"},"#"),t(" Search Algorithm")],-1),cn=a("h3",{id:"first-search"},[a("a",{class:"header-anchor",href:"#first-search","aria-hidden":"true"},"#"),t(" First Search")],-1),pn=a("ul",null,[a("li",null,"DFS(深度优先):栈实现"),a("li",null,"BFS(广度优先):队列实现")],-1),un=a("p",null,[a("img",{src:"/awesome-notes/assets/SearchPerformance.866c6c75.jpg",alt:"Search Algorithm Performance"})],-1),rn=a("h3",{id:"cycle-detection"},[a("a",{class:"header-anchor",href:"#cycle-detection","aria-hidden":"true"},"#"),t(" cycle detection")],-1),kn=a("ul",null,[a("li",null,"许多图论算法不适用于存在环路的复杂图,故使用循环检测剔除意外情况")],-1),bn=a("p",null,"处理方法:可将环路元素(如强联通分支)视作单一元素,忽视其内部结构",-1),mn=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[t("a "),a("span",{class:"token operator"},"="),t(" b"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("b "),a("span",{class:"token operator"},"="),t(" c"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("c "),a("span",{class:"token operator"},"="),t(" a"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token comment"},"//a extends b;b extends c;c extends a;"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),dn=a("h2",{id:"dynamic-programming"},[a("a",{class:"header-anchor",href:"#dynamic-programming","aria-hidden":"true"},"#"),t(" Dynamic Programming")],-1),hn=a("ul",null,[a("li",null,[t("最优解结构特征: 一个选择 + 子问题的最优解 - 所有(可"),a("strong",null,"重复求解"),t(")子问题的最优解可"),a("strong",null,"独立求解"),t("(不互相影响)")]),a("li",null,"递归定义最优解: 列出递归表达式"),a("li",null,"自底向上求解最优解"),a("li",null,"构造最优解(额外信息数组)")],-1),fn=a("h3",{id:"子问题"},[a("a",{class:"header-anchor",href:"#子问题","aria-hidden":"true"},"#"),t(" 子问题")],-1),yn=a("ul",null,[a("li",null,"子问题可映射为有向图, 并对其进行拓扑排序: 共有 O(n) 个子问题, 每个子问题最多 O(n) 种选择, 则算法时间复杂度为 O(n^2).其对应子问题图有 n 个顶点, 每个顶点最多有 n-1 条边."),a("li",null,"递归生成可以重复求解的子问题,而不是不断生成新的子问题")],-1),gn=a("h3",{id:"范例"},[a("a",{class:"header-anchor",href:"#范例","aria-hidden":"true"},"#"),t(" 范例")],-1),wn=a("ul",null,[a("li",null,"切割钢条问题: max{p[i], r[n-i]}"),a("li",null,"矩阵相乘链问题"),a("li",null,"最大公共子序列问题: r[i, j] = max{r[i, j-1], r[i-1, j]}"),a("li",null,"无权最短路径: path[i, j] = min{path[i, r], [r, j]}")],-1),vn=a("h2",{id:"greedy-algorithm"},[a("a",{class:"header-anchor",href:"#greedy-algorithm","aria-hidden":"true"},"#"),t(" Greedy Algorithm")],-1),xn=a("ul",null,[a("li",null,[t("最优解结构特征: 一个选择 + 子问题的最优解 - 所有(可"),a("strong",null,"重复求解"),t(")子问题的最优解可"),a("strong",null,"独立求解"),t("(不互相影响)")]),a("li",null,"递归定义最优解: 列出递归表达式"),a("li",null,[t("自底向上求解最优解: 每次不进行多次选择, 只进行一次 "),a("strong",null,"贪心选择")]),a("li",null,"构造最优解(额外信息数组)")],-1),Rn=a("h2",{id:"map-algorithm"},[a("a",{class:"header-anchor",href:"#map-algorithm","aria-hidden":"true"},"#"),t(" Map Algorithm")],-1),Sn=a("h3",{id:"图的表示"},[a("a",{class:"header-anchor",href:"#图的表示","aria-hidden":"true"},"#"),t(" 图的表示")],-1),Nn=a("ul",null,[a("li",null,"邻接链表法"),a("li",null,"邻接矩阵法")],-1),jn=a("h4",{id:"稀疏矩阵"},[a("a",{class:"header-anchor",href:"#稀疏矩阵","aria-hidden":"true"},"#"),t(" 稀疏矩阵")],-1),An=a("div",{class:"language-cpp line-numbers-mode"},[a("pre",null,[a("code",null,[t("unordered_map"),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},","),t(" unordered_map"),a("span",{class:"token operator"},"<"),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),a("span",{class:"token operator"},">"),t(),a("span",{class:"token operator"},">"),t(),a("span",{class:"token comment"},"// => (row, (col, val))"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),Tn=a("h3",{id:"广度优先遍历"},[a("a",{class:"header-anchor",href:"#广度优先遍历","aria-hidden":"true"},"#"),t(" 广度优先遍历")],-1),Dn=a("h4",{id:"bfs-node-color"},[a("a",{class:"header-anchor",href:"#bfs-node-color","aria-hidden":"true"},"#"),t(" BFS Node Color")],-1),En=a("ul",null,[a("li",null,"white: 未被发现/访问"),a("li",null,"gray: 已被发现(进入队列), 邻接结点未全部发现"),a("li",null,"black: 已被发现, 邻接结点全部发现")],-1),Bn=a("h4",{id:"bfs-node-parent"},[a("a",{class:"header-anchor",href:"#bfs-node-parent","aria-hidden":"true"},"#"),t(" BFS Node Parent")],-1),Mn=a("p",null,"广度优先树父结点",-1),Fn=a("h4",{id:"bfs-node-distance"},[a("a",{class:"header-anchor",href:"#bfs-node-distance","aria-hidden":"true"},"#"),t(" BFS Node Distance")],-1),zn=a("p",null,"距离 = v.pi.d + 1",-1),Cn=a("h4",{id:"利用队列实现广度优先遍历"},[a("a",{class:"header-anchor",href:"#利用队列实现广度优先遍历","aria-hidden":"true"},"#"),t(" 利用队列实现广度优先遍历")],-1),Pn=a("h3",{id:"深度优先遍历"},[a("a",{class:"header-anchor",href:"#深度优先遍历","aria-hidden":"true"},"#"),t(" 深度优先遍历")],-1),Ln=a("p",null,"利用 递归/栈 实现深度优先遍历",-1),Kn=a("h4",{id:"dfs-node-color"},[a("a",{class:"header-anchor",href:"#dfs-node-color","aria-hidden":"true"},"#"),t(" DFS Node Color")],-1),qn=a("ul",null,[a("li",null,"white: 未被发现/访问"),a("li",null,"gray: 已被发现, 未二次访问"),a("li",null,"black: 已被发现, 二次访问(比其深的所有结点皆被发现)")],-1),In=a("p",null,"当第一个访问 edge(u,v) 时:",-1),On=a("ul",null,[a("li",null,"v.color == white: 树边"),a("li",null,[t("v.color == gray : 后向边(v 为 深度优先*"),a("em",null,"森林"),t("- 的祖父结点)")]),a("li",null,"v.color == black: 前向边/横向边(v 为较深的结点/子结点)"),a("li",null,"无向图深度优先遍历不会出现 前向边/横向边")],-1),Hn=a("h4",{id:"dfs-node-parent"},[a("a",{class:"header-anchor",href:"#dfs-node-parent","aria-hidden":"true"},"#"),t(" DFS Node Parent")],-1),Gn=a("p",null,"比 v 浅的结点(比 v 更早被发现的结点)",-1),_n=a("h4",{id:"dfs-node-distance"},[a("a",{class:"header-anchor",href:"#dfs-node-distance","aria-hidden":"true"},"#"),t(" DFS Node Distance")],-1),Vn=a("ul",null,[a("li",null,"v.d = ++time: 被发现的时间戳(入栈)"),a("li",null,"v.f = ++time: 被二次访问的时间戳(出栈)"),a("li",null,[t("time"),a("code",null,"<"),t("v.d, white; v.d"),a("code",null,"<"),t("time"),a("code",null,"<"),t("v.f, gray: time"),a("code",null,">"),t("v.f, black")])],-1),Qn=a("h3",{id:"拓扑排序"},[a("a",{class:"header-anchor",href:"#拓扑排序","aria-hidden":"true"},"#"),t(" 拓扑排序")],-1),Wn=a("p",null,"目标集合: 拓扑排序后集合, 先入顶点高序, 后入顶点低序",-1),Jn=a("h4",{id:"kahn-算法"},[a("a",{class:"header-anchor",href:"#kahn-算法","aria-hidden":"true"},"#"),t(" Kahn 算法")],-1),Un=a("p",null,"不断将图中入度为 0 的点移入目标集合",-1),Xn=a("h4",{id:"dfs-深度优先"},[a("a",{class:"header-anchor",href:"#dfs-深度优先","aria-hidden":"true"},"#"),t(" DFS(深度优先)")],-1),Yn=a("p",null,"当深度遍历至较深处, 并开始回溯时, 将此时访问的顶点加入目标集合(v.f 降序)",-1),Zn=a("h3",{id:"单源最短路径"},[a("a",{class:"header-anchor",href:"#单源最短路径","aria-hidden":"true"},"#"),t(" 单源最短路径")],-1),$n=a("div",{class:"language-cpp line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"Relax"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" u"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),t(" v"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),t(" w"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(" v"),a("span",{class:"token punctuation"},"."),t("d "),a("span",{class:"token operator"},">"),t(" u"),a("span",{class:"token punctuation"},"."),t("d "),a("span",{class:"token operator"},"+"),t(" w"),a("span",{class:"token punctuation"},"["),t("u"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),t("v"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token punctuation"},"{"),t("\n v"),a("span",{class:"token punctuation"},"."),t("pi "),a("span",{class:"token operator"},"="),t(" u"),a("span",{class:"token punctuation"},";"),t("\n v"),a("span",{class:"token punctuation"},"."),t("d "),a("span",{class:"token operator"},"="),t(" v"),a("span",{class:"token punctuation"},"."),t("pi"),a("span",{class:"token punctuation"},"."),t("d "),a("span",{class:"token operator"},"+"),t(" w"),a("span",{class:"token punctuation"},"["),t("v"),a("span",{class:"token punctuation"},"."),t("pi"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),t("v"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),ns=a("h4",{id:"dag-shortest-paths"},[a("a",{class:"header-anchor",href:"#dag-shortest-paths","aria-hidden":"true"},"#"),t(" DAG Shortest Paths")],-1),ss=a("p",null,"先将图进行拓扑排序(深度优先遍历), 再按照拓扑排序顺序, 依次对每个结点(拓扑排序)的邻接边进行 relax",-1),as=a("blockquote",null,[a("p",null,"a -> b -> c --\x3e d, 且 a--b, a--c, b--d, c--d: relax(a, b), relax(a, c), relax(b, d), relax(c, d)")],-1),ts=a("h4",{id:"bellman-ford-algorithm"},[a("a",{class:"header-anchor",href:"#bellman-ford-algorithm","aria-hidden":"true"},"#"),t(" Bellman-Ford Algorithm")],-1),es=a("p",null,"对每条边进行 n 次(结点总数) relax",-1),os=a("h4",{id:"dijkstra-algorithm"},[a("a",{class:"header-anchor",href:"#dijkstra-algorithm","aria-hidden":"true"},"#"),t(" Dijkstra Algorithm")],-1),ls=a("p",null,"贪心算法: 每次选取不属于 S 集合(white) 且 v.d 最小(gray)的结点, 对其所有邻接边进行 relax, 并将其加入 S 集合(black)",-1),cs=a("ul",null,[a("li",null,"white: 不属于 S 集合"),a("li",null,"gray: 不属于 S 集合 且 v.d 最小"),a("li",null,"black: 属于 S 集合")],-1),ps=a("h3",{id:"结点对最短路径"},[a("a",{class:"header-anchor",href:"#结点对最短路径","aria-hidden":"true"},"#"),t(" 结点对最短路径")],-1),us=a("p",null,"动态规划:l^m(i, j) = min(l^m-1(i, j), min(1<=k<=n){l^m-1(i, k)+w(k, j)})",-1),is=a("blockquote",null,[a("p",null,"m: 中间结点个数")],-1),rs=a("h4",{id:"floyd-warshall-algorithm"},[a("a",{class:"header-anchor",href:"#floyd-warshall-algorithm","aria-hidden":"true"},"#"),t(" Floyd-Warshall Algorithm")],-1),ks=a("p",null,"d^k(i, j) = w(i, j), k = 0 | min(d^k-1(i, j), d^k-1(i, k) + d^k-1(k, j)), k >= 1",-1),bs=a("p",null,"pi^(i, j) = pi^k-1(i, j) or pi^k-1(k, j)",-1),ms=a("blockquote",null,[a("p",null,"k: 中间结点个数")],-1),ds=a("div",{class:"language-cpp line-numbers-mode"},[a("pre",null,[a("code",null,[t("Matrix "),a("span",{class:"token function"},"floyd_warshall"),a("span",{class:"token punctuation"},"("),t("Matrix W"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"int"),t(" n "),a("span",{class:"token operator"},"="),t(" W"),a("span",{class:"token punctuation"},"."),t("rows"),a("span",{class:"token punctuation"},";"),t("\n Matrix D"),a("span",{class:"token operator"},"^"),a("span",{class:"token number"},"0"),t(),a("span",{class:"token operator"},"="),t(" W"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" k "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("k "),a("span",{class:"token operator"},"<"),t(" n"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t(" k"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n D"),a("span",{class:"token operator"},"^"),t("k "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token function"},"Matrix"),a("span",{class:"token punctuation"},"("),t("n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(" n"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" j "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t(" j "),a("span",{class:"token operator"},"<"),t(" n"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t(" J"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n d"),a("span",{class:"token operator"},"^"),t("k"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),t("j"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"min"),a("span",{class:"token punctuation"},"("),t("d"),a("span",{class:"token operator"},"^"),t("k"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),t("j"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),t(" d"),a("span",{class:"token operator"},"^"),t("k"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),t("k"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token operator"},"+"),t("d"),a("span",{class:"token operator"},"^"),t("k"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"["),t("k"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),t("j"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" D"),a("span",{class:"token operator"},"^"),t("n"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br")])],-1),hs=a("h3",{id:"最大流问题"},[a("a",{class:"header-anchor",href:"#最大流问题","aria-hidden":"true"},"#"),t(" 最大流问题")],-1),fs=a("p",null,"MaxFlow Problem:",-1),ys=a("p",null,[a("img",{src:"/awesome-notes/assets/FordFulkersonAlgorithm.94aecb4b.png",alt:"Ford Fulkerson Algorithm"})],-1),gs=a("h4",{id:"最大流模型"},[a("a",{class:"header-anchor",href:"#最大流模型","aria-hidden":"true"},"#"),t(" 最大流模型")],-1),ws=a("p",null,"最大流模型必须满足以下条件:",-1),vs=a("ul",null,[a("li",null,"无双向边"),a("li",null,"唯一的源点 s 和 唯一的汇点 t")],-1),xs=a("p",null,"对于不符合该模型的问题可进行简单转化:",-1),Rs=a("ul",null,[a("li",null,"双向边: 添加额外结点, 切割双向边的其中一条, 使得双向边变成 3 条单向边")],-1),Ss=a("blockquote",null,[a("p",null,"a --\x3e b, b --\x3e a: a --\x3e c, c --\x3e b, b --\x3e a")],-1),Ns=a("ul",null,[a("li",null,"多源点/汇点: 添加一个总源点/汇点")],-1),js=a("h4",{id:"残存网络"},[a("a",{class:"header-anchor",href:"#残存网络","aria-hidden":"true"},"#"),t(" 残存网络")],-1),As=a("ul",null,[a("li",null,"若原图 u --\x3e v 总容量 > 0, 则残存网络中 边 u --\x3e v:剩余容量, 边 v --\x3e u: 已用容量"),a("li",null,"增广路径: 残存网络中一条可行通路")],-1),Ts=a("h4",{id:"最大流最小割定理"},[a("a",{class:"header-anchor",href:"#最大流最小割定理","aria-hidden":"true"},"#"),t(" 最大流最小割定理")],-1),Ds=a("p",null,"MaxFlow-MinCut Theorem:",-1),Es=a("ul",null,[a("li",null,"切割的净流量: 流出-流入"),a("li",null,"切割的容量: 流出总容量(无需减流入总容量)"),a("li",null,"最小切割: 容量最小的切割")],-1),Bs=a("p",null,"最大流最小割定理: 以下三个命题等价",-1),Ms=a("ul",null,[a("li",null,"f 是 G 的一个最大流"),a("li",null,"残存网络 Gf 不含增广路径"),a("li",null,"|f| = c(S, T)(切割的容量): |f| <= c(S, T)(流网络中任意流 f <= 任意切割容量 c(S, T))")],-1),Fs=a("h4",{id:"ford-fulkerson-algorithm"},[a("a",{class:"header-anchor",href:"#ford-fulkerson-algorithm","aria-hidden":"true"},"#"),t(" Ford-Fulkerson Algorithm")],-1),zs=a("p",null,"不断寻找增广路径",-1),Cs=a("h2",{id:"tree-edit-distance"},[a("a",{class:"header-anchor",href:"#tree-edit-distance","aria-hidden":"true"},"#"),t(" Tree Edit Distance")],-1),Ps=a("h3",{id:"definition"},[a("a",{class:"header-anchor",href:"#definition","aria-hidden":"true"},"#"),t(" Definition")],-1),Ls=a("p",null,"Tree Edit Distance: 给定 Cost(edit operation) 时的最小编辑费用",-1);o.render=function(a,t,e,o,Ks,qs){return n(),s("div",null,[l,c,p,u,i,r,k,b,m,d,h,f,y,g,w,v,x,R,S,N,j,A,T,D,E,B,M,F,z,C,P,L,K,q,I,O,H,G,_,V,Q,W,J,U,X,Y,Z,$,nn,sn,an,tn,en,on,ln,cn,pn,un,rn,kn,bn,mn,dn,hn,fn,yn,gn,wn,vn,xn,Rn,Sn,Nn,jn,An,Tn,Dn,En,Bn,Mn,Fn,zn,Cn,Pn,Ln,Kn,qn,In,On,Hn,Gn,_n,Vn,Qn,Wn,Jn,Un,Xn,Yn,Zn,$n,ns,ss,as,ts,es,os,ls,cs,ps,us,is,rs,ks,bs,ms,ds,hs,fs,ys,gs,ws,vs,xs,Rs,Ss,Ns,js,As,Ts,Ds,Es,Bs,Ms,Fs,zs,Cs,Ps,Ls])};export default o;export{e as __pageData}; diff --git a/assets/computerScience_algorithms_algorithmsBasicNotes.md.36b13240.lean.js b/assets/computerScience_algorithms_algorithmsBasicNotes.md.36b13240.lean.js new file mode 100644 index 00000000000..213793ab71e --- /dev/null +++ b/assets/computerScience_algorithms_algorithmsBasicNotes.md.36b13240.lean.js @@ -0,0 +1 @@ +import{o as n,c as s,b as a,d as t}from"./app.6dd2a1b7.js";const e='{"title":"Algorithm Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Sorting Algorithm","slug":"sorting-algorithm"},{"level":3,"title":"Summary","slug":"summary"},{"level":3,"title":"Selection Sort","slug":"selection-sort"},{"level":3,"title":"Insertion Sort","slug":"insertion-sort"},{"level":3,"title":"Shell Sort","slug":"shell-sort"},{"level":3,"title":"Merge Sort","slug":"merge-sort"},{"level":3,"title":"Quick Sort","slug":"quick-sort"},{"level":3,"title":"Heap Sort","slug":"heap-sort"},{"level":3,"title":"Radix Sort","slug":"radix-sort"},{"level":2,"title":"Tree Algorithm","slug":"tree-algorithm"},{"level":3,"title":"Binary Search Tree","slug":"binary-search-tree"},{"level":3,"title":"2-3 Tree","slug":"_2-3-tree"},{"level":3,"title":"Red-Black BST","slug":"red-black-bst"},{"level":3,"title":"B Tree","slug":"b-tree"},{"level":3,"title":"Fibonacci Heap","slug":"fibonacci-heap"},{"level":3,"title":"K-Dimensional Tree","slug":"k-dimensional-tree"},{"level":2,"title":"Search Algorithm","slug":"search-algorithm"},{"level":3,"title":"First Search","slug":"first-search"},{"level":3,"title":"cycle detection","slug":"cycle-detection"},{"level":2,"title":"Dynamic Programming","slug":"dynamic-programming"},{"level":3,"title":"子问题","slug":"子问题"},{"level":3,"title":"范例","slug":"范例"},{"level":2,"title":"Greedy Algorithm","slug":"greedy-algorithm"},{"level":2,"title":"Map Algorithm","slug":"map-algorithm"},{"level":3,"title":"图的表示","slug":"图的表示"},{"level":3,"title":"广度优先遍历","slug":"广度优先遍历"},{"level":3,"title":"深度优先遍历","slug":"深度优先遍历"},{"level":3,"title":"拓扑排序","slug":"拓扑排序"},{"level":3,"title":"单源最短路径","slug":"单源最短路径"},{"level":3,"title":"结点对最短路径","slug":"结点对最短路径"},{"level":3,"title":"最大流问题","slug":"最大流问题"},{"level":2,"title":"Tree Edit Distance","slug":"tree-edit-distance"},{"level":3,"title":"Definition","slug":"definition"}],"relativePath":"computerScience/algorithms/algorithmsBasicNotes.md","lastUpdated":1627194884000}',o={},l=a("h1",{id:"algorithm-basic-notes"},[a("a",{class:"header-anchor",href:"#algorithm-basic-notes","aria-hidden":"true"},"#"),t(" Algorithm Basic Notes")],-1),c=a("p",null,[a("div",{class:"table-of-contents"},[a("ul",null,[a("li",null,[a("a",{href:"#algorithm-basic-notes"},"Algorithm Basic Notes"),a("ul",null,[a("li",null,[a("a",{href:"#sorting-algorithm"},"Sorting Algorithm")]),a("li",null,[a("a",{href:"#tree-algorithm"},"Tree Algorithm")]),a("li",null,[a("a",{href:"#search-algorithm"},"Search Algorithm")]),a("li",null,[a("a",{href:"#dynamic-programming"},"Dynamic Programming")]),a("li",null,[a("a",{href:"#greedy-algorithm"},"Greedy Algorithm")]),a("li",null,[a("a",{href:"#map-algorithm"},"Map Algorithm")]),a("li",null,[a("a",{href:"#tree-edit-distance"},"Tree Edit Distance")])])])])])],-1),p=a("h2",{id:"sorting-algorithm"},[a("a",{class:"header-anchor",href:"#sorting-algorithm","aria-hidden":"true"},"#"),t(" Sorting Algorithm")],-1),u=a("h3",{id:"summary"},[a("a",{class:"header-anchor",href:"#summary","aria-hidden":"true"},"#"),t(" Summary")],-1),i=a("ul",null,[a("li",null,"强制稳定: 增加(唯一)时间戳, 修改 CompareTo 接口定义 => 当主元素相同时, 时间戳小的元素更小")],-1),r=a("h3",{id:"selection-sort"},[a("a",{class:"header-anchor",href:"#selection-sort","aria-hidden":"true"},"#"),t(" Selection Sort")],-1),k=a("ul",null,[a("li",null,"swap: O(n)"),a("li",null,"compare: O(n^2)")],-1),b=a("h3",{id:"insertion-sort"},[a("a",{class:"header-anchor",href:"#insertion-sort","aria-hidden":"true"},"#"),t(" Insertion Sort")],-1),m=a("ul",null,[a("li",null,"swap: O(n^2/4)"),a("li",null,"compare: O(n^2/4)")],-1),d=a("h3",{id:"shell-sort"},[a("a",{class:"header-anchor",href:"#shell-sort","aria-hidden":"true"},"#"),t(" Shell Sort")],-1),h=a("ul",null,[a("li",null,"swap: O(n^2/4)"),a("li",null,"compare: O(n^2/4)")],-1),f=a("h3",{id:"merge-sort"},[a("a",{class:"header-anchor",href:"#merge-sort","aria-hidden":"true"},"#"),t(" Merge Sort")],-1),y=a("ul",null,[a("li",null,"利用 Merge Sort 计算逆序对个数: left[i] > right[j] => inversions += (mid - i + 1), 即所有 i~mid 元素都与 j 元素为逆序对")],-1),g=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[t(" "),a("span",{class:"token comment"},"// merge and count"),t("\n "),a("span",{class:"token keyword"},"private"),t(),a("span",{class:"token keyword"},"static"),t(),a("span",{class:"token keyword"},"long"),t(),a("span",{class:"token function"},"merge"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),t(" a"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),t(" aux"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),t(" lo"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),t(" mid"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),t(" hi"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"long"),t(" inversions "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// copy to aux[]"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" k "),a("span",{class:"token operator"},"="),t(" lo"),a("span",{class:"token punctuation"},";"),t(" k "),a("span",{class:"token operator"},"<="),t(" hi"),a("span",{class:"token punctuation"},";"),t(" k"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n aux"),a("span",{class:"token punctuation"},"["),t("k"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" a"),a("span",{class:"token punctuation"},"["),t("k"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// merge back to a[]"),t("\n "),a("span",{class:"token keyword"},"int"),t(" i "),a("span",{class:"token operator"},"="),t(" lo"),a("span",{class:"token punctuation"},","),t(" j "),a("span",{class:"token operator"},"="),t(" mid"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" k "),a("span",{class:"token operator"},"="),t(" lo"),a("span",{class:"token punctuation"},";"),t(" k "),a("span",{class:"token operator"},"<="),t(" hi"),a("span",{class:"token punctuation"},";"),t(" k"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(" "),a("span",{class:"token punctuation"},"("),t("i "),a("span",{class:"token operator"},">"),t(" mid"),a("span",{class:"token punctuation"},")"),t(" a"),a("span",{class:"token punctuation"},"["),t("k"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" aux"),a("span",{class:"token punctuation"},"["),t("j"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("j "),a("span",{class:"token operator"},">"),t(" hi"),a("span",{class:"token punctuation"},")"),t(" a"),a("span",{class:"token punctuation"},"["),t("k"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" aux"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("aux"),a("span",{class:"token punctuation"},"["),t("j"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"<"),t(" aux"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t(" a"),a("span",{class:"token punctuation"},"["),t("k"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" aux"),a("span",{class:"token punctuation"},"["),t("j"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t(" inversions "),a("span",{class:"token operator"},"+="),t(),a("span",{class:"token punctuation"},"("),t("mid "),a("span",{class:"token operator"},"-"),t("\n i "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t(),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"else"),t(" a"),a("span",{class:"token punctuation"},"["),t("k"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" aux"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"return"),t(" inversions"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// return the number of inversions in the subArray b[lo..hi]"),t("\n "),a("span",{class:"token comment"},"// side effect b[lo..hi] is rearranged in ascending order"),t("\n "),a("span",{class:"token keyword"},"private"),t(),a("span",{class:"token keyword"},"static"),t(),a("span",{class:"token keyword"},"long"),t(),a("span",{class:"token function"},"count"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),t(" a"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),t(" b"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),t(" aux"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),t(" lo"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),t(" hi"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"long"),t(" inversions "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("hi "),a("span",{class:"token operator"},"<="),t(" lo"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"int"),t(" mid "),a("span",{class:"token operator"},"="),t(" lo "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token punctuation"},"("),t("hi "),a("span",{class:"token operator"},"-"),t(" lo"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"/"),t(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},";"),t("\n inversions "),a("span",{class:"token operator"},"+="),t(),a("span",{class:"token function"},"count"),a("span",{class:"token punctuation"},"("),t("a"),a("span",{class:"token punctuation"},","),t(" b"),a("span",{class:"token punctuation"},","),t(" aux"),a("span",{class:"token punctuation"},","),t(" lo"),a("span",{class:"token punctuation"},","),t(" mid"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n inversions "),a("span",{class:"token operator"},"+="),t(),a("span",{class:"token function"},"count"),a("span",{class:"token punctuation"},"("),t("a"),a("span",{class:"token punctuation"},","),t(" b"),a("span",{class:"token punctuation"},","),t(" aux"),a("span",{class:"token punctuation"},","),t(" mid"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),t(" hi"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n inversions "),a("span",{class:"token operator"},"+="),t(),a("span",{class:"token function"},"merge"),a("span",{class:"token punctuation"},"("),t("b"),a("span",{class:"token punctuation"},","),t(" aux"),a("span",{class:"token punctuation"},","),t(" lo"),a("span",{class:"token punctuation"},","),t(" mid"),a("span",{class:"token punctuation"},","),t(" hi"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"assert"),t(" inversions "),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token function"},"brute"),a("span",{class:"token punctuation"},"("),t("a"),a("span",{class:"token punctuation"},","),t(" lo"),a("span",{class:"token punctuation"},","),t(" hi"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(" inversions"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n\n "),a("span",{class:"token comment"},"/**\n * Returns the number of inversions in the integer array.\n * The argument array is not modified.\n * @param a the array\n * @return the number of inversions in the array. An inversion is a pair of\n * indices {@code i} and {@code j} such that {@code i < j}\n * and {@code a[i]} > {@code a[j]}.\n */"),t("\n "),a("span",{class:"token keyword"},"public"),t(),a("span",{class:"token keyword"},"static"),t(),a("span",{class:"token keyword"},"long"),t(),a("span",{class:"token function"},"count"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),t(" a"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),t(" b "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),t("a"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),t(" aux "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),t("a"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(" a"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},";"),t(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t("\n b"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" a"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"long"),t(" inversions "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"count"),a("span",{class:"token punctuation"},"("),t("a"),a("span",{class:"token punctuation"},","),t(" b"),a("span",{class:"token punctuation"},","),t(" aux"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),t(" a"),a("span",{class:"token punctuation"},"."),t("length "),a("span",{class:"token operator"},"-"),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(" inversions"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br")])],-1),w=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[t(" "),a("span",{class:"token comment"},"// return Kendall tau distance between two permutations"),t("\n "),a("span",{class:"token keyword"},"public"),t(),a("span",{class:"token keyword"},"static"),t(),a("span",{class:"token keyword"},"long"),t(),a("span",{class:"token function"},"distance"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),t(" a"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),t(" b"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("a"),a("span",{class:"token punctuation"},"."),t("length "),a("span",{class:"token operator"},"!="),t(" b"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"throw"),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"IllegalArgumentException"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"Array dimensions disagree"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"int"),t(" n "),a("span",{class:"token operator"},"="),t(" a"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),t(" ainV "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},"["),t("n"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(" n"),a("span",{class:"token punctuation"},";"),t(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t("\n ainV"),a("span",{class:"token punctuation"},"["),t("a"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" i"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token class-name"},"Integer"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),t(" bNew "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Integer"),a("span",{class:"token punctuation"},"["),t("n"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(" n"),a("span",{class:"token punctuation"},";"),t(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t("\n bNew"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" ainV"),a("span",{class:"token punctuation"},"["),t("b"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token class-name"},"Inversions"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"count"),a("span",{class:"token punctuation"},"("),t("bNew"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br")])],-1),v=a("h3",{id:"quick-sort"},[a("a",{class:"header-anchor",href:"#quick-sort","aria-hidden":"true"},"#"),t(" Quick Sort")],-1),x=a("ul",null,[a("li",null,"partition: 哨兵(最后再将其归位) + 大循环 + 2 小循环, 交换元素法"),a("li",null,"partition: 辅助数组 brr, 3 循环(3 次扫描 arr) 分别将小/等/大于 guard 的数加入 brr"),a("li",null,"partition: 哨兵(最后再将其归位) + lo + hi, 外加 2 个动指针 leftLimit 与 rightLimit, 表示小于区的上界和大于区的上界")],-1),R=a("div",{class:"language-cpp line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// lt eq gt three parts"),t("\n"),a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"quick3waySort"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(),a("span",{class:"token operator"},"*"),t("a"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),t(" lo"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),t(" hi"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("hi "),a("span",{class:"token operator"},"<="),t(" lo"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token keyword"},"return"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"int"),t(" lt "),a("span",{class:"token operator"},"="),t(" lo"),a("span",{class:"token punctuation"},","),t(" i "),a("span",{class:"token operator"},"="),t(" lo"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),t(" gt "),a("span",{class:"token operator"},"="),t(" hi"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"int"),t(" v "),a("span",{class:"token operator"},"="),t(" a"),a("span",{class:"token punctuation"},"["),t("lo"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"while"),t(),a("span",{class:"token punctuation"},"("),t("i "),a("span",{class:"token operator"},"<="),t(" gt"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"int"),t(" cmp "),a("span",{class:"token operator"},"="),t(" a"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"compareTo"),a("span",{class:"token punctuation"},"("),t("v"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(" "),a("span",{class:"token punctuation"},"("),t("cmp "),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token function"},"exch"),a("span",{class:"token punctuation"},"("),t("a"),a("span",{class:"token punctuation"},","),t(" lt"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},","),t(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("cmp "),a("span",{class:"token operator"},">"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token function"},"exch"),a("span",{class:"token punctuation"},"("),t("a"),a("span",{class:"token punctuation"},","),t(" i"),a("span",{class:"token punctuation"},","),t(" gt"),a("span",{class:"token operator"},"--"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"else"),t(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token function"},"sort"),a("span",{class:"token punctuation"},"("),t("a"),a("span",{class:"token punctuation"},","),t(" lo"),a("span",{class:"token punctuation"},","),t(" lt "),a("span",{class:"token operator"},"-"),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"sort"),a("span",{class:"token punctuation"},"("),t("a"),a("span",{class:"token punctuation"},","),t(" gt "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),t(" hi"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br")])],-1),S=a("h3",{id:"heap-sort"},[a("a",{class:"header-anchor",href:"#heap-sort","aria-hidden":"true"},"#"),t(" Heap Sort")],-1),N=a("ul",null,[a("li",null,"Built on Priority Queue"),a("li",null,"swap: 2NlgN + 2N (2NlgN for sink N times, 2N for construct MaxHeap)"),a("li",null,"compare: NlgN + N (NlgN for sink N times, N for construct MaxHeap)")],-1),j=a("div",{class:"language-cpp line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// MaxPQ"),t("\n"),a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"swim"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" k"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"while"),t(),a("span",{class:"token punctuation"},"("),t("k "),a("span",{class:"token operator"},">"),t(),a("span",{class:"token number"},"1"),t(),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token function"},"less"),a("span",{class:"token punctuation"},"("),t("k"),a("span",{class:"token operator"},"/"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),t(" k"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"exch"),a("span",{class:"token punctuation"},"("),t("k"),a("span",{class:"token operator"},"/"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),t(" k"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n k "),a("span",{class:"token operator"},"="),t(" k"),a("span",{class:"token operator"},"/"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"sink"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" k"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"while"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token operator"},"*"),t("k "),a("span",{class:"token operator"},"<="),t(" N"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"int"),t(" j "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"2"),a("span",{class:"token operator"},"*"),t("k"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("j "),a("span",{class:"token operator"},"<"),t(" N "),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token function"},"less"),a("span",{class:"token punctuation"},"("),t("j"),a("span",{class:"token punctuation"},","),t(" j"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(" j"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"less"),a("span",{class:"token punctuation"},"("),t("k"),a("span",{class:"token punctuation"},","),t(" j"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token keyword"},"break"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"exch"),a("span",{class:"token punctuation"},"("),t("k"),a("span",{class:"token punctuation"},","),t(" j"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n k "),a("span",{class:"token operator"},"="),t(" j"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br")])],-1),A=a("h3",{id:"radix-sort"},[a("a",{class:"header-anchor",href:"#radix-sort","aria-hidden":"true"},"#"),t(" Radix Sort")],-1),T=a("p",null,"基数排序 (可用于混乱 shuffle 数组):",-1),D=a("ul",null,[a("li",null,"从个位到高位放入桶"),a("li",null,"从高位到个位放入桶")],-1),E=a("blockquote",null,[a("p",null,"Sorting Algorithms Performance")],-1),B=a("p",null,[a("img",{src:"/awesome-notes/assets/SortingPerformance.caae88a8.png",alt:"Performance"})],-1),M=a("h2",{id:"tree-algorithm"},[a("a",{class:"header-anchor",href:"#tree-algorithm","aria-hidden":"true"},"#"),t(" Tree Algorithm")],-1),F=a("h3",{id:"binary-search-tree"},[a("a",{class:"header-anchor",href:"#binary-search-tree","aria-hidden":"true"},"#"),t(" Binary Search Tree")],-1),z=a("p",null,"Hibbard Deletion",-1),C=a("h3",{id:"_2-3-tree"},[a("a",{class:"header-anchor",href:"#_2-3-tree","aria-hidden":"true"},"#"),t(" 2-3 Tree")],-1),P=a("p",null,"2-3 Tree is Balance Tree:",-1),L=a("p",null,"插入:",-1),K=a("ul",null,[a("li",null,"1+1=2node -> 3node"),a("li",null,[a("strong",null,"1+2=3node -> 4node"),t(" -> 2node")]),a("li",null,"将 4node 结点中间元素移至父结点, 其余 2 元素分离为子 2node 节点")],-1),q=a("h3",{id:"red-black-bst"},[a("a",{class:"header-anchor",href:"#red-black-bst","aria-hidden":"true"},"#"),t(" Red-Black BST")],-1),I=a("ul",null,[a("li",null,"基于 2-3Tree, 将 3node 用红色标记"),a("li",null,"关键: 将红色标记向上传递至根部")],-1),O=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[t(" "),a("span",{class:"token comment"},"// is node x red; false if x is null ?"),t("\n "),a("span",{class:"token keyword"},"private"),t(),a("span",{class:"token keyword"},"boolean"),t(),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Node"),t(" x"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("x "),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token keyword"},"null"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token boolean"},"false"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(" x"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"=="),t(" RED"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),H=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[t(" "),a("span",{class:"token comment"},"// make a right-leaning link lean to the left"),t("\n "),a("span",{class:"token keyword"},"private"),t(),a("span",{class:"token class-name"},"Node"),t(),a("span",{class:"token function"},"rotateLeft"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Node"),t(" h"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// assert (h != null) && isRed(h.right);"),t("\n "),a("span",{class:"token class-name"},"Node"),t(" x "),a("span",{class:"token operator"},"="),t(" h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},";"),t("\n\n h"),a("span",{class:"token punctuation"},"."),t("right "),a("span",{class:"token operator"},"="),t(" x"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},";"),t("\n x"),a("span",{class:"token punctuation"},"."),t("left "),a("span",{class:"token operator"},"="),t(" h"),a("span",{class:"token punctuation"},";"),t("\n\n x"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" x"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},"."),t("color"),a("span",{class:"token punctuation"},";"),t("\n x"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" RED"),a("span",{class:"token punctuation"},";"),t("\n\n x"),a("span",{class:"token punctuation"},"."),t("size "),a("span",{class:"token operator"},"="),t(" h"),a("span",{class:"token punctuation"},"."),t("size"),a("span",{class:"token punctuation"},";"),t("\n h"),a("span",{class:"token punctuation"},"."),t("size "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"size"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token function"},"size"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" x"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// make a left-leaning link lean to the right"),t("\n "),a("span",{class:"token keyword"},"private"),t(),a("span",{class:"token class-name"},"Node"),t(),a("span",{class:"token function"},"rotateRight"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Node"),t(" h"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// assert (h != null) && isRed(h.left);"),t("\n "),a("span",{class:"token class-name"},"Node"),t(" x "),a("span",{class:"token operator"},"="),t(" h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},";"),t("\n\n h"),a("span",{class:"token punctuation"},"."),t("left "),a("span",{class:"token operator"},"="),t(" x"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},";"),t("\n x"),a("span",{class:"token punctuation"},"."),t("right "),a("span",{class:"token operator"},"="),t(" h"),a("span",{class:"token punctuation"},";"),t("\n\n x"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" x"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},"."),t("color"),a("span",{class:"token punctuation"},";"),t("\n x"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" RED"),a("span",{class:"token punctuation"},";"),t("\n\n x"),a("span",{class:"token punctuation"},"."),t("size "),a("span",{class:"token operator"},"="),t(" h"),a("span",{class:"token punctuation"},"."),t("size"),a("span",{class:"token punctuation"},";"),t("\n h"),a("span",{class:"token punctuation"},"."),t("size "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"size"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token function"},"size"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" x"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// flip the colors of a node and its two children"),t("\n "),a("span",{class:"token keyword"},"private"),t(),a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"flipColors"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Node"),t(" h"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// h must have opposite color of its two children"),t("\n "),a("span",{class:"token comment"},"// assert (h != null) && (h.left != null) && (h.right != null);"),t("\n "),a("span",{class:"token comment"},"// assert (!isRed(h) && isRed(h.left) && isRed(h.right))"),t("\n "),a("span",{class:"token comment"},"// || (isRed(h) && !isRed(h.left) && !isRed(h.right));"),t("\n h"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token operator"},"!"),t("h"),a("span",{class:"token punctuation"},"."),t("color"),a("span",{class:"token punctuation"},";"),t("\n h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token operator"},"!"),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},"."),t("color"),a("span",{class:"token punctuation"},";"),t("\n h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token operator"},"!"),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},"."),t("color"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br")])],-1),G=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[t(" "),a("span",{class:"token comment"},"// insert the key-value pair in the subtree rooted at h"),t("\n "),a("span",{class:"token keyword"},"private"),t(),a("span",{class:"token class-name"},"Node"),t(),a("span",{class:"token function"},"put"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Node"),t(" h"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token class-name"},"Key"),t(" key"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token class-name"},"Value"),t(" val"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// insert/put new node as left/right child of leaf node"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("h "),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token keyword"},"null"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Node"),a("span",{class:"token punctuation"},"("),t("key"),a("span",{class:"token punctuation"},","),t(" val"),a("span",{class:"token punctuation"},","),t(" RED"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"int"),t(" cmp "),a("span",{class:"token operator"},"="),t(" key"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"compareTo"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("key"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(" "),a("span",{class:"token punctuation"},"("),t("cmp "),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(" h"),a("span",{class:"token punctuation"},"."),t("left "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"put"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},","),t(" key"),a("span",{class:"token punctuation"},","),t(" val"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("cmp "),a("span",{class:"token operator"},">"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(" h"),a("span",{class:"token punctuation"},"."),t("right "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"put"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},","),t(" key"),a("span",{class:"token punctuation"},","),t(" val"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"else"),t(" h"),a("span",{class:"token punctuation"},"."),t("val "),a("span",{class:"token operator"},"="),t(" val"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// fix-up any right-leaning links"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(" h "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"rotateLeft"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),t(" "),a("span",{class:"token operator"},"&&"),t(" "),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(" h "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"rotateRight"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),t(" "),a("span",{class:"token operator"},"&&"),t(" "),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(" "),a("span",{class:"token function"},"flipColors"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n h"),a("span",{class:"token punctuation"},"."),t("size "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"size"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token function"},"size"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" h"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"public"),t(),a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"put"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Key"),t(" key"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token class-name"},"Value"),t(" val"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("key "),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token keyword"},"null"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"throw"),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"IllegalArgumentException"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"first argument to put() is null"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("val "),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token keyword"},"null"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"delete"),a("span",{class:"token punctuation"},"("),t("key"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n root "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"put"),a("span",{class:"token punctuation"},"("),t("root"),a("span",{class:"token punctuation"},","),t(" key"),a("span",{class:"token punctuation"},","),t(" val"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n root"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" BLACK"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token comment"},"// assert check();"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br")])],-1),_=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[t(" "),a("span",{class:"token comment"},"// Assuming that h is red and both h.left and h.left.left"),t("\n "),a("span",{class:"token comment"},"// are black, make h.left or one of its children red."),t("\n "),a("span",{class:"token keyword"},"private"),t(),a("span",{class:"token class-name"},"Node"),t(),a("span",{class:"token function"},"moveRedLeft"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Node"),t(" h"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// assert (h != null);"),t("\n "),a("span",{class:"token comment"},"// assert isRed(h) && !isRed(h.left) && !isRed(h.left.left);"),t("\n\n "),a("span",{class:"token function"},"flipColors"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n h"),a("span",{class:"token punctuation"},"."),t("right "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"rotateRight"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n h "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"rotateLeft"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"flipColors"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"return"),t(" h"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// Assuming that h is red and both h.right and h.right.left"),t("\n "),a("span",{class:"token comment"},"// are black, make h.right or one of its children red."),t("\n "),a("span",{class:"token keyword"},"private"),t(),a("span",{class:"token class-name"},"Node"),t(),a("span",{class:"token function"},"moveRedRight"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Node"),t(" h"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// assert (h != null);"),t("\n "),a("span",{class:"token comment"},"// assert isRed(h) && !isRed(h.right) && !isRed(h.right.left);"),t("\n "),a("span",{class:"token function"},"flipColors"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n h "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"rotateRight"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"flipColors"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"return"),t(" h"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// restore red-black tree invariant"),t("\n "),a("span",{class:"token keyword"},"private"),t(),a("span",{class:"token class-name"},"Node"),t(),a("span",{class:"token function"},"balance"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Node"),t(" h"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// assert (h != null);"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(" h "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"rotateLeft"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(" h "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"rotateRight"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(" "),a("span",{class:"token function"},"flipColors"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n h"),a("span",{class:"token punctuation"},"."),t("size "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"size"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token function"},"size"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(" h"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br")])],-1),V=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[t(" "),a("span",{class:"token comment"},"// delete the key-value pair with the minimum key rooted at h"),t("\n "),a("span",{class:"token keyword"},"private"),t(),a("span",{class:"token class-name"},"Node"),t(),a("span",{class:"token function"},"deleteMin"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Node"),t(" h"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left "),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token keyword"},"null"),a("span",{class:"token punctuation"},")"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"null"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t("\n h "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"moveRedLeft"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n h"),a("span",{class:"token punctuation"},"."),t("left "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"deleteMin"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token function"},"balance"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"/**\n * Removes the smallest key and associated value from the symbol table.\n * @throws NoSuchElementException if the symbol table is empty\n */"),t("\n "),a("span",{class:"token keyword"},"public"),t(),a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"deleteMin"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"isEmpty"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token keyword"},"throw"),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"NoSuchElementException"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"BST underflow"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// if both children of root are black, set root to red"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("root"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("root"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t("\n root"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" RED"),a("span",{class:"token punctuation"},";"),t("\n\n root "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"deleteMin"),a("span",{class:"token punctuation"},"("),t("root"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isEmpty"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(" root"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" BLACK"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token comment"},"// assert check();"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// delete the key-value pair with the maximum key rooted at h"),t("\n "),a("span",{class:"token keyword"},"private"),t(),a("span",{class:"token class-name"},"Node"),t(),a("span",{class:"token function"},"deleteMax"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Node"),t(" h"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t("\n h "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"rotateRight"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right "),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token keyword"},"null"),a("span",{class:"token punctuation"},")"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"null"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t("\n h "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"moveRedRight"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n h"),a("span",{class:"token punctuation"},"."),t("right "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"deleteMax"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token function"},"balance"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"/**\n * Removes the largest key and associated value from the symbol table.\n * @throws NoSuchElementException if the symbol table is empty\n */"),t("\n "),a("span",{class:"token keyword"},"public"),t(),a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"deleteMax"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"isEmpty"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token keyword"},"throw"),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"NoSuchElementException"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"BST underflow"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// if both children of root are black, set root to red"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("root"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("root"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t("\n root"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" RED"),a("span",{class:"token punctuation"},";"),t("\n\n root "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"deleteMax"),a("span",{class:"token punctuation"},"("),t("root"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isEmpty"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(" root"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" BLACK"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token comment"},"// assert check();"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// delete the key-value pair with the given key rooted at h"),t("\n "),a("span",{class:"token keyword"},"private"),t(),a("span",{class:"token class-name"},"Node"),t(),a("span",{class:"token function"},"delete"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Node"),t(" h"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token class-name"},"Key"),t(" key"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// assert get(h, key) != null;"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("key"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"compareTo"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("key"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(" "),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t("\n h "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"moveRedLeft"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n h"),a("span",{class:"token punctuation"},"."),t("left "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"delete"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},","),t(" key"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t("\n h "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"rotateRight"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("key"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"compareTo"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("key"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token number"},"0"),t(),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right "),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token keyword"},"null"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"null"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t("\n h "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"moveRedRight"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("key"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"compareTo"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("key"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token class-name"},"Node"),t(" x "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"min"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n h"),a("span",{class:"token punctuation"},"."),t("key "),a("span",{class:"token operator"},"="),t(" x"),a("span",{class:"token punctuation"},"."),t("key"),a("span",{class:"token punctuation"},";"),t("\n h"),a("span",{class:"token punctuation"},"."),t("val "),a("span",{class:"token operator"},"="),t(" x"),a("span",{class:"token punctuation"},"."),t("val"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token comment"},"// h.val = get(h.right, min(h.right).key);"),t("\n "),a("span",{class:"token comment"},"// h.key = min(h.right).key;"),t("\n h"),a("span",{class:"token punctuation"},"."),t("right "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"deleteMin"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"else"),t(" h"),a("span",{class:"token punctuation"},"."),t("right "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"delete"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},","),t(" key"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token function"},"balance"),a("span",{class:"token punctuation"},"("),t("h"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"/**\n * Removes the specified key and its associated value from this symbol table\n * (if the key is in this symbol table).\n *\n * @param key the key\n * @throws IllegalArgumentException if {@code key} is {@code null}\n */"),t("\n "),a("span",{class:"token keyword"},"public"),t(),a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"delete"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Key"),t(" key"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("key "),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token keyword"},"null"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token keyword"},"throw"),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"IllegalArgumentException"),a("span",{class:"token punctuation"},"("),t('"argument '),a("span",{class:"token keyword"},"to"),t("\n "),a("span",{class:"token namespace"},"delete"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(" is "),a("span",{class:"token keyword"},"null"),t('"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"contains"),a("span",{class:"token punctuation"},"("),t("key"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token keyword"},"return"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// if both children of root are black, set root to red"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("root"),a("span",{class:"token punctuation"},"."),t("left"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isRed"),a("span",{class:"token punctuation"},"("),t("root"),a("span",{class:"token punctuation"},"."),t("right"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t("\n root"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" RED"),a("span",{class:"token punctuation"},";"),t("\n\n root "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"delete"),a("span",{class:"token punctuation"},"("),t("root"),a("span",{class:"token punctuation"},","),t(" key"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),a("span",{class:"token function"},"isEmpty"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(" root"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" BLACK"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token comment"},"// assert check();"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br"),a("span",{class:"line-number"},"58"),a("br"),a("span",{class:"line-number"},"59"),a("br"),a("span",{class:"line-number"},"60"),a("br"),a("span",{class:"line-number"},"61"),a("br"),a("span",{class:"line-number"},"62"),a("br"),a("span",{class:"line-number"},"63"),a("br"),a("span",{class:"line-number"},"64"),a("br"),a("span",{class:"line-number"},"65"),a("br"),a("span",{class:"line-number"},"66"),a("br"),a("span",{class:"line-number"},"67"),a("br"),a("span",{class:"line-number"},"68"),a("br"),a("span",{class:"line-number"},"69"),a("br"),a("span",{class:"line-number"},"70"),a("br"),a("span",{class:"line-number"},"71"),a("br"),a("span",{class:"line-number"},"72"),a("br"),a("span",{class:"line-number"},"73"),a("br"),a("span",{class:"line-number"},"74"),a("br"),a("span",{class:"line-number"},"75"),a("br"),a("span",{class:"line-number"},"76"),a("br"),a("span",{class:"line-number"},"77"),a("br"),a("span",{class:"line-number"},"78"),a("br"),a("span",{class:"line-number"},"79"),a("br"),a("span",{class:"line-number"},"80"),a("br"),a("span",{class:"line-number"},"81"),a("br"),a("span",{class:"line-number"},"82"),a("br"),a("span",{class:"line-number"},"83"),a("br"),a("span",{class:"line-number"},"84"),a("br"),a("span",{class:"line-number"},"85"),a("br"),a("span",{class:"line-number"},"86"),a("br"),a("span",{class:"line-number"},"87"),a("br"),a("span",{class:"line-number"},"88"),a("br"),a("span",{class:"line-number"},"89"),a("br"),a("span",{class:"line-number"},"90"),a("br"),a("span",{class:"line-number"},"91"),a("br"),a("span",{class:"line-number"},"92"),a("br"),a("span",{class:"line-number"},"93"),a("br"),a("span",{class:"line-number"},"94"),a("br"),a("span",{class:"line-number"},"95"),a("br"),a("span",{class:"line-number"},"96"),a("br"),a("span",{class:"line-number"},"97"),a("br"),a("span",{class:"line-number"},"98"),a("br"),a("span",{class:"line-number"},"99"),a("br"),a("span",{class:"line-number"},"100"),a("br"),a("span",{class:"line-number"},"101"),a("br"),a("span",{class:"line-number"},"102"),a("br"),a("span",{class:"line-number"},"103"),a("br"),a("span",{class:"line-number"},"104"),a("br"),a("span",{class:"line-number"},"105"),a("br"),a("span",{class:"line-number"},"106"),a("br"),a("span",{class:"line-number"},"107"),a("br"),a("span",{class:"line-number"},"108"),a("br"),a("span",{class:"line-number"},"109"),a("br")])],-1),Q=a("h4",{id:"基本性质"},[a("a",{class:"header-anchor",href:"#基本性质","aria-hidden":"true"},"#"),t(" 基本性质")],-1),W=a("ol",null,[a("li",null,"非红即黑"),a("li",null,"根黑"),a("li",null,"叶黑 e.g T.null 黑哨兵"),a("li",null,"红父孩子黑"),a("li",null,"简单路径同黑"),a("li",null,"右孩子不红 e.g 父黑两孩红 -> 父红两孩黑(flip); 父黑右红 -> 父左旋变红, 右孩子变黑(left-rotate)")],-1),J=a("h4",{id:"基本操作"},[a("a",{class:"header-anchor",href:"#基本操作","aria-hidden":"true"},"#"),t(" 基本操作")],-1),U=a("ol",null,[a("li",null,"插入(插入红点, 旋转+重新着色(反色)保持红黑性质)"),a("li",null,"删除(删除红点, 旋转+重新着色(反色)保持红黑性质)")],-1),X=a("h3",{id:"b-tree"},[a("a",{class:"header-anchor",href:"#b-tree","aria-hidden":"true"},"#"),t(" B Tree")],-1),Y=a("p",null,"t: 每个内部结点至少 t 个孩子(t-1 个 key), 至多 2t 个孩子(2t-1 个 key)",-1),Z=a("h4",{id:"插入-删除"},[a("a",{class:"header-anchor",href:"#插入-删除","aria-hidden":"true"},"#"),t(" 插入/删除")],-1),$=a("p",null,"下溯的同时,分裂满结点",-1),nn=a("h3",{id:"fibonacci-heap"},[a("a",{class:"header-anchor",href:"#fibonacci-heap","aria-hidden":"true"},"#"),t(" Fibonacci Heap")],-1),sn=a("p",null,"BST + 循环双向链表:",-1),an=a("ul",null,[a("li",null,"一个根树(根结点)循环双向链表"),a("li",null,"n 个孩子循环双向链表: 每个根树的每层结点形成一个循环双向链表")],-1),tn=a("h3",{id:"k-dimensional-tree"},[a("a",{class:"header-anchor",href:"#k-dimensional-tree","aria-hidden":"true"},"#"),t(" K-Dimensional Tree")],-1),en=a("ul",null,[a("li",null,"分隔空间数据")],-1),on=a("p",null,"e.g 左子树:左下方 右子树:右上方",-1),ln=a("h2",{id:"search-algorithm"},[a("a",{class:"header-anchor",href:"#search-algorithm","aria-hidden":"true"},"#"),t(" Search Algorithm")],-1),cn=a("h3",{id:"first-search"},[a("a",{class:"header-anchor",href:"#first-search","aria-hidden":"true"},"#"),t(" First Search")],-1),pn=a("ul",null,[a("li",null,"DFS(深度优先):栈实现"),a("li",null,"BFS(广度优先):队列实现")],-1),un=a("p",null,[a("img",{src:"/awesome-notes/assets/SearchPerformance.866c6c75.jpg",alt:"Search Algorithm Performance"})],-1),rn=a("h3",{id:"cycle-detection"},[a("a",{class:"header-anchor",href:"#cycle-detection","aria-hidden":"true"},"#"),t(" cycle detection")],-1),kn=a("ul",null,[a("li",null,"许多图论算法不适用于存在环路的复杂图,故使用循环检测剔除意外情况")],-1),bn=a("p",null,"处理方法:可将环路元素(如强联通分支)视作单一元素,忽视其内部结构",-1),mn=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[t("a "),a("span",{class:"token operator"},"="),t(" b"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("b "),a("span",{class:"token operator"},"="),t(" c"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("c "),a("span",{class:"token operator"},"="),t(" a"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token comment"},"//a extends b;b extends c;c extends a;"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),dn=a("h2",{id:"dynamic-programming"},[a("a",{class:"header-anchor",href:"#dynamic-programming","aria-hidden":"true"},"#"),t(" Dynamic Programming")],-1),hn=a("ul",null,[a("li",null,[t("最优解结构特征: 一个选择 + 子问题的最优解 - 所有(可"),a("strong",null,"重复求解"),t(")子问题的最优解可"),a("strong",null,"独立求解"),t("(不互相影响)")]),a("li",null,"递归定义最优解: 列出递归表达式"),a("li",null,"自底向上求解最优解"),a("li",null,"构造最优解(额外信息数组)")],-1),fn=a("h3",{id:"子问题"},[a("a",{class:"header-anchor",href:"#子问题","aria-hidden":"true"},"#"),t(" 子问题")],-1),yn=a("ul",null,[a("li",null,"子问题可映射为有向图, 并对其进行拓扑排序: 共有 O(n) 个子问题, 每个子问题最多 O(n) 种选择, 则算法时间复杂度为 O(n^2).其对应子问题图有 n 个顶点, 每个顶点最多有 n-1 条边."),a("li",null,"递归生成可以重复求解的子问题,而不是不断生成新的子问题")],-1),gn=a("h3",{id:"范例"},[a("a",{class:"header-anchor",href:"#范例","aria-hidden":"true"},"#"),t(" 范例")],-1),wn=a("ul",null,[a("li",null,"切割钢条问题: max{p[i], r[n-i]}"),a("li",null,"矩阵相乘链问题"),a("li",null,"最大公共子序列问题: r[i, j] = max{r[i, j-1], r[i-1, j]}"),a("li",null,"无权最短路径: path[i, j] = min{path[i, r], [r, j]}")],-1),vn=a("h2",{id:"greedy-algorithm"},[a("a",{class:"header-anchor",href:"#greedy-algorithm","aria-hidden":"true"},"#"),t(" Greedy Algorithm")],-1),xn=a("ul",null,[a("li",null,[t("最优解结构特征: 一个选择 + 子问题的最优解 - 所有(可"),a("strong",null,"重复求解"),t(")子问题的最优解可"),a("strong",null,"独立求解"),t("(不互相影响)")]),a("li",null,"递归定义最优解: 列出递归表达式"),a("li",null,[t("自底向上求解最优解: 每次不进行多次选择, 只进行一次 "),a("strong",null,"贪心选择")]),a("li",null,"构造最优解(额外信息数组)")],-1),Rn=a("h2",{id:"map-algorithm"},[a("a",{class:"header-anchor",href:"#map-algorithm","aria-hidden":"true"},"#"),t(" Map Algorithm")],-1),Sn=a("h3",{id:"图的表示"},[a("a",{class:"header-anchor",href:"#图的表示","aria-hidden":"true"},"#"),t(" 图的表示")],-1),Nn=a("ul",null,[a("li",null,"邻接链表法"),a("li",null,"邻接矩阵法")],-1),jn=a("h4",{id:"稀疏矩阵"},[a("a",{class:"header-anchor",href:"#稀疏矩阵","aria-hidden":"true"},"#"),t(" 稀疏矩阵")],-1),An=a("div",{class:"language-cpp line-numbers-mode"},[a("pre",null,[a("code",null,[t("unordered_map"),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},","),t(" unordered_map"),a("span",{class:"token operator"},"<"),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),a("span",{class:"token operator"},">"),t(),a("span",{class:"token operator"},">"),t(),a("span",{class:"token comment"},"// => (row, (col, val))"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),Tn=a("h3",{id:"广度优先遍历"},[a("a",{class:"header-anchor",href:"#广度优先遍历","aria-hidden":"true"},"#"),t(" 广度优先遍历")],-1),Dn=a("h4",{id:"bfs-node-color"},[a("a",{class:"header-anchor",href:"#bfs-node-color","aria-hidden":"true"},"#"),t(" BFS Node Color")],-1),En=a("ul",null,[a("li",null,"white: 未被发现/访问"),a("li",null,"gray: 已被发现(进入队列), 邻接结点未全部发现"),a("li",null,"black: 已被发现, 邻接结点全部发现")],-1),Bn=a("h4",{id:"bfs-node-parent"},[a("a",{class:"header-anchor",href:"#bfs-node-parent","aria-hidden":"true"},"#"),t(" BFS Node Parent")],-1),Mn=a("p",null,"广度优先树父结点",-1),Fn=a("h4",{id:"bfs-node-distance"},[a("a",{class:"header-anchor",href:"#bfs-node-distance","aria-hidden":"true"},"#"),t(" BFS Node Distance")],-1),zn=a("p",null,"距离 = v.pi.d + 1",-1),Cn=a("h4",{id:"利用队列实现广度优先遍历"},[a("a",{class:"header-anchor",href:"#利用队列实现广度优先遍历","aria-hidden":"true"},"#"),t(" 利用队列实现广度优先遍历")],-1),Pn=a("h3",{id:"深度优先遍历"},[a("a",{class:"header-anchor",href:"#深度优先遍历","aria-hidden":"true"},"#"),t(" 深度优先遍历")],-1),Ln=a("p",null,"利用 递归/栈 实现深度优先遍历",-1),Kn=a("h4",{id:"dfs-node-color"},[a("a",{class:"header-anchor",href:"#dfs-node-color","aria-hidden":"true"},"#"),t(" DFS Node Color")],-1),qn=a("ul",null,[a("li",null,"white: 未被发现/访问"),a("li",null,"gray: 已被发现, 未二次访问"),a("li",null,"black: 已被发现, 二次访问(比其深的所有结点皆被发现)")],-1),In=a("p",null,"当第一个访问 edge(u,v) 时:",-1),On=a("ul",null,[a("li",null,"v.color == white: 树边"),a("li",null,[t("v.color == gray : 后向边(v 为 深度优先*"),a("em",null,"森林"),t("- 的祖父结点)")]),a("li",null,"v.color == black: 前向边/横向边(v 为较深的结点/子结点)"),a("li",null,"无向图深度优先遍历不会出现 前向边/横向边")],-1),Hn=a("h4",{id:"dfs-node-parent"},[a("a",{class:"header-anchor",href:"#dfs-node-parent","aria-hidden":"true"},"#"),t(" DFS Node Parent")],-1),Gn=a("p",null,"比 v 浅的结点(比 v 更早被发现的结点)",-1),_n=a("h4",{id:"dfs-node-distance"},[a("a",{class:"header-anchor",href:"#dfs-node-distance","aria-hidden":"true"},"#"),t(" DFS Node Distance")],-1),Vn=a("ul",null,[a("li",null,"v.d = ++time: 被发现的时间戳(入栈)"),a("li",null,"v.f = ++time: 被二次访问的时间戳(出栈)"),a("li",null,[t("time"),a("code",null,"<"),t("v.d, white; v.d"),a("code",null,"<"),t("time"),a("code",null,"<"),t("v.f, gray: time"),a("code",null,">"),t("v.f, black")])],-1),Qn=a("h3",{id:"拓扑排序"},[a("a",{class:"header-anchor",href:"#拓扑排序","aria-hidden":"true"},"#"),t(" 拓扑排序")],-1),Wn=a("p",null,"目标集合: 拓扑排序后集合, 先入顶点高序, 后入顶点低序",-1),Jn=a("h4",{id:"kahn-算法"},[a("a",{class:"header-anchor",href:"#kahn-算法","aria-hidden":"true"},"#"),t(" Kahn 算法")],-1),Un=a("p",null,"不断将图中入度为 0 的点移入目标集合",-1),Xn=a("h4",{id:"dfs-深度优先"},[a("a",{class:"header-anchor",href:"#dfs-深度优先","aria-hidden":"true"},"#"),t(" DFS(深度优先)")],-1),Yn=a("p",null,"当深度遍历至较深处, 并开始回溯时, 将此时访问的顶点加入目标集合(v.f 降序)",-1),Zn=a("h3",{id:"单源最短路径"},[a("a",{class:"header-anchor",href:"#单源最短路径","aria-hidden":"true"},"#"),t(" 单源最短路径")],-1),$n=a("div",{class:"language-cpp line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"Relax"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" u"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),t(" v"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),t(" w"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(" v"),a("span",{class:"token punctuation"},"."),t("d "),a("span",{class:"token operator"},">"),t(" u"),a("span",{class:"token punctuation"},"."),t("d "),a("span",{class:"token operator"},"+"),t(" w"),a("span",{class:"token punctuation"},"["),t("u"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),t("v"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token punctuation"},"{"),t("\n v"),a("span",{class:"token punctuation"},"."),t("pi "),a("span",{class:"token operator"},"="),t(" u"),a("span",{class:"token punctuation"},";"),t("\n v"),a("span",{class:"token punctuation"},"."),t("d "),a("span",{class:"token operator"},"="),t(" v"),a("span",{class:"token punctuation"},"."),t("pi"),a("span",{class:"token punctuation"},"."),t("d "),a("span",{class:"token operator"},"+"),t(" w"),a("span",{class:"token punctuation"},"["),t("v"),a("span",{class:"token punctuation"},"."),t("pi"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),t("v"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),ns=a("h4",{id:"dag-shortest-paths"},[a("a",{class:"header-anchor",href:"#dag-shortest-paths","aria-hidden":"true"},"#"),t(" DAG Shortest Paths")],-1),ss=a("p",null,"先将图进行拓扑排序(深度优先遍历), 再按照拓扑排序顺序, 依次对每个结点(拓扑排序)的邻接边进行 relax",-1),as=a("blockquote",null,[a("p",null,"a -> b -> c --\x3e d, 且 a--b, a--c, b--d, c--d: relax(a, b), relax(a, c), relax(b, d), relax(c, d)")],-1),ts=a("h4",{id:"bellman-ford-algorithm"},[a("a",{class:"header-anchor",href:"#bellman-ford-algorithm","aria-hidden":"true"},"#"),t(" Bellman-Ford Algorithm")],-1),es=a("p",null,"对每条边进行 n 次(结点总数) relax",-1),os=a("h4",{id:"dijkstra-algorithm"},[a("a",{class:"header-anchor",href:"#dijkstra-algorithm","aria-hidden":"true"},"#"),t(" Dijkstra Algorithm")],-1),ls=a("p",null,"贪心算法: 每次选取不属于 S 集合(white) 且 v.d 最小(gray)的结点, 对其所有邻接边进行 relax, 并将其加入 S 集合(black)",-1),cs=a("ul",null,[a("li",null,"white: 不属于 S 集合"),a("li",null,"gray: 不属于 S 集合 且 v.d 最小"),a("li",null,"black: 属于 S 集合")],-1),ps=a("h3",{id:"结点对最短路径"},[a("a",{class:"header-anchor",href:"#结点对最短路径","aria-hidden":"true"},"#"),t(" 结点对最短路径")],-1),us=a("p",null,"动态规划:l^m(i, j) = min(l^m-1(i, j), min(1<=k<=n){l^m-1(i, k)+w(k, j)})",-1),is=a("blockquote",null,[a("p",null,"m: 中间结点个数")],-1),rs=a("h4",{id:"floyd-warshall-algorithm"},[a("a",{class:"header-anchor",href:"#floyd-warshall-algorithm","aria-hidden":"true"},"#"),t(" Floyd-Warshall Algorithm")],-1),ks=a("p",null,"d^k(i, j) = w(i, j), k = 0 | min(d^k-1(i, j), d^k-1(i, k) + d^k-1(k, j)), k >= 1",-1),bs=a("p",null,"pi^(i, j) = pi^k-1(i, j) or pi^k-1(k, j)",-1),ms=a("blockquote",null,[a("p",null,"k: 中间结点个数")],-1),ds=a("div",{class:"language-cpp line-numbers-mode"},[a("pre",null,[a("code",null,[t("Matrix "),a("span",{class:"token function"},"floyd_warshall"),a("span",{class:"token punctuation"},"("),t("Matrix W"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"int"),t(" n "),a("span",{class:"token operator"},"="),t(" W"),a("span",{class:"token punctuation"},"."),t("rows"),a("span",{class:"token punctuation"},";"),t("\n Matrix D"),a("span",{class:"token operator"},"^"),a("span",{class:"token number"},"0"),t(),a("span",{class:"token operator"},"="),t(" W"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" k "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("k "),a("span",{class:"token operator"},"<"),t(" n"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t(" k"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n D"),a("span",{class:"token operator"},"^"),t("k "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token function"},"Matrix"),a("span",{class:"token punctuation"},"("),t("n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(" n"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" j "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t(" j "),a("span",{class:"token operator"},"<"),t(" n"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t(" J"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n d"),a("span",{class:"token operator"},"^"),t("k"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),t("j"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"min"),a("span",{class:"token punctuation"},"("),t("d"),a("span",{class:"token operator"},"^"),t("k"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),t("j"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),t(" d"),a("span",{class:"token operator"},"^"),t("k"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),t("k"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token operator"},"+"),t("d"),a("span",{class:"token operator"},"^"),t("k"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"["),t("k"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),t("j"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" D"),a("span",{class:"token operator"},"^"),t("n"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br")])],-1),hs=a("h3",{id:"最大流问题"},[a("a",{class:"header-anchor",href:"#最大流问题","aria-hidden":"true"},"#"),t(" 最大流问题")],-1),fs=a("p",null,"MaxFlow Problem:",-1),ys=a("p",null,[a("img",{src:"/awesome-notes/assets/FordFulkersonAlgorithm.94aecb4b.png",alt:"Ford Fulkerson Algorithm"})],-1),gs=a("h4",{id:"最大流模型"},[a("a",{class:"header-anchor",href:"#最大流模型","aria-hidden":"true"},"#"),t(" 最大流模型")],-1),ws=a("p",null,"最大流模型必须满足以下条件:",-1),vs=a("ul",null,[a("li",null,"无双向边"),a("li",null,"唯一的源点 s 和 唯一的汇点 t")],-1),xs=a("p",null,"对于不符合该模型的问题可进行简单转化:",-1),Rs=a("ul",null,[a("li",null,"双向边: 添加额外结点, 切割双向边的其中一条, 使得双向边变成 3 条单向边")],-1),Ss=a("blockquote",null,[a("p",null,"a --\x3e b, b --\x3e a: a --\x3e c, c --\x3e b, b --\x3e a")],-1),Ns=a("ul",null,[a("li",null,"多源点/汇点: 添加一个总源点/汇点")],-1),js=a("h4",{id:"残存网络"},[a("a",{class:"header-anchor",href:"#残存网络","aria-hidden":"true"},"#"),t(" 残存网络")],-1),As=a("ul",null,[a("li",null,"若原图 u --\x3e v 总容量 > 0, 则残存网络中 边 u --\x3e v:剩余容量, 边 v --\x3e u: 已用容量"),a("li",null,"增广路径: 残存网络中一条可行通路")],-1),Ts=a("h4",{id:"最大流最小割定理"},[a("a",{class:"header-anchor",href:"#最大流最小割定理","aria-hidden":"true"},"#"),t(" 最大流最小割定理")],-1),Ds=a("p",null,"MaxFlow-MinCut Theorem:",-1),Es=a("ul",null,[a("li",null,"切割的净流量: 流出-流入"),a("li",null,"切割的容量: 流出总容量(无需减流入总容量)"),a("li",null,"最小切割: 容量最小的切割")],-1),Bs=a("p",null,"最大流最小割定理: 以下三个命题等价",-1),Ms=a("ul",null,[a("li",null,"f 是 G 的一个最大流"),a("li",null,"残存网络 Gf 不含增广路径"),a("li",null,"|f| = c(S, T)(切割的容量): |f| <= c(S, T)(流网络中任意流 f <= 任意切割容量 c(S, T))")],-1),Fs=a("h4",{id:"ford-fulkerson-algorithm"},[a("a",{class:"header-anchor",href:"#ford-fulkerson-algorithm","aria-hidden":"true"},"#"),t(" Ford-Fulkerson Algorithm")],-1),zs=a("p",null,"不断寻找增广路径",-1),Cs=a("h2",{id:"tree-edit-distance"},[a("a",{class:"header-anchor",href:"#tree-edit-distance","aria-hidden":"true"},"#"),t(" Tree Edit Distance")],-1),Ps=a("h3",{id:"definition"},[a("a",{class:"header-anchor",href:"#definition","aria-hidden":"true"},"#"),t(" Definition")],-1),Ls=a("p",null,"Tree Edit Distance: 给定 Cost(edit operation) 时的最小编辑费用",-1);o.render=function(a,t,e,o,Ks,qs){return n(),s("div",null,[l,c,p,u,i,r,k,b,m,d,h,f,y,g,w,v,x,R,S,N,j,A,T,D,E,B,M,F,z,C,P,L,K,q,I,O,H,G,_,V,Q,W,J,U,X,Y,Z,$,nn,sn,an,tn,en,on,ln,cn,pn,un,rn,kn,bn,mn,dn,hn,fn,yn,gn,wn,vn,xn,Rn,Sn,Nn,jn,An,Tn,Dn,En,Bn,Mn,Fn,zn,Cn,Pn,Ln,Kn,qn,In,On,Hn,Gn,_n,Vn,Qn,Wn,Jn,Un,Xn,Yn,Zn,$n,ns,ss,as,ts,es,os,ls,cs,ps,us,is,rs,ks,bs,ms,ds,hs,fs,ys,gs,ws,vs,xs,Rs,Ss,Ns,js,As,Ts,Ds,Es,Bs,Ms,Fs,zs,Cs,Ps,Ls])};export default o;export{e as __pageData}; diff --git a/assets/computerScience_algorithms_ojBasicNotes.md.87451c39.js b/assets/computerScience_algorithms_ojBasicNotes.md.87451c39.js new file mode 100644 index 00000000000..325d16ce6ed --- /dev/null +++ b/assets/computerScience_algorithms_ojBasicNotes.md.87451c39.js @@ -0,0 +1 @@ +import{o as n,c as s,a}from"./app.6dd2a1b7.js";const p='{"title":"OJ Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"C++ Notes for OJ","slug":"c-notes-for-oj"},{"level":3,"title":"Format","slug":"format"},{"level":3,"title":"Iterator","slug":"iterator"},{"level":3,"title":"limits","slug":"limits"},{"level":3,"title":"Implementation Pattern","slug":"implementation-pattern"},{"level":3,"title":"algorithm","slug":"algorithm"},{"level":3,"title":"map","slug":"map"},{"level":3,"title":"Algorithm","slug":"algorithm-1"},{"level":2,"title":"Search Problem","slug":"search-problem"},{"level":3,"title":"Search in Sorted Array","slug":"search-in-sorted-array"},{"level":3,"title":"Max Min Problem","slug":"max-min-problem"},{"level":3,"title":"Range Max Min Query","slug":"range-max-min-query"},{"level":2,"title":"Greedy Algorithm","slug":"greedy-algorithm"},{"level":2,"title":"Simulation","slug":"simulation"},{"level":3,"title":"Painting","slug":"painting"},{"level":3,"title":"Reverting","slug":"reverting"},{"level":3,"title":"Meet Problem and Collision Problem","slug":"meet-problem-and-collision-problem"},{"level":2,"title":"String","slug":"string"},{"level":3,"title":"Rotate String","slug":"rotate-string"},{"level":2,"title":"Map Theory","slug":"map-theory"},{"level":3,"title":"Shortest Paths","slug":"shortest-paths"},{"level":3,"title":"Minimal Spanning Tree","slug":"minimal-spanning-tree"},{"level":3,"title":"BFS","slug":"bfs"},{"level":3,"title":"DFS","slug":"dfs"},{"level":3,"title":"Connected Component","slug":"connected-component"},{"level":2,"title":"Dynamic Programming","slug":"dynamic-programming"},{"level":3,"title":"典型题目","slug":"典型题目"},{"level":3,"title":"Digital Bits Dynamic Programming(数位 DP)","slug":"digital-bits-dynamic-programming-数位-dp"},{"level":2,"title":"Math","slug":"math"},{"level":3,"title":"Matrix Fast Power","slug":"matrix-fast-power"},{"level":3,"title":"Mod Power","slug":"mod-power"},{"level":2,"title":"Tips","slug":"tips"},{"level":3,"title":"Array","slug":"array"},{"level":3,"title":"Map","slug":"map-1"},{"level":3,"title":"Set","slug":"set"},{"level":3,"title":"Two Pointer","slug":"two-pointer"},{"level":3,"title":"Float Pointer","slug":"float-pointer"},{"level":3,"title":"bit 表示法","slug":"bit-表示法"}],"relativePath":"computerScience/algorithms/ojBasicNotes.md","lastUpdated":1627194884000}',t={},o=a('

    C++ Notes for OJ

    Format

    string and integer

    • String Stream
    • to_string
    • stoll
    • atoi/atol/atof

    Iterator

    slice

    vector<int> b(a.begin() + 1, a.end());\nvector<int> c(a.rbegin(), a.rend());\n
    1
    2

    limits

     #include<iostream>\n #include<string>\n #include <limits>\n\nusing namespace std;\n\nint main(void) {\n    cout << "type: \\t\\t" << "************size**************"<< endl;\n    cout << "bool: \\t\\t" << "所占字节数:" << sizeof(bool);\n    cout << "\\t最大值:" << (numeric_limits<bool>::max)();\n    cout << "\\t\\t最小值:" << (numeric_limits<bool>::min)() << endl;\n    cout << "char: \\t\\t" << "所占字节数:" << sizeof(char);\n    cout << "\\t最大值:" << (numeric_limits<char>::max)();\n    cout << "\\t\\t最小值:" << (numeric_limits<char>::min)() << endl;\n    cout << "signed char: \\t" << "所占字节数:" << sizeof(signed char);\n    cout << "\\t最大值:" << (numeric_limits<signed char>::max)();\n    cout << "\\t\\t最小值:" << (numeric_limits<signed char>::min)() << endl;\n    cout << "unsigned char: \\t" << "所占字节数:" << sizeof(unsigned char);\n    cout << "\\t最大值:" << (numeric_limits<unsigned char>::max)();\n    cout << "\\t\\t最小值:" << (numeric_limits<unsigned char>::min)() << endl;\n    cout << "wchar_t: \\t" << "所占字节数:" << sizeof(wchar_t);\n    cout << "\\t最大值:" << (numeric_limits<wchar_t>::max)();\n    cout << "\\t\\t最小值:" << (numeric_limits<wchar_t>::min)() << endl;\n    cout << "short: \\t\\t" << "所占字节数:" << sizeof(short);\n    cout << "\\t最大值:" << (numeric_limits<short>::max)();\n    cout << "\\t\\t最小值:" << (numeric_limits<short>::min)() << endl;\n    cout << "int: \\t\\t" << "所占字节数:" << sizeof(int);\n    cout << "\\t最大值:" << (numeric_limits<int>::max)();\n    cout << "\\t最小值:" << (numeric_limits<int>::min)() << endl;\n    cout << "unsigned: \\t" << "所占字节数:" << sizeof(unsigned);\n    cout << "\\t最大值:" << (numeric_limits<unsigned>::max)();\n    cout << "\\t最小值:" << (numeric_limits<unsigned>::min)() << endl;\n    cout << "long: \\t\\t" << "所占字节数:" << sizeof(long);\n    cout << "\\t最大值:" << (numeric_limits<long>::max)();\n    cout << "\\t最小值:" << (numeric_limits<long>::min)() << endl;\n    cout << "unsigned long: \\t" << "所占字节数:" << sizeof(unsigned long);\n    cout << "\\t最大值:" << (numeric_limits<unsigned long>::max)();\n    cout << "\\t最小值:" << (numeric_limits<unsigned long>::min)() << endl;\n    cout << "double: \\t" << "所占字节数:" << sizeof(double);\n    cout << "\\t最大值:" << (numeric_limits<double>::max)();\n    cout << "\\t最小值:" << (numeric_limits<double>::min)() << endl;\n    cout << "long double: \\t" << "所占字节数:" << sizeof(long double);\n    cout << "\\t最大值:" << (numeric_limits<long double>::max)();\n    cout << "\\t最小值:" << (numeric_limits<long double>::min)() << endl;\n    cout << "float: \\t\\t" << "所占字节数:" << sizeof(float);\n    cout << "\\t最大值:" << (numeric_limits<float>::max)();\n    cout << "\\t最小值:" << (numeric_limits<float>::min)() << endl;\n    cout << "size_t: \\t" << "所占字节数:" << sizeof(size_t);\n    cout << "\\t最大值:" << (numeric_limits<size_t>::max)();\n    cout << "\\t最小值:" << (numeric_limits<size_t>::min)() << endl;\n    cout << "string: \\t" << "所占字节数:" << sizeof(string) << endl;\n    // << "\\t最大值:" << (numeric_limits<string>::max)() << "\\t最小值:"\n    // << (numeric_limits<string>::min)() << endl;\n    cout << "type: \\t\\t" << "************size**************"<< endl;\n    return 0;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56

    Implementation Pattern

    #define FIN             freopen("input.txt","r",stdin)\n#define FOUT            freopen("output.txt","w",stdout)\n#define fst             first\n#define snd             second\n\ntypedef long long LL;\ntypedef pair < int, int >PII;\n\nconst int INF = 0x3f3f3f3f;\nconst int MAX_N = 500 + 5;\nconst int MAX_P = 6 + 5;\n\nint T, N, M, P, res;\nchar buf[MAX_N];\nint usr[MAX_N], usr_cnt;\n\nstruct MST {\n    struct Edge {\n        int u, v, w;\n        Edge() {}\n        Edge(int u, int v, int w):u(u), v(v), w(w) {}\n        bool operator <(const Edge & e) const {\n            return w < e.w;\n        }\n    } edges[MAX_N * MAX_P];\n\n    int par[MAX_N], tot;\n\n    void init() {\n        memset(par, -1, sizeof(par));\n        tot = 0;\n    }\n\n    int Find(int x) {\n        return -1 == par[x] ? x : (par[x] = Find(par[x]));\n    }\n\n    void add_edge(int u, int v, int w) {\n        edges[tot++] = Edge(u, v, w);\n    }\n\n    int Kruskal() {\n        memset(par, -1, sizeof(par));\n        int u, v, w, pu, pv, cnt = 0, ret = 0;\n        sort(edges, edges + tot);\n        for (int i = 0; i < tot; i++) {\n            if (cnt == usr_cnt - 1)\n                break;\n            u = edges[i].u, v = edges[i].v, w = edges[i].w;\n            pu = Find(u), pv = Find(v);\n            if (pu == pv)\n                continue;\n            par[pv] = pu;\n            ret += w;\n            cnt++;\n        }\n        return ret;\n    }\n} mst;\n\nstruct Dijkstra {\n    struct Edge {\n        int v, w, next;\n        Edge() {}\n        Edge(int v, int w, int next):v(v), w(w), next(next) {}\n    } edges[MAX_N * MAX_P * 2];\n\n    struct QNode {\n        int u, w;\n        QNode() {}\n        QNode(int u, int w):u(u), w(w) {}\n        bool operator >(const QNode & e) const {\n            return w > e.w;\n        }\n    } cur;\n\n    int head[MAX_N], tot;\n    int dist[MAX_N];\n    bool vis[MAX_N];\n    priority_queue < QNode, vector < QNode >, greater < QNode > >Q;\n\n    void init() {\n        tot = 0;\n        memset(head, -1, sizeof(head));\n        memset(dist, 0x3f, sizeof(dist));\n        memset(vis, false, sizeof(vis));\n    }\n\n    void add_edge(int u, int v, int w) {\n        edges[tot] = Edge(v, w, head[u]);\n        head[u] = tot++;\n    }\n\n    int dijkstra(int src, int dst) {\n        int u, v, w;\n        Q.push(QNode(src, dist[src] = 0));\n        while (!Q.empty()) {\n            cur = Q.top();\n            Q.pop();\n            u = cur.u;\n            if (vis[u])\n                continue;\n            vis[u] = true;\n            for (int i = head[u]; ~i; i = edges[i].next) {\n                v = edges[i].v, w = edges[i].w;\n                if (!vis[v] && dist[v] > dist[u] + w) {\n                    dist[v] = dist[u] + w;\n                    Q.push(QNode(v, dist[v]));\n                }\n            }\n        }\n        return dist[dst];\n    }\n} dij;\n\nint solve() {\n    int u, v, w;\n\n    if (usr_cnt == N) {\n        mst.init();\n\n        for (int i = 1; i <= M; i++) {\n            scanf("%d %d %d", &u, &v, &w);\n            mst.add_edge(u, v, w);\n        }\n\n        return mst.Kruskal();\n    } else if (usr_cnt == 2) {\n        dij.init();\n\n        for (int i = 1; i <= M; i++) {\n            scanf("%d %d %d", &u, &v, &w);\n            dij.add_edge(u, v, w);\n            dij.add_edge(v, u, w);\n        }\n\n        return dij.dijkstra(usr[0], usr[1]);\n    }\n}\n\nint main()\n{\n\n #ifndef ONLINE_JUDGE\n    FIN;\n #endif // ONLINE_JUDGE\n\n    scanf("%d", &T);\n\n    while (T--) {\n        usr_cnt = 0;\n        scanf("%d %d %d", &N, &M, &P);\n        scanf("%s", buf + 1);\n\n        for (int i = 1; i <= N; i++) {\n            if (buf[i] == '1')\n                usr[usr_cnt++] = i;\n        }\n\n        res = solve();\n        printf("%d\\n", res);\n    }\n\n    return 0;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165

    algorithm

    sort

    • in map: auto sort
    struct Node {\n    bool operator<(const Node &o) {\n        return *this < o;\n    }\n};\n\nmap<Node> mps;\n
    1
    2
    3
    4
    5
    6
    7
    • sort vector
    bool cmp(const elem &i, const elem &j) {\n    return i < j;\n}\n\nsort(vec.start(), vec.end(), cmp);\n
    1
    2
    3
    4
    5

    map

    • insert/update: mp[key] = value;
    • search: mp.count(key)/mp.find(key), 不会插入空元素
    • unordered_map: hash map

    Algorithm

    • sort
    • reverse
    • accumulate
    • prev_permutation/next_permutation

    Search Problem

    Search in Sorted Array

    • Binary Search
    • Divide and Conquer

    LeetCode 74/240

    Max Min Problem

    在某些问题中, 要求满足条件的 max/min, 且可以轻易地判定某个值是否满足该条件, 则可利用二分法进行值的枚举

    // poj 1064\nint N, K;\ndouble L[max_n];\n\n// judgement\nbool C(double x) {\n  int num = 0;\n\n  for (int i = 0; i < N; i++) {\n    num += (int)(L[i] / x);\n  }\n\n  return num >= K;\n}\n\nvoid solve(void) {\n  double lb = 0, ub = numeric_limits<double>::max();\n\n  for (int i = 0; i < 100; i++) {\n    double mid = (lb + ub) / 2;\n    if (C(mid)) lb = mid;\n    else ub = mid;\n  }\n\n  printf("%.2f\\n", floor(ub * 100) / 100);\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26

    Range Max Min Query

    • Segment Tree (线段树)
    • Binary Indexed Tree (树状数组)
    • Bucket Method (Divide and Conquer)
    const int maxN = 1 << 17;\n\nint n;\nint dat[2 * maxN - 1];\n\nvoid init(int n_) {\n  n = 1;\n\n  // padding to 2^n\n  while (n < n_) n *= 2;\n\n  for (int i = 0; i < 2 * n - 1; i++) {\n    dat[i] = (numeric_limits<int>::max)();\n  }\n}\n\nvoid update(int k, int a) {\n  k += n - 1;\n  dat[k] = a;\n\n  while (k > 0) {\n    k = (k - 1) / 2;\n    dat[k] = min(dat[k * 2 + 1], dat[k * 2 + 2]);\n  }\n}\n\nint query(int a, int b, int k, int l, int r) {\n  // failed\n  if (r <= a || b <= 1) {\n    return (numeric_limits<int>::max)();\n  }\n\n  // [l, r) <= [a, b)\n  if (a <= 1 && r <= b) {\n    return dat[k];\n  } else {\n    int vl = query(a, b, k * 2 + 1, l, (l + r) / 2);\n    int vr = query(a, b, k * 2 + 2, (l + r) / 2, r);\n    return min(vl, vr);\n  }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41

    Greedy Algorithm

    • 字典排序比较问题
    • Huffman Tree

    Simulation

    Painting

    • 对于实际操作, 直接覆写至状态数组即可, 无需关心边界条件(效果会立即生效)

    e.g 交接处方块 , 2 次写 1, maps[i][j] = 1, 不用担心重复计数

    Reverting

    • using 1 bit to simulate operation
    • when need to output, calculate bits up
    • combined with dp problem

    Meet Problem and Collision Problem

    将相遇/碰撞的两物体视作插肩而过即可

    String

    sstream::stringstream\n\nsort()\ntransform(toUpper/toLower)\n\nstring::size_type\nstring::npos(vector.end())\n\nstr.find() == string::npos/string::size_type\nstr.substr(int pos, int len)\n\ngetline(cin/sin, strbuf)\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    • string::size_type pre, post 指针: 进行逐行匹配

    Rotate String

    #include <string>\n#include <algorithm>\n\nstring left_rotate(string str, int offset) {\n  int size = str.length();\n  int n = offset % size;\n  reverse(str.begin(), str.begin() + n);\n  reverse(str.begin() + n, str.end());\n  reverse(str.begin(), str.end());\n  return str;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    Map Theory

    Shortest Paths

    • Dijkstra
    • Floyd

    Minimal Spanning Tree

    • Kruskal (tFind/tUnion)

    BFS

    Mark array/queue:

    • Shortest Paths
    • Diameter(直径) of Tree(Two pass for BFS)

    DFS

    Mark array/ Mark stack/Recursion:

    • Longest Paths

    Connected Component

    Strongly Connected Component

    • Tarjan Algorithm(v.index(DFS 时此点被访问的顺序) == v.lowLink(从 v 出发经有向边可达到的所有结点中最小的 index))

    Union Find

    quickly figure out connection of map

    Dynamic Programming

    • dp 数组可以滚动使用, 从而节省空间

    dp[m][n] => dp[2][n] (dp[i & 1][j])

    典型题目

    关键: 最优子结构 + 状态无后效性

    • 所有背包问题
    • 二分问题:最优二分搜索树/文件合并
    • 非连续特征序列: 最长子序列/最长上升序列
    • 多重部分和问题 e.g 数组中是否存在一对数的和为 xx
    • 计数问题/分组问题/分划问题

    Digital Bits Dynamic Programming(数位 DP)

    题目模式

    • 给定区间 [a, b], 求满足特定要求的数, 要求一般与大小无关, 与数位的组成相关
    • 规模巨大, 无法枚举

    递增数: 1234, 2579; 双峰数: 19280, 26193; 含 49: 49, 149, 1492; 整除 13: 26, 39 ...

    解题模式

    f(a, b) = f(b, 0) - f(a - 1, 0)

    暴力 + 存储 = 记忆化搜索:

    • 暴力枚举每一位的 (0, ...,9)
    • 利用 dp[pos][state] 与 dfs(pos, state, k, flag) 进行存储
    /// \\brief 数字处理函数\n/// \\param num 原始数据\n/// \\param digit 保存每个数位的值\n/// \\param state 初始状态\nint f(int num){\n    int ans;\n    int pos = 0;\n\n    while(num){\n        digit[++pos]=num%10;\n        num=num/10;\n    }\n\n    return dfs( pos, state , true);\n}\n\n/// \\brief dfs 函数, 从高位开始遍历\n/// \\param f     记忆化数组\n/// \\param pos   当前数位下标\n/// \\param state 之前数字的状态\n/// \\param flag  上限标志\nint dfs(int pos, int state, bool flag) {\n    if (pos == -1) {\n        return state == target_state;\n    }\n    if (!exception && ~f[pos][state]) {\n        return f[pos][state]\n    }\n\n    int ans = 0;\n\n    // 对于每一个数位, 求出枚举界限\n    // 一般从 0 枚举至 9, 当到达特殊位置时, 枚举上限可能改变\n    int next = exception ? digit[i] : 9;\n\n    for (int digit = 0; digit <= next; digit++) {\n        ans += dfs(pos - 1, new_state(state, digit), exception && digit == next);\n    }\n\n    return flag ? ans : f[pos][state] = ans;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    typedef long long ll;\n\nint a[20];\n\nll dp[20][state];   //不同题目状态不同\n\nll dfs(int pos, int state, bool lead, bool limit) {\n    // 递归边界, 按位枚举最低位是0, pos == -1 表示枚举结束\n    if (pos == -1) {\n        // 若可以保证每一位都合法, 则 return 1; 否则 return 0\n        return 1;\n    }\n\n    // 记忆化\n    if (!limit && !lead && dp[pos][state] != -1) {\n        return dp[pos][state];\n    }\n\n    // 根据 limit 判断枚举的上界 up\n    int up = limit ? a[pos] : 9;\n\n    // 开始计数\n    ll ans=0;\n\n    // 枚举: 把不同情况的个数加到ans\n    for(int i = 0;i <= up; i++)\n    {\n        // 当前数位枚举的数是i,根据题目的约束条件分类讨论\n        // 计算不同情况下的个数, 根据 state 变量来保证 i 的合法性\n        // 一定要保证枚举数的合法性\n\n        // 比如要求数位上不能有 62 连续出现, 那么state 就要保存前一位 pre\n        // 前一位如果是 6 那么位不能是 2\n\n        // 当不合法时, 直接 continue\n        if() ...\n        else if()...\n\n        ans += dfs(pos-1, new_state(pos, state) /*状态转移*/,\n          lead && i==0, limit && i == a[pos])\n    }\n\n    // 计算结束, 记录状态\n    if (!limit && !lead) {\n        dp[pos][state] = ans;\n    }\n\n    return ans;\n}\n\nll solve(ll x) {\n    int pos=0;\n\n    // 数位分解\n    while(x) {\n        a[pos++] = x % 10;\n        x /= 10;\n    }\n\n    // 从最高位开始枚举\n    // 最高位前导为 0, 且受上限限制(无法枚举至 9)\n    return dfs(pos-1, state /*一系列状态 */, true, true);\n}\n\nint main(void) {\n    ll le,ri;\n\n    while (~scanf("%lld %lld", &le, &ri)) {\n        // 初始化dp数组为-1\n        printf("%lld\\n", solve(ri)-solve(le-1));\n    }\n\n    return 0;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74

    Math

    Matrix Fast Power

    typedef vector<vector> mat;\n\nmat mul(mat& A, mat& B) {\n    mat C(A.size(), vec(B[0].size()));\n    for(int i = 0; i < (int)A.size(); ++i)\n        for(int j = 0; j < (int)B[0].size(); ++j)\n                for(int k = 0; k < (int)B.size(); ++k)\n                        C[i][j] ^= A[i][k] & B[k][j];\n    return C;\n}\n\nmat pow(mat A, int p) {\n    mat E(A.size(), vec(A.size()));\n    for(int i = 0; i < (int)A.size(); ++i) E[i][i] = 1;\n    while(p){\n        if(p & 1) E = mul(E, A);\n        A = mul(A, A);\n        p >>= 1;\n    }\n    return E;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21

    Mod Power

    typedef long long ll;\n\nll mod_pow(ll x, ll n, ll mod) {\n    ll res = 1;\n\n    while (n > 0) {\n        if (n & 1) res = res * x % mod;\n\n        x = x * x % mod;\n        n >>= 1;\n    }\n\n    return res;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    Tips

    Array

    • 可以利用数组元素的正负性表示存在性(或其他特殊意义)

    Map

    • 用于 Hash 化
    • 用于将字符串转为数字
    • 用于计数

    Set

    • 用于去重与查重(duplicate)
    • 用于集合运算题(交、并、差等)

    Two Pointer

    可以在有穷时间内判断是否存在循环:一个快指针,一个慢指针,当两者相遇时,表示存在循环。

    Float Pointer

    利用浮动指针解决相关问题:

    • 字符串比较
    • 连续区间问题(尺取法)

    bit 表示法

    多用于状态枚举(1 bit 表示 1 个状态/开关), 表示状态集合

    可用于动态规划中压缩状态

    0 // empty set\n1 << i // just 1 bit on\n(1 << n) - 1 // n bit on\nif (S >> i & 1) // include nth(i) bit\nS | 1 << i // insert nth(i) bit\nS & ~(1 << i) // remove nth(1) bit\nS | T // union\nS & T // intersection\n\ni & -i // last 1 bit\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ',101);t.render=function(a,p,t,e,c,l){return n(),s("div",null,[o])};export default t;export{p as __pageData}; diff --git a/assets/computerScience_algorithms_ojBasicNotes.md.87451c39.lean.js b/assets/computerScience_algorithms_ojBasicNotes.md.87451c39.lean.js new file mode 100644 index 00000000000..623a127f64c --- /dev/null +++ b/assets/computerScience_algorithms_ojBasicNotes.md.87451c39.lean.js @@ -0,0 +1 @@ +import{o as n,c as s,a}from"./app.6dd2a1b7.js";const p='{"title":"OJ Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"C++ Notes for OJ","slug":"c-notes-for-oj"},{"level":3,"title":"Format","slug":"format"},{"level":3,"title":"Iterator","slug":"iterator"},{"level":3,"title":"limits","slug":"limits"},{"level":3,"title":"Implementation Pattern","slug":"implementation-pattern"},{"level":3,"title":"algorithm","slug":"algorithm"},{"level":3,"title":"map","slug":"map"},{"level":3,"title":"Algorithm","slug":"algorithm-1"},{"level":2,"title":"Search Problem","slug":"search-problem"},{"level":3,"title":"Search in Sorted Array","slug":"search-in-sorted-array"},{"level":3,"title":"Max Min Problem","slug":"max-min-problem"},{"level":3,"title":"Range Max Min Query","slug":"range-max-min-query"},{"level":2,"title":"Greedy Algorithm","slug":"greedy-algorithm"},{"level":2,"title":"Simulation","slug":"simulation"},{"level":3,"title":"Painting","slug":"painting"},{"level":3,"title":"Reverting","slug":"reverting"},{"level":3,"title":"Meet Problem and Collision Problem","slug":"meet-problem-and-collision-problem"},{"level":2,"title":"String","slug":"string"},{"level":3,"title":"Rotate String","slug":"rotate-string"},{"level":2,"title":"Map Theory","slug":"map-theory"},{"level":3,"title":"Shortest Paths","slug":"shortest-paths"},{"level":3,"title":"Minimal Spanning Tree","slug":"minimal-spanning-tree"},{"level":3,"title":"BFS","slug":"bfs"},{"level":3,"title":"DFS","slug":"dfs"},{"level":3,"title":"Connected Component","slug":"connected-component"},{"level":2,"title":"Dynamic Programming","slug":"dynamic-programming"},{"level":3,"title":"典型题目","slug":"典型题目"},{"level":3,"title":"Digital Bits Dynamic Programming(数位 DP)","slug":"digital-bits-dynamic-programming-数位-dp"},{"level":2,"title":"Math","slug":"math"},{"level":3,"title":"Matrix Fast Power","slug":"matrix-fast-power"},{"level":3,"title":"Mod Power","slug":"mod-power"},{"level":2,"title":"Tips","slug":"tips"},{"level":3,"title":"Array","slug":"array"},{"level":3,"title":"Map","slug":"map-1"},{"level":3,"title":"Set","slug":"set"},{"level":3,"title":"Two Pointer","slug":"two-pointer"},{"level":3,"title":"Float Pointer","slug":"float-pointer"},{"level":3,"title":"bit 表示法","slug":"bit-表示法"}],"relativePath":"computerScience/algorithms/ojBasicNotes.md","lastUpdated":1627194884000}',t={},o=a('',101);t.render=function(a,p,t,e,c,l){return n(),s("div",null,[o])};export default t;export{p as __pageData}; diff --git a/assets/computerScience_architecture_archBasicNotes.md.1ed20244.js b/assets/computerScience_architecture_archBasicNotes.md.1ed20244.js new file mode 100644 index 00000000000..7e0a7bc83c3 --- /dev/null +++ b/assets/computerScience_architecture_archBasicNotes.md.1ed20244.js @@ -0,0 +1 @@ +import{o as e,c as t,a}from"./app.6dd2a1b7.js";const r='{"title":"Architecture Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"SuperPipeline and SuperScalar","slug":"superpipeline-and-superscalar"},{"level":3,"title":"Instructions Dependencies and Latencies","slug":"instructions-dependencies-and-latencies"},{"level":3,"title":"Branch Prediction","slug":"branch-prediction"},{"level":2,"title":"VLIW (Very Long Instruction Word)","slug":"vliw-very-long-instruction-word"},{"level":2,"title":"Out of Order Execution (OoO or OoE)","slug":"out-of-order-execution-ooo-or-ooe"},{"level":3,"title":"The Brainiac vs Speed-demon Debate","slug":"the-brainiac-vs-speed-demon-debate"},{"level":3,"title":"Power Wall and ILP Wall","slug":"power-wall-and-ilp-wall"},{"level":3,"title":"Decoupled x86 microarchitecture","slug":"decoupled-x86-microarchitecture"},{"level":2,"title":"SMT (Hardware Threads)","slug":"smt-hardware-threads"},{"level":3,"title":"More cores or Wider cores","slug":"more-cores-or-wider-cores"},{"level":2,"title":"DLP (data-level parallelism)","slug":"dlp-data-level-parallelism"},{"level":3,"title":"SIMD Vector Instructions","slug":"simd-vector-instructions"},{"level":2,"title":"Memory","slug":"memory"},{"level":3,"title":"Memory Wall","slug":"memory-wall"},{"level":3,"title":"Caches","slug":"caches"},{"level":3,"title":"Memory Latency and Bandwidth","slug":"memory-latency-and-bandwidth"},{"level":2,"title":"Distributed System","slug":"distributed-system"},{"level":2,"title":"Reference","slug":"reference"}],"relativePath":"computerScience/architecture/archBasicNotes.md","lastUpdated":1627194884000}',s={},i=a('

    Architecture Basic Notes

    SuperPipeline and SuperScalar

    A superpipeline processor own a 5-20 stage pipeline, a superscalar issues 3-8 instructions in parallel (more functional units like integer/float units).

    Instructions Dependencies and Latencies

    The number of cycles between when an instruction reaches the execute stage and when its result is available for use by other instructions is called the instruction's latency. The deeper the pipeline, the more stages and thus the longer the latency. The processor will need to stall the execution of the instructions until their data is available (dependencies), inserting a bubble into the pipeline where no work gets done, making multiple issue in this case impossible.

    Branch Prediction

    Another key problem for pipelining is branches (flush out all instructions of wrong branch). Unfortunately, even the best branch prediction techniques are sometimes wrong, and with a deep pipeline many instructions might need to be cancelled. This is called the mispredict penalty. The deeper the pipeline, the further into the future you must try to predict, the more likely you'll be wrong, and the greater the mispredict penalty when you are.

    Predication can be used to eliminate branches such as cmovle (move data only when testing flag stays less or equal state). The Alpha architecture had a conditional move instruction from the very beginning. MIPS, SPARC, x86 added it later and the ARM architecture was the first architecture with a fully predicated instruction set (though the early ARM processors only had short pipelines and small mispredict penalties).

    VLIW (Very Long Instruction Word)

    In cases where backward compatibility is not an issue, it is possible for the instruction set itself to be designed to explicitly group instructions to be executed in parallel. A VLIW processor's instruction flow is much like a super-scalar, except the decode/dispatch stage is much simpler and only occurs for each group of sub-instructions. No VLIW designs have yet been commercially successful as mainstream CPUs.

    Out of Order Execution (OoO or OoE)

    If branches and long-latency instructions are going to cause bubbles in the pipeline(s), then perhaps those empty cycles can be used to do other work. To achieve this, the instructions in the program must be reordered (instruction scheduling and register renaming). Compiler completes static instruction scheduling (rearranged instruction stream at compile time), processor completes dynamic instruction scheduling (renaming registers and reorder instruction stream at runtime). The processor must keep a mapping of the instructions in flight at any moment and the physical registers they use. The extra logic of scheduler is particularly power-hungry because those transistors are always working.

    The Brainiac vs Speed-demon Debate

    Brainiac designs are at the smart-machine end of the spectrum, with lots of OOO hardware trying to squeeze every last drop of instruction-level parallelism out of the code, even if it costs millions of logic transistors and years of design effort to do it. In contrast, speed-demon designs are simpler and smaller, relying on a smart compiler and willing to sacrifice a little bit of instruction-level parallelism for the other benefits that simplicity brings. Which would you rather have: 4 powerful brainiac cores, or 8 simpler in-order cores? When it comes to the brainiac debate, many vendors have gone down one path then changed their mind and switched to the other side.

    Power Wall and ILP Wall

    Power usage goes up even faster than clock speed does (increasing clock speed by 20% with 50% more power usage, O(power) = frequency * Voltage * Voltage). Leakage current also goes up as the voltage is increased, leakage generally goes up as the temperature increases as well. The power and heat problems become unmanageable, because it's simply not possible to provide that much power and cooling to a silicon chip. Thus, going purely for clock speed is not the best strategy.

    normal programs just don't have a lot of fine-grained parallelism in them, due to a combination of load latencies, cache misses, branches and dependencies between instructions. This limit of available instruction-level parallelism is called the ILP wall.

    Decoupled x86 microarchitecture

    Dynamically decode the x86 instructions into simple, RISC-like micro-instructions (μops, pronounced "micro-ops"), which can then be executed by a fast, RISC-style register-renaming OOO superscalar core. The pipeline depth of Core i2/i3 Sandy/Ivy Bridge was shown as 14/19 stages in the earlier section on superpipeline, it is 14 stages when the processor is running from its L0 μop cache (which is the common case), but 19 stages when running from the L1 instruction cache and having to decode x86 instructions and translate them into μops.

    SMT (Hardware Threads)

    Even the most aggressively brainiac OOO superscalar processor will still almost never exceed an average of about 2-3 instructions per cycle when running most mainstream, real-world software, due to a combination of load latencies, cache misses, branching and dependencies between instructions.

    Simultaneous multi-threading (SMT) is a processor design technique which exploits thread-level parallelism (other running programs, or other threads within the same program). The instructions come from multiple threads running at the same time, all on the one processor core. An SMT processor uses just one physical processor core to present two or more logical processors to the system. Separate units include the program counter, the architecturally-visible registers, the memory mappings held in the TLB, shared units include the decoders and dispatch logic, the functional units, and the caches. SMT is essentially a way to convert TLP into ILP.

    However, in practice, at least for desktops, laptops, tablets, phones and small servers, it is rarely the case that several different programs are actively executing at the same time, so it usually comes down to just the one task the machine is currently being used for. Some applications, such as database systems, image and video processing, audio processing, 3D graphics rendering and scientific code, do have obvious high-level (coarse-grained) parallelism available and easy to exploit, but many of these applications which are easy to parallelize are primarily limited by memory bandwidth, not by the processor.

    If one thread saturates just one functional unit which the other threads need, it effectively stalls all of the other threads, even if they only need relatively little use of that unit. Competition between the threads for cache space may produce worse results than letting just one thread have all the cache space available, particularly for software where the critical working set is highly cache-size sensitive, such as hardware simulators/emulators, virtual machines and high-quality video encoding.

    Due to above 3 reasons, SMT performance can actually be worse than single-thread performance (traditional context switching between threads) sometimes.

    More cores or Wider cores

    Very wide superscalar designs scale very badly in terms of both chip area and clock speed, so a single 10-issue core would actually be both larger and slower than two 5-issue cores:

    • the complex multiple-issue dispatch logic scales up as (issue width)^2
    • highly multi-ported register files and caches to service all those simultaneous accesses

    Today, a "typical" SMT design implies both a wide execution core and OOO execution logic, including multiple decoders, the large and complex superscalar dispatch logic and so on. For applications with lots of active but memory-latency-limited threads (database systems, 3D graphics rendering), more simple cores would be better because big/wide cores would spend most of their time waiting for memory anyway. For most applications, however, there simply are not enough threads active to make this viable, and the performance of just a single thread is much more important, so a design with fewer but bigger, wider, more brainiac cores is more appropriate.

    Intel's Xeon Haswell, the server version of Core i*4 Haswell, uses 5.7 billion transistors to provide 18 cores (up from 8 in Xeon Sandy Bridge), each a very aggressively brainiac 8-issue design (up from 6-issue in Sandy Bridge), each still with 2-thread SMT. IBM's POWER8 uses 4.4 billion transistors to move to a considerably more brainiac core design than POWER7, and at the same time provide 12 cores (up from 8 in POWER7), each with 8-thread SMT (up from 4 in POWER7).

    In the future we might see asymmetric designs, with one or two big, wide, brainiac cores plus a large number of smaller, narrower, simpler cores. IBM's Cell processor (used in the Sony PlayStation 3) was arguably the first such design, but unfortunately it suffered from severe programmability problems because the ISA incompatible between small cores and large main core and had limited by awkward access to main memory. Some modern ARM designs also use an asymmetric approach, with several large cores paired with one or a few smaller, simpler "companion" cores, to increase battery life.

    DLP (data-level parallelism)

    Rather than looking for ways to execute groups of instructions in parallel, the idea is to look for ways to make one instruction apply to a group of data values in parallel.

    SIMD Vector Instructions

    One of DLP methods called SIMD parallelism (single instruction, multiple data). More often, it's called vector processing. With some thought, a small set of vector instructions can enable some impressive speedups, such as packing/unpacking, byte shuffling, bit masking instructions, just like x86 Matrix Math Extensions (MMX), Streaming SIMD Extensions (SSE), and ongoing revisions of Advanced Vector Extensions (AVX). MMX provide 64-bit vectors, x86 SSE added 8 new 128-bit registers, then widened to 256 bits with AVX.

    Memory

    Memory Wall

    Latency is especially bad for loads from memory, which make up about a quarter of all instructions. Using a modern SDRAM with a CAS latency of 11, will typically be 24 cycles of the memory system bus, 1 to send the address to the DIMM (memory module), RAS-to-CAS delay of 11 for the row access, CAS latency of 11 for the column access, and a final 1 to send the first piece of data up to the processor (or E-cache). On a multi-processor system, even more bus cycles may be required to support cache coherency between the processors. There are the cycles within the processor itself, checking the various on-chip caches before the address even gets sent to the memory controller, accounting for 20 CPU cycles. For 2.4GHz processor and 800MHz SDRAM memory, summing up to (1+11+11+1) * 2400/800 + 20 = 92 CPU cycles, a 4.0 GHz processor would wait a staggering 140 cycles to access main memory. This problem of the large, and slowly growing, gap between the processor and main memory is called the memory wall.

    Caches

    Modern processors solve the problem of the memory wall with caches. A cache is a small but fast type of memory located on or near the processor chip. Its role is to keep faster copies of small pieces of main memory, L1 caches around 8-64K in size, L2 caches around 100K-10M in size, larger and slower L3 caches. A modern primary (L1) cache has a latency of just 2 to 4 processor cycles, with around 90% caches hit rates.

    The memory hierarchy of a modern desktop/laptop: Core i4 Haswell.

    LevelSizeLatency (cycles)Location
    L1 Cache32KB4inside each core
    L2 Cache256KB12beside each core
    L3 Cache6MB~21shared between all cores
    L4 E-Cache128MB~58separate eDRAM chip
    RAM8+GB~117SDRAM DIMMs on motherboard
    Swap100+GB10000+hard disk or SSD

    Cache Locality

    Temporal locality is exploited by merely keeping recently accessed data in the cache. To take advantage of spatial locality, data is transferred from main memory up into the cache in blocks of a few dozen bytes at a time, called a cache line.

    Cache Layout

    Using the virtual address might cause caches need to be flushed on every context switch (thrashing) (2 programs mapping a same virtual address to different physical address). Using the physical address means the V2N mapping must be performed, making every cache lookup slower. A common trick is to use virtual addresses for the cache indexing but physical addresses for the tags. The virtual-to-physical mapping (TLB lookup) can then be performed in parallel with the cache indexing so that it will be ready in time for the tag comparison. Such a scheme is called a virtually-indexed physically-tagged cache.

    Set-associative caches are able to avoid some unfortunate cache conflicts. Unfortunately, the more highly associative a cache is, the slower it is to access. The instruction L1 cache can afford to be highly set-associative (prefetching and buffering in pipeline), but the data L1 cache settled on 4-way set-associative as the sweet spot. The large L2/L3 cache (LLC for "last-level cache") is also usually highly associative, perhaps as much as 12- or 16-way. External E-cache is sometimes direct-mapped for flexibility of size and implementation.

    Memory Latency and Bandwidth

    Lower-latency designs will be better for pointer-chasing code, such as compilers and database systems. Bandwidth-oriented (adding more memory banks and making the busses wider) systems have the advantage for programs with simple, linear access patterns, such as image processing and scientific code.

    Latency is much harder to improve than bandwidth. Synchronously clocked DRAM (SDRAM) allowed pipelining of the memory system. This reduces effective latency because it allows a new memory access to be started before the current one has completed, while an asynchronous memory system had to wait for the transfer of half a cache line from the previous access before starting a new request.

    Distributed System

    • 小型机是专门设计的硬件和专门设计的软件,只面向这种规模(例如几百颗 CPU)的计算
    • 小型机是完全闭源的,不需要考虑扩展性,特定的几种硬件在稳定性上前进了一大步
    • x86 的 IO 性能被架构锁死了,各种总线、PCI、PCIe、USB、SATA、以太网,为了个人计算机的便利性,牺牲了很多的性能和可靠性
    • 小型机使用总线通信,可以实现极高的信息传递效率,极其有效的监控以及极高的故障隔离速度

    x86 服务器基于网络的分布式具有天然的缺陷:

    • 操作系统决定了网络性能不足
    • 网络需要使用事件驱动处理,比总线电路的延迟高几个数量级
    • PC 机的硬件不够可靠,故障率高
    • 很难有效监控,隔离故障速度慢

    Reference

    ',57);s.render=function(a,r,s,o,n,l){return e(),t("div",null,[i])};export default s;export{r as __pageData}; diff --git a/assets/computerScience_architecture_archBasicNotes.md.1ed20244.lean.js b/assets/computerScience_architecture_archBasicNotes.md.1ed20244.lean.js new file mode 100644 index 00000000000..e7054489a84 --- /dev/null +++ b/assets/computerScience_architecture_archBasicNotes.md.1ed20244.lean.js @@ -0,0 +1 @@ +import{o as e,c as t,a}from"./app.6dd2a1b7.js";const r='{"title":"Architecture Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"SuperPipeline and SuperScalar","slug":"superpipeline-and-superscalar"},{"level":3,"title":"Instructions Dependencies and Latencies","slug":"instructions-dependencies-and-latencies"},{"level":3,"title":"Branch Prediction","slug":"branch-prediction"},{"level":2,"title":"VLIW (Very Long Instruction Word)","slug":"vliw-very-long-instruction-word"},{"level":2,"title":"Out of Order Execution (OoO or OoE)","slug":"out-of-order-execution-ooo-or-ooe"},{"level":3,"title":"The Brainiac vs Speed-demon Debate","slug":"the-brainiac-vs-speed-demon-debate"},{"level":3,"title":"Power Wall and ILP Wall","slug":"power-wall-and-ilp-wall"},{"level":3,"title":"Decoupled x86 microarchitecture","slug":"decoupled-x86-microarchitecture"},{"level":2,"title":"SMT (Hardware Threads)","slug":"smt-hardware-threads"},{"level":3,"title":"More cores or Wider cores","slug":"more-cores-or-wider-cores"},{"level":2,"title":"DLP (data-level parallelism)","slug":"dlp-data-level-parallelism"},{"level":3,"title":"SIMD Vector Instructions","slug":"simd-vector-instructions"},{"level":2,"title":"Memory","slug":"memory"},{"level":3,"title":"Memory Wall","slug":"memory-wall"},{"level":3,"title":"Caches","slug":"caches"},{"level":3,"title":"Memory Latency and Bandwidth","slug":"memory-latency-and-bandwidth"},{"level":2,"title":"Distributed System","slug":"distributed-system"},{"level":2,"title":"Reference","slug":"reference"}],"relativePath":"computerScience/architecture/archBasicNotes.md","lastUpdated":1627194884000}',s={},i=a('',57);s.render=function(a,r,s,o,n,l){return e(),t("div",null,[i])};export default s;export{r as __pageData}; diff --git a/assets/computerScience_architecture_graphProcessingBasicNotes.md.e60be5c5.js b/assets/computerScience_architecture_graphProcessingBasicNotes.md.e60be5c5.js new file mode 100644 index 00000000000..01b3a1d5959 --- /dev/null +++ b/assets/computerScience_architecture_graphProcessingBasicNotes.md.e60be5c5.js @@ -0,0 +1 @@ +import{o as e,c as a,a as t}from"./app.6dd2a1b7.js";const r='{"title":"Graph Processing Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Graph System","slug":"graph-system"},{"level":2,"title":"NUMA Architecture","slug":"numa-architecture"},{"level":3,"title":"CPU Schedule","slug":"cpu-schedule"},{"level":3,"title":"Memory Schedule","slug":"memory-schedule"},{"level":2,"title":"Dataset","slug":"dataset"},{"level":2,"title":"Tools","slug":"tools"},{"level":3,"title":"Concurrency Lib","slug":"concurrency-lib"},{"level":3,"title":"Perf Tools","slug":"perf-tools"},{"level":3,"title":"Hardware Performance Counter","slug":"hardware-performance-counter"},{"level":3,"title":"Parallel Programming","slug":"parallel-programming"},{"level":3,"title":"Other Libs","slug":"other-libs"},{"level":3,"title":"DRAMSim2","slug":"dramsim2"},{"level":3,"title":"GCC","slug":"gcc"},{"level":3,"title":"Time Stamp Counter","slug":"time-stamp-counter"},{"level":3,"title":"NUMA Tool","slug":"numa-tool"}],"relativePath":"computerScience/architecture/graphProcessingBasicNotes.md","lastUpdated":1627194884000}',n={},s=t('

    Graph Processing Basic Notes

    Graph System

    ClassificationIn-memoryOut-of-core
    Single machineLigraGraphChi
    PolymerX-Stream
    GaloisGridGraph
    Mosaic
    DistributedPregelChaos
    PowerGraph
    PowerLyra
    Gemini

    NUMA Architecture

    引入了 Node 和 Distance:

    • 对于 CPU 和 Memory 这两种最宝贵的硬件资源, NUMA 用近乎严格的方式划分了所属的资源组 (Node), 而每个资源组内的 CPU 和 Memory 几乎相等
    • 资源组的数量取决于物理 CPU 的个数
    • Distance 用来定义各个 Node 之间调用资源的开销, 为资源调度优化算法提供数据支持

    每个进程(或线程)都会从父进程继承 NUMA 策略, 并分配有一个优先 node. 如果 NUMA 策略允许的话,进程可以调用其他 node 上的资源.

    CPU Schedule

    • CPU Node Bind: 规定进程运行在某几个 node 之上
    • Physical CPU Bind: 精细地规定进程运行在哪些核上

    Memory Schedule

    • Local Allocation: 从当前 Node 上请求分配内存
    • Preferred: 比较宽松地指定了一个推荐的 node 来获取内存, 如果被推荐的 node 上没有足够内存, 进程可以尝试别的 node
    • Memory Bind: 可以指定若干个 node,进 程只能从这些指定的 node 上请求分配内存
    • Interleave: 规定进程从指定的若干个 node 上以 RR (Round Robin) 交织地请求分配内存

    NUMA 默认的内存分配策略是优先在进程所在 CPU 的本地内存中分配, 会导致 CPU 节点之间内存分配不均衡. 当某个 CPU 节点的内存不足时, 会导致 swap 产生, 而不是从远程节点分配内存, 这就是 swap insanity 现象

    Dataset

    Tools

    Concurrency Lib

    Perf Tools

    Hardware Performance Counter

    Parallel Programming

    Other Libs

    DRAMSim2

    GCC

    strict-alias warnings

    for strict-aliasing warnings:

    1. use a union to represent the memory need to reinterpret
    2. use a reinterpret_cast, cast via char * at the point where reinterpret the memory - char * are defined as being able to alias anything
    3. use a type which has __attribute__((__may_alias__))
    4. turn off the aliasing assumptions globally using -fno-strict-aliasing

    Time Stamp Counter

    RDTSC

    Clock Get Time

    gcc *.c -o *.o ... -lrt # link with librt\n
    1
    #include <time.h>\n\nstruct timespec ts;\nclock_gettime(CLOCK_MONOTONIC, ts);\nprintf("%d %d", ts.tv_sec, ts.tv_nsec);\n
    1
    2
    3
    4
    5

    NUMA Tool

    grep -i numa /var/log/dmesg\n
    1

    NUMA Control

    installation
    sudo apt install -y numactl\n
    1
    usage
    numactl --show\nnumactl --hardware\nnumactl --interleave=all\n
    1
    2
    3

    NUMA Status

    numastat\n
    1
    ',47);n.render=function(t,r,n,l,i,o){return e(),a("div",null,[s])};export default n;export{r as __pageData}; diff --git a/assets/computerScience_architecture_graphProcessingBasicNotes.md.e60be5c5.lean.js b/assets/computerScience_architecture_graphProcessingBasicNotes.md.e60be5c5.lean.js new file mode 100644 index 00000000000..069812ef82e --- /dev/null +++ b/assets/computerScience_architecture_graphProcessingBasicNotes.md.e60be5c5.lean.js @@ -0,0 +1 @@ +import{o as e,c as a,a as t}from"./app.6dd2a1b7.js";const r='{"title":"Graph Processing Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Graph System","slug":"graph-system"},{"level":2,"title":"NUMA Architecture","slug":"numa-architecture"},{"level":3,"title":"CPU Schedule","slug":"cpu-schedule"},{"level":3,"title":"Memory Schedule","slug":"memory-schedule"},{"level":2,"title":"Dataset","slug":"dataset"},{"level":2,"title":"Tools","slug":"tools"},{"level":3,"title":"Concurrency Lib","slug":"concurrency-lib"},{"level":3,"title":"Perf Tools","slug":"perf-tools"},{"level":3,"title":"Hardware Performance Counter","slug":"hardware-performance-counter"},{"level":3,"title":"Parallel Programming","slug":"parallel-programming"},{"level":3,"title":"Other Libs","slug":"other-libs"},{"level":3,"title":"DRAMSim2","slug":"dramsim2"},{"level":3,"title":"GCC","slug":"gcc"},{"level":3,"title":"Time Stamp Counter","slug":"time-stamp-counter"},{"level":3,"title":"NUMA Tool","slug":"numa-tool"}],"relativePath":"computerScience/architecture/graphProcessingBasicNotes.md","lastUpdated":1627194884000}',n={},s=t('',47);n.render=function(t,r,n,l,i,o){return e(),a("div",null,[s])};export default n;export{r as __pageData}; diff --git a/assets/computerScience_compilers_compilersBasicNotes.md.5ebb309b.js b/assets/computerScience_compilers_compilersBasicNotes.md.5ebb309b.js new file mode 100644 index 00000000000..26ead80fe2a --- /dev/null +++ b/assets/computerScience_compilers_compilersBasicNotes.md.5ebb309b.js @@ -0,0 +1 @@ +import{o as n,c as s,a}from"./app.6dd2a1b7.js";const p='{"title":"Compiler Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Basic Concepts","slug":"basic-concepts"},{"level":3,"title":"Definition of compilers","slug":"definition-of-compilers"},{"level":3,"title":"Structure of compilers","slug":"structure-of-compilers"},{"level":2,"title":"文法与语言","slug":"文法与语言"},{"level":3,"title":"符号与符号串","slug":"符号与符号串"},{"level":3,"title":"文法与语言的形式化表示","slug":"文法与语言的形式化表示"},{"level":3,"title":"乔姆斯基文法体系","slug":"乔姆斯基文法体系"},{"level":3,"title":"上下文无关文法","slug":"上下文无关文法"},{"level":3,"title":"正规文法","slug":"正规文法"},{"level":3,"title":"正则语言(Regular Expressions)","slug":"正则语言-regular-expressions"},{"level":3,"title":"分析树","slug":"分析树"},{"level":3,"title":"文法规则","slug":"文法规则"},{"level":2,"title":"Lexical Analysis","slug":"lexical-analysis"},{"level":3,"title":"Tokenizer - 词法分析器","slug":"tokenizer-词法分析器"},{"level":3,"title":"有限状态自动机(Finite Automaton)","slug":"有限状态自动机-finite-automaton"},{"level":3,"title":"自动词法分析器","slug":"自动词法分析器"},{"level":2,"title":"Syntax Analysis(语法分析)","slug":"syntax-analysis-语法分析"},{"level":3,"title":"自顶向下分析","slug":"自顶向下分析"},{"level":3,"title":"自底向上分析","slug":"自底向上分析"},{"level":3,"title":"抽象语法树","slug":"抽象语法树"},{"level":2,"title":"Semantic Analysis(语义分析)","slug":"semantic-analysis-语义分析"},{"level":3,"title":"类型系统(type system)","slug":"类型系统-type-system"},{"level":3,"title":"符号表(上下文相关)","slug":"符号表-上下文相关"},{"level":3,"title":"类型检查","slug":"类型检查"},{"level":3,"title":"作用域检查","slug":"作用域检查"},{"level":3,"title":"类型相容性","slug":"类型相容性"},{"level":3,"title":"错误诊断","slug":"错误诊断"},{"level":2,"title":"Immediate Representation","slug":"immediate-representation"},{"level":3,"title":"三地址码","slug":"三地址码"},{"level":3,"title":"控制流图","slug":"控制流图"},{"level":2,"title":"代码优化","slug":"代码优化"},{"level":3,"title":"组织管理","slug":"组织管理"},{"level":3,"title":"优化类型","slug":"优化类型"},{"level":3,"title":"局部优化","slug":"局部优化"},{"level":3,"title":"全局优化","slug":"全局优化"},{"level":2,"title":"Code Generation(代码生成)","slug":"code-generation-代码生成"},{"level":3,"title":"递归下降代码生成算法","slug":"递归下降代码生成算法"},{"level":2,"title":"Garbage Collection","slug":"garbage-collection"},{"level":3,"title":"Mark and Sweep","slug":"mark-and-sweep"},{"level":3,"title":"Stop and Copy","slug":"stop-and-copy"},{"level":2,"title":"Compilers Exercise","slug":"compilers-exercise"},{"level":3,"title":"C Declaration Interpreter","slug":"c-declaration-interpreter"},{"level":3,"title":"Cool Language","slug":"cool-language"},{"level":3,"title":"Parser Implementation","slug":"parser-implementation"}],"relativePath":"computerScience/compilers/compilersBasicNotes.md","lastUpdated":1627194884000}',t={},e=a('

    Compiler Basic Notes

    Basic Concepts

    Definition of compilers

    • program_code ---compiler---> executable
    • data ---executable---> output

    e.g Fortran(formula translation) 1 project

    Structure of compilers

    front-end to back-end:

    • front-end: src ---lexical analysis---> tokens ---parsing/syntax analysis---> AST(Abstract Syntax Tree) ---semantic analysis---> intermediate
    • back-end: intermediate ---...---> ... ---...---> ... ---code generation---> dist

    details:

    • lexical analysis(词法分析)
    • parsing/syntax analysis(语法分析)
    • semantic analysis(语义分析): type and scope
    • optimization
    • code generation: translate to other high level language/assembly code/machine code

    文法与语言

    符号与符号串

    • 字母表/符号集: 元素的非空有穷集合
    • 符号串: 字母表中的符号组成的任何有穷序列
    • 固有头/尾: 非空首/尾子串
    • 闭包: Σ* = Σ0 U Σ1 U ... U Σn ...
    • 正闭包: Σ* = Σ1 U ... U Σn ...

    文法与语言的形式化表示

    • 文法(Grammar) G = (Vn, Vt, P, S) - 非终结符集, 终结符集, 规则/产生式集, 开始符号
    • 语言(Language) L(G) = {x | S -> x, x <- Vt} 文法 G 一切句子的集合
    • 句型: rhs of P, 句子: 不含非终结符的右部
    • 直接推导: v -> w, 闭包推导: v -*> w, 正闭包推导: v -+> w

    乔姆斯基文法体系

    • ((((3)2)1)0)
    • 0 型文法: 任意文法
    • 1 型文法: 上下文有关文法(context sensitive) αAβ -> αηβ
    • 2 型文法(语法工具): 上下文无关文法 A -> α
    • 3 型文法(词法工具): 正规文法

    上下文无关文法

    文法表示

    G = (S, N, T, P):

    • S: 开始符
    • N: 非终结符集合
    • T: 终结符集合
    • P: 产生式规则集合 X -> beta1, beta2, ..., betaN, X <- N, beta <- N+T

    形式化表示

    简易表示
    Sentence -> Noun Verb Noun\nNoun -> sheep\n  | tiger\n  | grass\n  | water\nVerb -> eat\n  | drink\n
    1
    2
    3
    4
    5
    6
    7

    S: Sentence, N: Sentence/Verb/Noun, T: sheep/tiger/grass/water/eat/drink

    E -> num\n  |id\n  |E + E\n  |E `*` E\n
    1
    2
    3
    4

    S: E, N: E, T: num/id/+/*

    巴科斯范式

    Backus-Naur Form:

    • ::= : "被定义为"
    • "word" : 字符本身
    • 双引号外的字 : 语法部分
    • 尖括号( < > ) : 必选项(非终结符)
    • 方括号( [ ] ) : 0/1
    • 大括号( { } ) : 0/n
    • 竖线( | ) : "OR"

    正规文法

    正规文法可与正则语言相互转化:

    • A -> aB|Ba
    • A -> a

    正则语言(Regular Expressions)

    基本定义

    对于给定的字符集 C:

    • 空串 "\\0" 是正则表达式
    • 任意 char <- C 是正则表达式
    • 若 M, N 是正则表达式, 则 M|N = {M, N}, MN = {mn|m <- M, n <- N}, M* = {"\\0", M, MM, MMM, ...} (选择/连接/闭包)也是正则表达式

    形式表示

    // 具有顺序性\ne -> "\\0" // basic definition\n  | c // basic definition\n  | e | e // recursive definition\n  | ee // recursive definition\n  | e* // recursive definition\n
    1
    2
    3
    4
    5
    6

    正则语法糖(Syntax Sugar)

    • [a-z] : a|...|z
    • c? : 0/1 个 c
    • c+ : 1/n 个 c
    • c{i, j} : i-j 个 c
    • "a*" : a* 自身(非 Kleene Closure)
    • . : 除 ‘\\n’ 外的任意字符
    // 标识符\n[a-zA-Z\\_][a-zA-Z\\_0-9]*\n\n// decimal integer\n(+|-)?(0|[1-9][0-9]*)\n\n// decimal float\n(+|-)?(0|[1-9][0-9]*|)?\\.[0-9]+\n
    1
    2
    3
    4
    5
    6
    7
    8

    分析树

    进行文法推导时生成的树:

    • 根 : 开始符
    • 内部结点 : 非终结符
    • 叶子结点 : 终结符
    • 层 : 一步推导(优先级影响推导顺序)
    • 叶子结点串: 最终表达式
    • 后序遍历 : 最终结果

    推导类型

    • 最左推导(leftmost)
    • 最右推导(rightmost)(规范推导)

    句型分析

    • 短语: 若 S -*> Aβ, A -+> α, 则称 α 是句型 αβ 相对于非终结符 A 的短语
    • 直接短语: S -*> Aβ, A -> α
    • 一个右句型的直接短语称为该句型的句柄(用于自下而上的归约分析)
    • 最左归约: 归约最左的句柄, 最右归约: 归约最右的句柄

    meaning function(多对一)

    L(syntax) = semantic: 多个语法对应一个语义(不同形式的表达式对应同一个意思)

    二义性文法(一对多)

    • 最左推导与最右推导得出的分析树不一致
    • 若给定文法 G, 对于句子 s, 其有 2 种不同的分析树, 则称 G 是二义性文法
    • 若一个上下文无关语言的所有文法都是二义性文法, 则称此语言是先天二义语言
    文法重写
    E -> E + T\n  |T\nT -> T * F\n  |F\nF -> num\n  |id\n
    1
    2
    3
    4
    5
    6

    消除 + 与 * 的二义性, 如 3+4*5

    优先级与结合性

    声明优先级与结合性可在一定程度上消除文法的二义性

    文法规则

    • 有害规则: 使文法产生二义性的规则
    • 多余规则: 不可达/不可终止的规则
    • 2 型文法的 ε 规则: 当语言中不含有 ε 符号串, 则一定存在终结符集不含有 ε 的等价文法(代入法消除 ε)
    • 保证非终结符 A 的有效性: S -*> αAβ, A -+> t

    Lexical Analysis

    Tokenizer - 词法分析器

    • Maximal match
    • Higher priority match

    转移图算法

    token nextToken(void) {\n  char c = getChar();\n  switch(c) {\n    case '<':\n      c = getChar();\n      switch (c) {\n        case '=':\n          return LE;\n        case '>':\n          return NE;\n        default:\n          rollback();\n          return LT;\n      }\n\n    case '=':\n      return EQ;\n    case '>':\n      c = getChar();\n      switch (c) {\n        case '=':\n          return GE;\n        case '<':\n          return NE;\n        default:\n          rollback();\n          return GT;\n      }\n  }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30

    关键字(keyword)处理

    • 根据 完美哈希算法(无冲突哈希函数) , 建立所有关键字对应的关键字完美哈希表
    • 读入有效标识符(字符串型)后, 查询关键字哈希表, 检查当前标识符是否为关键字
    #define KEYWORD_MAX_LEN 10\n\nhash_one(char *str, int len) {\n    unsigned int keyValue = 0;\n\n    for (int i = 0; i < len; i++) {\n        keyValue += str[i] * ((int)pow(33, len - i));\n    }\n\n    keyValue = (keyValue * 3 + 7) % KEYWORD_MAX_LEN;\n  return keyValue;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #define KEYWORD_HASH_SEED 131\n\nhash_two(char *str, int len) {\n  unsigned int keyValue = 0,\n           hash = 0;\n\n    for (int i = 0; i < len; i++) {\n        hash = hash * KEYWORD_HASH_SEED + str[i];\n    }\n\n    keyValue = hash & 0x7fffffff;\n    return keyValue;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    有限状态自动机(Finite Automaton)

    确定有限状态自动机(Deterministic Finite Automaton)

    • Only a transition for a state with a input
    • No epsilon moves

    M = (AlphaSet/InputSet, StateSet, currentState, FiniteStateSet, transferFunction)

    A = {a, b}, SS = {0, 1, 2}, cS = 0, FS = {2},\ntransferFunction = {\n  (cS0, a) -> cS1, (cS0, b) -> cS0,\n  (cS1, a) -> cS2, (cS1, b) -> cS1,\n  (cS2, a) -> cS2, (cS2, b) -> cS2,\n}\n
    1
    2
    3
    4
    5
    6
    状态转移表实现 DFA
    状态\\字符ab
    010
    121
    222

    非确定有限状态自动机(Nondeterministic Finite Automaton)

    transferFunction 中的次态不确定/不唯一(为一个开集合):

    • Multiple transitions for a state with a input
    • can epsilon moves

    (cS0, a) -> {cS1, cS2}

    自动词法分析器

    RegExp --Thompson 算法--> NFA --子集构造算法--> DFA --Hopcroft 最小化算法--> 词法分析器代码

    Thompson 算法

    RegExp --> NFA:

    • 直接构造基本 RegExp
    • 递归构造复合 RegExp
    • epsilon : i --epsilon--> f
    • RegExp : i --NFA(RegExp)--> f
    • 选择 : i --NFA(RegExp1)--> f, i --NFA(RegExp2)--> f
    • 连接 : i --NFA(RegExp1)--> m --NFA(RegExp2)--> f
    • 闭包 : i --epsilon--> m --epsilon--> f, m --RegExp--> m

    子集构造算法

    NFA --> DFA:

    由 Thompson 算法生成的 NFA, 当且仅当输入为 epsilon 时, 次态不唯一

    • 将所有可达到次态作为一个集合 s, 视为单一次态 s
    • delta(Sigma) + epsilon-closure(深度/广度优先遍历找寻可达到次态边界)
    DFA subset_construction(NFA nfa) {\n  s0 = eps_closure(n0);\n\n  StateSet += s0;\n  enqueue(s0);\n\n  while (work_queue != []) {\n    dequeue(s);\n\n    foreach (ch in InputSet) {\n      next_state = eps_closure(delta(s, ch));\n      Fn[s, ch] = next_state;  // DFA 中的转移函数\n\n      if (next_state not in StateSet) {\n        StateSet += next_state;\n        enqueue(next_state);\n      }\n    }\n  }\n\n  return DFA(StateSet, Fn);\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22

    Hopcroft 算法

    最小化 DFA(数字逻辑中的最简状态表), 合并等价状态(等价类)

    split(StateSet S) {\n  foreach (char ch) {\n    if (ch can split S) {\n      split S into S1, ..., Sk;\n    }\n  }\n}\n\nhopcroft(DFA) {\n  split all nodes into InitStateSet and FiniteStateSet (Two State Sets);\n\n  while (set is still changes) {\n    split(S);\n  }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    实现

    DFA
    有向图
    转移表
    • 行: 现态
    • 列: 输入
    • 值: 次态/ERROR/-1

    驱动代码: table 用于实现 switch/case, stack 用于实现最长匹配

    next_token() {\n  state = 0;\n  stack = [];\n\n  while (state != ERROR) {\n    c = getChar();\n\n    if (state is ACCEPT/FINITE) {\n      clear(stack);\n    }\n\n    push(state);\n    state = table[state][c];\n  }\n\n  while (state is not ACCEPT/FINITE) {\n    state = pop();\n    rollback();\n  }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    Syntax Analysis(语法分析)

    Tokens + Grammar --Syntax Analysis--> AST(Abstract Syntax Tree)

    自顶向下分析

    • 从开始符号出发推导任意句子 t, 与给定句子 s 进行比较分析
    • 利用分析树进行逐叶子匹配, 若匹配失败则进行回溯
    bool top_down_parsing(tokens[]) {\n  i = 0;\n  stack = [S];\n\n  while (stack != []) {\n    if (stack[top] is a terminal t) {\n      t == tokens[i] ? pop(i++) : backtrack();\n    } else if (stack[top] is a non_terminal T) {\n      pop();\n      push(T next expansion); // 自右向左压栈, e.g pop(S), push(N_right), push(V), push(N_left)\n    } else {\n      throw new SyntaxError();\n    }\n  }\n\n  return i >= tokens.length && is_empty(stack) ? true : false;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

    避免回溯

    利用前看符号避免回溯

    Sentence -> Noun Verb Noun\nNoun -> sheep\n  | tiger\n  | grass\n  | water\nVerb -> eat\n  | drink\n
    1
    2
    3
    4
    5
    6
    7

    tiger eat water: 向前看非终结符推导出的所有终结符中匹配 tiger 的终结符; 不向前看,则先推导 N, 再推导 n, 但 n 不一定匹配 tiger, 则需进行回溯; 向前看一个字符, 直接推导 N --> n, 同时直接找寻匹配 tiger 的终结符

    S -> N V N\nN -> (sheep)tiger\nV -> eat\nN -> (sheep-tiger-grass)water\n
    1
    2
    3
    4

    递归下降分析算法(Recursive Descent/预测分析算法)

    • 分治算法: 每个非终结符构造一个分析函数
    • 前看符号: 用前看符号指导产生式规则的选择(expansion)
    parse_S(tokens[]) {\n  parse_N(tokens[0]);\n  parse_V(tokens[1]);\n  parse_N(tokens[2]);\n}\n\nparse_N(token) {\n  if (token == s|t|g|w) {\n    return true;\n  } else {\n    throw new SyntaxError();\n  }\n}\n\nparse_V(token) {\n  if (token == e|d) {\n    return true;\n  } else {\n    throw new SyntaxError();\n  }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    算法实现
    • tip one: use save pointer to implement roll back
    • tip two: use logical OR expression to replace nested if-else structure
    bool term(TOKEN tok) {\n    return *next++ == tok;\n}\n\nbool E1(void) {\n    return T();\n}\n\nbool E2(void) {\n    return T()\n        && term(PLUS)\n        && E();\n}\n\nbool E(void) {\n    // roll back pointer\n    TOKEN *save = next;\n\n    return (next = save, E1())\n        || (next = save, E2());\n}\n\nbool T1(void) {\n    return term(INT);\n}\n\nbool T2(void) {\n    return term(INT)\n        && term(TIMES)\n        && T();\n}\n\nbool T3(void) {\n    return term(OPEN)\n        && E()\n        && term(CLOSE);\n}\n\nbool T(void) {\n    // roll back pointer\n    TOKEN *save = next;\n\n    return (next = save, T1())\n        || (next = save, T2())\n        || (next = save, T3());\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    // X -> a\n//  | XX\n//  | aXXX\n//  | aXXXXb\nparse_X() {\n  token = nextToken();\n\n  switch (token) {\n    case ...: // i: token == atom_char or parse_XX();\n    case ...: // j: token == atom_char, token = nextToken(), parse_XXX();\n    // k: token == atom_char, token = nextToken(),\n    // parse_XXXX(), token=nextToken(), token == b\n    case ...:\n    default: throw new SyntaxError();\n  }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

    LL(1)分析算法

    • 从左(L)向右读入程序(left to right scan)
    • 最左(L)推导: 优先推导最左侧非终结符(leftmost derivation)
    • 一个(1)前看符号(look ahead)
    • 分治算法: 每个非终结符构造一个first set 和一个 follow set, 最后为每个规则构造一个 select set
    • 分析表驱动(由 first sets/follow sets/select sets 推导分析表)
    bool ll1_parsing(tokens[]) {\n  i = 0;\n  stack = [S];\n\n  while (stack != []) {\n    if (stack[top] is a terminal t) {\n      t == tokens[i] ? pop(i++) : throw new SyntaxError();\n    } else if (stack[top] is a non_terminal T) {\n      pop();\n      // push(T correct expansion);\n      // 自右向左压栈, e.g pop(S), push(N_right), push(V), push(N_left)\n      push(select_table[T][tokens[i]] 对应项(规则编号)所对应规则的右边式子);\n    } else {\n      throw new SyntaxError();\n    }\n  }\n\n  return i >= tokens.length && is_empty(stack) ? true : false;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    nullable sets
    • 存在规则: X -> epsilon
    • 或者 : X -> Y1Y2...Yn, 且存在规则 Y1 -> epsilon, ..., Yn -> epsilon
    • 即 : X -*> epsilon (epsilon <- first(X))
    nullable = {};\n\nwhile (nullable is still changing) {\n  foreach (production p: X -> beta) {\n    if ((beta == epsilon) || (beta == Y1...Yn\n      && Y1 <- nullable && ... && Yn <- nullable)) {\n      nullable += X;\n    }\n  }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    first sets

    first(X) = {t | X -> talpha} U {epsilon | X->epsilon} :

    • first(t) = {t}
    • epsilon<-first(X): X -> epsilon or X -> A1...An, epsilon<-first(Ai)
    • first(alpha)<-first(X): X -> A1..Analpha, epsilon<-first(Ai)

    first sets 不动点算法:

    foreach (non_terminal N) {\n  first(N) = {};\n}\n\nwhile (some sets is changing) {\n  foreach (production p: N->beta1...beta_n) {\n    foreach (beta_i from beta1 up to beta_n) {\n      if (beta_i == a) {\n      // e.g N->abX: first(N) += {a}\n        first(N) += {a};\n        break;\n      } else if (beta_i == M) {\n        first(N) += first(M);\n        if (M is not in nullable) {\n          break;\n        } // else continue this loop to add first(beta_next) into first(N)\n      }\n    }\n  }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    NonTerminalFirst Set
    S{s, t, g, w}
    N{s, t, g, w}
    V{e, d}
    follow sets

    follow(X) = {t | S -*> beta X t epsilon} :

    • for X -> AB:
      • first(B) <- follow(A), follow(X) <- follow(B)
      • if B -*> epsilon: follow(X) <- follow(A)
    • A -> alpha X beta: first(beta) - {epsilon} <- follow(X)
    • $ <- follow(S)

    follow sets 不动点算法:

    foreach (non_terminal N) {\n  follow(N) = {};\n}\n\nwhile (some sets is changing) {\n  foreach (production p: N->beta1...beta_n) {\n\n        // temp: follow(left) <- follow(right)\n    temp = follow(N);\n\n    foreach (beta_i from beta_n down to beta1) {\n      if (beta_i == a) {\n        temp = {a};\n      } else if (beta_i == M) {\n        follow(M) += temp\n        temp = (M is not nullable) ? (first(M)) : (temp + first(M))\n      }\n    }\n  }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    select sets
    • 当 N -> Y1...Yn 右边 Y 全为 nullable 时, select(p) += follow(N)

    select sets 不动点算法:

    foreach (production p) {\n  select(p) = {}\n}\n\ncalculate_select_set(production p: N->beta1...beta_n) {\n  foreach (beta_i from beta1 up to beta_n) {\n    if (beta_i == a) {\n      select(p) += {a};\n      break;\n    } else if (beta_i == M) {\n      select(p) += first(M);\n      if (M is not in nullable) {\n        break;\n      }\n    }\n  }\n\n  // all betas are in nullable (当前规则的所有右边符号都是可空集)\n  // 故, select(p) 必须包括 follow(M) (当推导出右边符号都为空时, first(p) 即为 follow(M))\n  if (i > n) {\n    first(N) += follow(N);\n  }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    分析表
    • 结合 nullable sets 准确求出 first sets
    • 再利用 first sets 准确求出 follow sets
    • 再利用 first sets, 并结合 follow sets(全空集修正) 准确求出 分析表:
    0: z -> d\n1: | X Y Z\n2: Y -> c\n3: |\n4: X -> Y\n5: | a\n
    1
    2
    3
    4
    5
    6

    nullable = {X, Y}

    XYZ
    first{a, c}{c}{a, c, d}
    follow{a, c, d}{a, c, d}{}
    production012345
    select{d}{a, c, d}{c}{a, c, d}{a, c, d}{a}

    |Non\\Terminal|a|c|d| |Z|1|1|0, 1| |Y|3|2, 3|3| |X|4, 5|4|4|

    数字为规则编号

    解决冲突(分析表某项有多个编号)

    通过文法重写消除左递归, 使文法适应 L(最左推导):

    • 改写成右递归文法
    • 规定优先级与结合性
    • 提取左公因式(Common Prefix)
    E -> T+E\n    |T\n\nE -> TX\nX -> +E\n    |epsilon\n
    1
    2
    3
    4
    5
    6
    消除直接左递归
    S -> Salpha1\n    |Salpha2\n    ...\n    |Salpha_n\n    |beta1\n    |beta2\n    ...\n    |beta_m\n\nS -> beta1S'\n    |beta2S'\n    ...\n    |beta_nS'\nS'-> alpha1S'\n    |alpha2S'\n    ...\n    |alpha_nS'\n    |epsilon\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    消除间接左递归
    • 把文法 G 的所有非终结符按任一顺序排列, e.g A1, A2, …, An
    • 消除 Ai 规则中的直接左递归: 把形如 Ai→Ajγ 的产生式 改写成 Ai→δ1γ /δ2γ /…/δkγ(其中 Aj→δ1 /δ2 /…/δk 是关于的 Aj 全部规则)
    • 去掉多余的规则(不可达规则)
    #include <iostream>\n#include <string>\n#include <fstream>\n\nusing namespace std;\n\nstruct WF {\n    string left; //定义产生式的左部\n    string right; //定义产生式的右部\n};\n\n/*\n * count: number of non-terminal symbols\n */\nvoid Removing(WF *p,char *q,int n,int count) {\n\n    int count1 = n;\n    int flag = 0;\n\n  // 判断第一个非终结符是否存在直接左递归 if(p[i].left[0]==q[0])\n    for (int i = 0; i < n; i++) {\n        if (p[i].left[0] == p[i].right[0]) {\n            flag++;\n        }\n    }\n\n  // 如果存在直接左递归则消除直接左递归\n    if (flag != 0)\n    {\n        for (int i = 0; i < n; i++) {\n            if (p[i].left[0] == q[0]) {\n                if (p[i].left[0] == p[i].right[0]) {\n                  string str;\n                    str = p[i].right.substr(1,int (p[i].right.length())); // 取右部第二位开始的字串赋给str\n\n                    // E->E+T => E'->+TE'\n                    string temp = p[i].left;\n                    string temp1 = "'";\n                    p[i].left = temp+temp1;\n                    p[i].right = str+p[i].left;\n                } else {\n                    // E->T => E->TE'\n                    string temp=p[i].left;\n                    string temp1="'";\n                    temp=temp+temp1;\n                    p[i].right=p[i].right+temp;\n                }\n            }\n        }\n\n        string str="'";\n        p[count1].left=p[0].left[0]+str;\n        p[count1].right="ε";\n    }\n\n\n  // 对每一个非终结符迭代\n    for ( int i = 0; i <= count; i++) {\n\n      // 对每一个小于 i 的非终结符\n        for (int j = 0; j < i; j++) {\n\n          // 对每一个产生式\n            for (int g = 0; g < n; g++) {\n\n              // i 非终结符与第 g 产生式左边第一个字母相等\n                if (q[i] == p[g].left[0]) {\n\n          // g 产生式右边产生式第一个符号与第 j 个非终结符相等\n                    if (p[g].right[0] == q[j]) {\n                        for (int h = 0; h < n*n; h++) {\n                            if (p[h].left[0] == q[j]\n                              && int (p[h].left.length()) == 1) {\n                                string str;\n                                str = p[g].right.substr(\n                                  1,\n                                  int (p[g].right.length ()));\n                                p[++count1].left = p[g].left;\n                                p[count1].right = p[h].right + str;\n                            }\n                        }\n\n                        p[g].left="";\n                        p[g].right="";\n                    }\n                }\n            }\n        }\n    }\n\n  // 去除间接递归产生式\n    for(int i = 0; i <= count; i++) {\n        flag = 0;\n\n        for (int j = 0; j < n*n; j++) {\n            if (p[j].left[0] == q[i]) {\n                if(p[j].left[0] == p[j].right[0]) {\n                    flag++;\n                }\n            }\n        }\n\n        if (flag != 0) {\n            for (int j = 0; j <= n*n; j++) {\n                if (p[j].left[0] == q[i]) {\n                    if (p[j].left[0] == p[j].right[0]) {\n                        string str;\n                        str = p[j].right.substr(1,int (p[j].right.length()));\n                        string temp = p[j].left;\n                        string temp1 = "'";\n                        p[j].left = temp + temp1;\n                        p[j].right = str + p[j].left;\n                    } else {\n                        string temp = p[j].left;\n                        string temp1 = "'";\n                        temp = temp + temp1;\n                        p[j].right = p[j].right + temp;\n                    }\n                }\n            }\n\n            string str = "'";\n            p[++count1].left = q[i] + str;\n            p[count1].right = "ε";\n        }\n    }\n}\n\nint Delete(WF *p,int n) {\n    return 0;\n}\n\nint main() {\n    ofstream OutFile("result.txt");\n\n    int i,\n      j,\n      flag = 0,\n      count = 1,\n      n;\n\n    cout<<"请输入文法产生式个数n:"<<endl;\n    cin>>n;\n    WF *p=new WF[50];\n    cout<<"请输入文法的个产生式:"<<endl;\n\n  // input productions\n    for (i = 0; i < n; i++) {\n        cin>>p[i].left;\n        cout<<"->"<<endl;\n        cin>>p[i].right;\n        cout<<endl;\n    }\n    cout<<endl;\n    OutFile<<"即输入的文法产生式为:"<<endl;\n\n    // cout<<"即输入的文法产生式为:"<<endl;\n    for (i = 0; i < n; i++) {\n        // cout<<p[i].left<<"-->"<<p[i].right<<endl;\n        OutFile<<p[i].left<<"-->"<<p[i].right<<endl;\n    }\n    OutFile<<"*********************"<<endl;\n\n    // cout<<"*********************"<<endl;\n    char q[20];    // 对产生式的非终结符排序并存取在字符数组q\n    q[0] = p[0].left[0]; // 把产生式的第一个非终结符存入q中\n\n  // 对非终结符排序并存取\n    for (i = 1; i < n; i++) {\n        flag = 0;\n        for (j = 0; j < i; j++) {\n      // 根据j<i循环避免重复非终结符因此由标志位判断\n            if(p[i].left==p[j].left) {\n              flag++;\n            }\n        }\n\n        if(flag==0) {\n          // 没有重复加入q数组中\n            q[count++]=p[i].left[0];\n        }\n    }\n    count--;\n\n  // 调用消除递归子函数\n    Removing(p,q,n,count);\n    // 删除无用产生式\n    Delete(p,n);\n\n    OutFile<<"消除递归后的文法产生式为:"<<endl;\n    // cout<<"消除递归后的文法产生式为:"<<endl;\n    for (i = 0; i <= count; i++) {\n        for (int j = 0; j <= n*n; j++) {\n            if ((p[j].left[0] == q[i]) && int (p[j].left.length ()) == 1) {\n                OutFile<<p[j].left<<"-->"<<p[j].right<<endl;\n        // cout<<p[j].left<<"-->"<<p[j].right<<endl;\n            } else {\n              continue;\n            }\n        }\n\n        for (j = 0; j <= n*n; j++) {\n            if((p[j].left[0] == q[i]) && int (p[j].left.length ()) == 2) {\n                OutFile<<p[j].left<<"-->"<<p [j].right<<endl;\n            // cout<<p[j].left<<"-->"<<p[j].right<<endl;\n            } else {\n              continue;\n            }\n        }\n    }\n    return 0;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    非 LL(1) 文法/语言
    • ambiguous grammar
    • left recursive grammar
    • not left factored grammar(未提取展开式的公因子)

    自底向上分析

    0: S -> E\n1: E -> E + T\n2: | T\n3: T -> T * F\n4: | F\n5: F -> n\n
    1
    2
    3
    4
    5
    6
    2 + 3 * 4\n=> F + 3 * 4\n=> T + 3 * 4\n=> E + 3 * 4\n=> E + T * 4\n=> E + T * F\n=> E + T\n=> E\n=> S\n
    1
    2
    3
    4
    5
    6
    7
    8
    9

    最右推导(优先推导最右侧非终结符)逆过程

    LR(0) 分析算法(移进-归约(reduce)算法)

    • 从左向右读入程序(left to right scan), 逆向最右推导(rightmost derivation), 不用前看符号
    • 添加伪开始符号: S' -> . S$ $表示 tokens/file 结束符
    • 移进 : 读入记号 push(token[i])
    • 归约(reduce): pop(right expansion) push(left expansion)
    短语(Handles)
    S -*> αXω -> αβω\n
    1

    β 是 αβω 的一个短语(Handle)

    分析表构造

    LR(0) 分析表构造算法: (原理同于 Hopcroft 算法)

    • E -> A, A -> B, B -> C ... : Recursively, right hand side of C production will be reduced to E finally
    closure(production_set p) {\n  while (p is still changing) {\n    foreach (p's item i: A -> b . B ...) {\n      p += {B -> . y...}\n    }\n  }\n}\n\ngoto(production_set p, token x) {\n  temp = {}\n\n  foreach (p's item i: A -> b . x...) {\n    temp += {A -> bx . ...}\n  }\n\n  return closure(temp)\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    p0 = closure(S'' -> . S $)\n(production_with_dot_)set = {p0}\nQ = enqueue(p0)\n\nwhile (Q is not empty) {\n  p = dequeue(Q)\n\n  foreach (x <- NonTerminal||Terminal) {\n    q = goto(p, x)\n\n    if (x <- Terminal) {\n      ACTION[p, x] = q\n    } else {\n      GOTO[p, x] = q\n    }\n\n    if (q not <- set) {\n      set += {q}\n      enqueue(q)\n    }\n  }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    驱动代码

    LR(0) 驱动算法:

    stack[];\npush($)\npush(state1)\n\nwhile (true) {\n  token t = nextToken()\n  state s = stack[top]\n\n  if (ACTION[s, t] == shift_i) {\n    push(t)\n    push(state_i)\n  } else if (ACTION[s, t] == reduce_j) {\n    // X is the left side of production j: X->beta\n    // beta is the right side of production j: X->beta\n\n    // pop up right side\n    pop(beta && bundle state variables)\n\n    // current state after pop up all bundle state(of beta)\n    state s = stack[top]\n\n    // push left side\n    push(X)\n\n    // transfer state after reduce\n    push(GOTO[s, X])\n  } else {\n    throw new SyntaxError();\n  }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    解决冲突

    SLR, LR(1), LALR, 采取与 first/follow/select sets 以及 前看符号 类似策略:

    • production_with_dot_set 中的 item 修改为 X -> [beta1 . beta_n..., a] 二元组
    • closure(production_set p) 中闭包规则从 X -> [a . Y beta,a] 修改为 Y -> [.y, b] b <- select(beta a)

    LALR-K

    LALR(k)

    SLR

    Simple LR: improves LR(k) shift/reduce heuristic

    New reduce rule:

    • state contains item X -> β.
    • next_token <- follow(X)
    SLR 实现
    • stack pair: <input, state>
    • state i: if has item X -> α.aβ , goto[i, a] = j then action[i, a] = shift j(shift then to state j)
    • state i: if has item X -> α. , a <- follow(X) then action[i, a] = reduce(X -> α)
    • state i: if has item S' -> S then action[i, $] = accept
    • otherwise: action[i, a] = error

    抽象语法树

    语法制导翻译(Syntax-Directed Translation)

    在进行归约(reduce)的同时, 进行语义动作:

    • 给每条产生规则附加一个语义动作
    exp : exp '+' exp { $$ = $1 + $3; }\n;\n
    1
    2
    • 在分析栈中压入 symbol, value, state (原本只压入 symbol, state)
    push(right side symbol);\npush(right side value);\npush(next state);\n
    1
    2
    3

    抽象语法

    • 表达语法结构的内部表示, 作为前端(词法语法分析)和后端(代码生成)的中间件, tokens --语法分析器--> 抽象语法(树) --代码生成器--> 目标代码
    • 抽象语法无需考虑左/右递归, 左公因子提取, 分隔符等
    // 具体语法\nE: E + T\n | T\n ;\nT: T * F\n | F\n ;\nF: n\n | (E)\n ;\n\n// 抽象语法\nE: n\n | E + E\n | E * E\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    AST 的实现

    数据结构
    E: n\n | E + E\n | E * E\n
    1
    2
    3
    enum kind {\n  E_INT,\n  E_ADD,\n  E_TIMES\n};\n\nstruct exp {\n  enum kind kind;\n};\n\nstruct exp_int {\n  enum kind kind;\n  int value;\n};\n\nstruct exp_add {\n  enum kind kind;\n  struct exp *left;\n  struct exp *right;\n};\n\nstruct exp_times {\n  enum kind kind;\n  struct exp *left;\n  struct exp *right;\n};\n\nstruct exp_int *new_exp_int(int value) {\n  struct exp_int *p = (struct exp_int *)malloc(sizeof(struct exp_int));\n  if (!p) throw new Error();\n  p->kind = E_INT;\n  p->value = value;\n  return p;\n}\n\nstruct exp_add *new_exp_add(exp *left, exp *right) {\n  struct exp_add *p = (struct exp_add *)malloc(sizeof(struct exp_add));\n  if (!p) throw new Error();\n  p->kind = E_ADD;\n  p->left = left;\n  p->right = right;\n  return p;\n}\n\nstruct exp_times *new_exp_times(exp *left, exp *right) {\n  struct exp_times *p = (struct exp_times *)malloc(sizeof(struct exp_times));\n  if (!p) throw new Error();\n  p->kind = E_TIMES;\n  p->left = left;\n  p->right = right;\n  return p;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    相关算法
    int nodes_num(exp *e) {\n  switch (e->kind) {\n    case E_INT:\n      return 1;\n    case E_ADD: // fall through\n    case E_TIMES:\n      return 1 + nodes_num(e->left) + nodes_num(e->right);\n    default:\n      throw new SyntaxError("compile bug");\n  }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int pretty_print(exp *e) {\n  switch (e->kind) {\n    case E_INT:\n      printf("%d", e->value);\n      return 1;\n    case E_ADD:\n      printf("(");\n      pretty_print(e->left);\n      printf(")");\n      printf("+");\n      printf("(");\n      pretty_print(e->right);\n      printf(")");\n      return 1;\n    case E_TIMES:\n      printf("(");\n      pretty_print(e->left);\n      printf(")");\n      printf("*");\n      printf("(");\n      pretty_print(e->right);\n      printf(")");\n      return 1;\n    default:\n      throw new SyntaxError();\n      break;\n  }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    构造算法

    利用语法制导翻译, 在语法动作(action)/语法归约(reduce)中加入生成语法树的代码(自底(叶子)向上(根)构造函数)

    E: E + E { $$ = new_exp_add($1, $3); }\n | E * E { $$ = new_exp_times($1, $3); }\n | n     { $$ = new_exp_int($1); }\n ;\n
    1
    2
    3
    4

    Semantic Analysis(语义分析)

    • 声明检查(identifiers declaration)
    • 定义检查:
      • class 仅可定义一次
      • method 在同一 class 中仅可定义一次
    • 类型检查(types)
    • 作用域检查
    • 继承关系(inheritance relationships)
    • 上下文相关分析(检查抽象语法树上下文相关的属性)

    AST + semantic of programming language --semantic analysis--> intermediate

    e.g 变量/函数必须先声明再使用; 每个表达式必须有合适类型(左值/右值); 函数调用与函数定义保持一致(函数签名)

    P: D S\n ;\n\nD: T id ';' D\n |\n ;\n\nT: int\n | bool\n ;\n\nS: id = E\n | printi (E)\n | printb (E)\n ;\n\nE: n\n | id\n | true\n | false\n | E + E\n | E && E\n ;\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

    类型系统(type system)

    Type Checking

    ├ e: T meas e 可计算为类型为 T 的值

    Type Environments

    • Object(identifier) = Type
    • O Type environments 是一个函数, 将 object identifiers 映射成 types
    • O ├ e: T 表示在 O 函数作用下, 可证明 e 的类型为 T
    // input x\n// output T\nO[T/x](x) = T\n\nO[T/x](y) = O(y)\n
    1
    2
    3
    4
    5
    [Var]\nO(x) = T\n----------\nO ├ x: T\n\n[Let without Init]\nO[T0/x] ├ e1: T1\n--------------------\nO ├ let x: T0 in e1: T1\n
    1
    2
    3
    4
    5
    6
    7
    8
    9

    Typing Methods

    • Method(ClassName, functionName) = (Type1, ..., Type_n, Type_n+1)
    • Type_n+1 为返回值的类型, 即方法自身的类型
    [Dispatch]\nO,M ├ e0: T0\nO,M ├ e1: T1\n...\nO,M ├ en: Tn\nM(T0, func) = (T1', ..., Tn', Tn+1')\nTi <= Ti'\n----------\nO,M ├ e0.func(e1, ..., en): Tn+1'\n
    1
    2
    3
    4
    5
    6
    7
    8
    9

    符号表(上下文相关)

    用来存储程序中变量的相关信息:

    • 类型: 字典结构 (key, type)
    • 作用域:
      • 进入作用域, 插入元素(插入哈希表首, 屏蔽外部同名变量); 离开作用域, 删除元素
      • 进入作用域, 压入新符号表; 离开作用域, 弹出栈顶符号表
    • 访问控制权
    • 命名空间: 变量, 标签, 形参, 标号 各自拥有一类符号表

    可将符号表实现为:

    • 哈希表: 查找时间复杂度 O(1);
    • 红黑树: 查找时间复杂度 O(lg N);
    #ifndef XX_SEMANTIC_TABLE_H\n#define XX_SEMANTIC_TABLE_H\n\ntypedef enum type type_t;\ntypedef char * key_t;    // typedef int hash_t; typedef hash_t key_t;\ntypedef struct value {\n  type_t type;\n  scope_t scope;\n} value_t;\n\ntypedef ... table_t;// 符号表数据结构\n\ntable_t new_table(void);\nint table_insert(table_t table, key_t id, value_t info);\nvalue_t table_search(table_t table, key_t id);\n\n#endif\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

    类型检查

    • table: 字典结构 (key, type) (Hash Table/Red Black Tree)
    • type environment(Object, Methods, Class) is passed from parent to child(down the tree)
    • types are passed from child to parent(up the tree)
    TypeCheck(Environment/OMC, e1+e2) = {\n    T1 = TypeCheck(OMC, e1);\n    T2 = TypeCheck(OMC, e2);\n    Check T1 == T2 == Int;\n    return Int;\n}\n\nTypeCheck(OMC, let x: T <- e0 in e1) = {\n    T0 = TypeCheck(OMC, e0);\n    T1 = TypeCheck(OMC.add(O(x)=T), e1);\n    Check subtype(T0, T1);  // T0 <= T1\n    return T1;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    enum type {INT, BOOL};\ntable_t table;// symbol table\n\n// dec_t, stm_t, exp_t: AST 中的结点\n\nenum type check_prog(dec_t d, stm_t s) {\n  // 生成符号表\n  table = check_dec(d);\n  // 根据符号表检查语句\n  return check_stm(s);\n}\n\n// 生成符号表\ntable_t check_dec(dec_t d){\n  foreach(T id <- d) {\n    table_insert(table, id, T);\n  }\n}\n\nenum type check_stm(table_t table, stm_t s) {\n  switch (s->kind) {\n    case STM_ASSIGN:\n      t1 = table_search(table, id);\n      t2 = check_exp(table, s->exp);\n      if (t1 != t2) {\n        throw new SemanticError("type mismatch");\n      } else {\n        return t1;\n      }\n    case STM_PRINTI:\n      t = check_exp(s->exp);\n      if (t != INT) {\n        throw new SemanticError("type mismatch");\n      } else {\n        return INT;\n      }\n    case STM_PRINTB:\n      t = check_exp(s->exp);\n      if (t != BOOL) {\n        throw new SemanticError("type mismatch");\n      } else {\n        return BOOL;\n      }\n  }\n}\n\nenum type check_exp(exp_t e) {\n  switch (e->kind) {\n    case EXP_INT:\n      return INT;\n    case EXP_ID:\n      t = table_search(table, id);// 查询符号表, 得到变量类型\n      if (id not exist) {\n        throw new SemanticError("id not found");\n      } else {\n        return t;\n      }\n    case EXP_TRUE:\n      return BOOL;\n    case EXP_FALSE:\n      return BOOL;\n    case EXP_ADD:\n      enum type t1 = check_exp_type(e->left);\n      enum type t2 = check_exp_type(e->right);\n      if (t1 != INT || t2 != INT) {\n        throw new SemanticError();\n        break;\n      } else {\n        return INT;\n      }\n    case EXP_AND:\n      enum type t1 = check_exp_type(e->left);\n      enum type t2 = check_exp_type(e->right);\n      if (t1 != BOOL || t2 != BOOL) {\n        throw new SemanticError();\n        break;\n      } else {\n        return BOOL;\n      }\n    default:\n      throw new SemanticError();\n      break;\n  }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84

    作用域检查

    table:

    • 进入作用域, 插入元素(插入哈希表首, 屏蔽外部同名变量); 离开作用域, 删除元素
    • 进入作用域, 压入新符号表; 离开作用域, 弹出栈顶符号表

    类型相容性

    • 名字不同但结构相同的类型是否相等
    • 面向对象的继承类: is-a 关系 Parent parent = child;

    错误诊断

    • 准确的错误信息: 出错位置等
    • 大量的错误信息
    • 一定的自纠功能

    Immediate Representation

    IR:

    • 树与有向无环图(DAG)
    • 三地址码(3-address code)
    • 控制流图(CFG)
    • 静态单赋值形式(SSA)
    • 连续传递风格(CPS)

    三地址码

    • 原子表达式
    • 简单控制流 cjmp/jmp
    • 抽象的机器代码(伪代码)

    控制流图

    Block

    • block_t: { label_t; stm_list; jmp_t; }
    • 扫描三地址码, 生成 blocks
    • 图论算法:结点为 blocks, 边为跳转边

    死基本块删除优化:删除遍历不到的语句块

    数据流分析与程序重写

    • 根据数据流分析得到的信息, 对三地址码/控制流图进行重写
    • 后端的每一个阶段都可进行数据流分析

    常量传播优化: 将赋值语句右端变量直接替换为常量, 减少访存

    数据分析方法
    到达定义分析

    分析变量的哪些定义点可以到达变量的使用点处, 若可达定义唯一则可进行常量传播优化:

    • in set = prior out set
    • out set = self set + in set - kill set(重复定义点)
    活性分析
    • 寄存器分配优化 活跃区间不相交的变量可共用一个寄存器
    • 并行优化 使用区间并行的计算可并行执行

    代码优化

    组织管理

    Activation Record and Frame

    AR:

    用于管理过程活性(procedure activation)的信息:

    • result: 置于记录的顶层, 便于访问此结果
    • argument
    • return address
    • control link: 指向调用者(上级)

    全局变量

    不存于 AR 中, 存于静态数据段

    堆区

    new/malloc 得到的变量/对象不存于 AR 中, 存于堆区

    优化类型

    • Local optimizations
    • Global optimizations
    • Inter-procedural optimizations

    局部优化

    • 常量折叠优化: 所有代入常量的地方全部代入常量 1 + 2 => 3
    • 代数化简优化: a=1*b => a=b 2*a=>a<<1 (all tips from CSAPP)
    • 复制传播(copy propagation)优化: 利用前面计算出来的结果, 直接替换后面所有出现在右边的已计算左式(寄存器)

    全局优化

    Dead Code Elimination

    • CFG 中(控制流分析) 死代码块删除优化

    Constant Propagation

    CFG 中(数据流分析-可达定义分析) 常量传播(constant propagation)优化:

    • forwards analysis
    • C(stm, x, in) = value of x before stm ; C(stm, x, out) = value of x after stm
    • bottom < c < top => C(stm, x, in) = least_upper_bound{ C(prev_stm_i, x, out) }:
      • C(prev_stm, x, out) = top(nondeterministic) => C(stm, x, in) = top
      • C(prev_stm1, x, out) != C(prev_stm2, x, out) => C(stm, x, in) = top
      • C(prev_stm_i, x, out) = c/bottom(dead code) => C(stm, x, in) = c
    • C(stm, x, in) = bottom => C(stm, x, out) = bottom
    • C(x := c, x, out) = c
    • C(x := f(), x, out) = top
    • init: set entry to C = top, set anywhere else to C = bottom

    Liveness Analysis

    CFG 中 数据流分析-活性分析(liveness analysis), 可用于复制传播优化与寄存器分配优化:

    • backwards analysis
    • L(stm, x, out) = V { L(next_stm, x, in)}
    • L(... := f(x), x, in) = true
    • L(x := e, x, in) = false
    • L(none x, x, in) = L(none x, x, out)
    • init: L(...) = false

    寄存器分配

    Register Allocation and Graph Coloring:

    • 当 t1 与 t2 同时具有活性时, 不可共享寄存器; 反之, t1 与 t2 不同时具有活性, 可以共享寄存器
    • 当 t1 与 t2 同时具有活性时, 添加一条边连接 t1 与 t2, 构建 register interference graph(RIG)
    • colors number = registers number, k-colorable problem

    Code Generation(代码生成)

    为数据分配计算资源:

    • 数据: 全局变量, 局部变量, 动态分配变量
    • 资源: 寄存器(register), 数据区(.data, .bss), 代码区(.code), 栈区(runtime stack), 堆区(user heap)

    当前局部变量应该放在寄存器还是内存区?

    为代码选择计算指令(等价性):

    • 代码: 表达式/语句/函数代码
    • 指令: 算术/比较/跳转/调用/返回指令
    P: D S\n ;\n\nD: T id ';' D\n |\n ;\n\nT: int\n | bool\n ;\n\nS: id = E\n | printi (E)\n | printb (E)\n ;\n\nE: n\n | id\n | true\n | false\n | E + E\n | E && E\n ;\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

    递归下降代码生成算法

    基于栈计算机

    Mem + Stack + ALU

    JVM(Java Virtual Machine)

    s: push NUM\n | load x\n | store x\n | add\n | sub\n | times\n | div\n ;\n
    1
    2
    3
    4
    5
    6
    7
    8
    gen_prog(dec_t d, stm_t s) {\n  gen_dec(d);\n  gen_stm(s);\n}\n\ngen_dec(T id; D) {\n  // stack_code(".int id")\n  gen_type(T);\n  emit(" id");\n\n  gen_dec(D);\n}\n\ngen_type(type_t t) {\n  switch(t-kind) {\n    case INT:// fall through\n    case BOOL:\n      emit(".int");\n      break;\n  }\n}\n\ngen_stm(stm_t s) {\n  switch (s->kind) {\n    STM_ASSIGN:\n      gen_exp(s->exp);\n      emit("store s->id");\n      break;\n    STM_PRINTI:\n      gen_exp(s->exp);\n      emit("printi");\n      break;\n    STM_PRINTB:\n      gen_exp(s->exp);\n      emit("printb");\n      break;\n  }\n}\n\ngen_exp(exp_t e) {\n  switch (e->kind) {\n    case EXP_INT:\n      emit("push e->value");// n\n      break;\n    case EXP_ID:\n      emit("load e->value");// id\n      break;\n    case EXP_BOOL:\n      emit("push e->value");// 1/0\n      break;\n    case EXP_ADD:\n      gen_exp(e->left);\n      gen_exp(e->right);\n      emit("add");\n      break;\n    case EXP_AND:\n      gen_exp(e->left);\n      gen_exp(e->right);\n      emit("and");\n      break;\n  }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62

    基于寄存器计算机 (RISC)

    Mem + Reg + ALU

    MIPS ISA

    // src -> dist\ns: mov_n n, r\n | mov r1, r2\n | load [x], r\n | store r, [x]\n | add r1, r2, r3\n | sub r1, r2, r3\n | times r1, r2, r3\n | div r1, r2, r3\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void gen_prog(dec_t d, stm_t s) {\n  gen_dec(d);\n  gen_stm(s);\n}\n\nvoid gen_dec(T id; D) {\n  // reg_code(".int id")\n  // 为变量分配寄存器\n  gen_type(T);\n  emit(" id");\n\n  gen_dec(D);\n}\n\nvoid gen_type(type_t t) {\n  switch(t-kind) {\n    case INT:// fall through\n    case BOOL:\n      emit(".int");\n      break;\n  }\n}\n\nvoid gen_stm(stm_t s) {\n  switch (s->kind) {\n    STM_ASSIGN:\n      r = gen_exp(s->exp);\n      emit("mov r, e->id");\n      break;\n    STM_PRINTI:\n      r = gen_exp(s->exp);\n      emit("printi r");\n      break;\n    STM_PRINTB:\n      r = gen_exp(s->exp);\n      emit("printb r");\n      break;\n  }\n}\n\nreg_t gen_exp(exp_t e) {\n  switch (e->kind) {\n    case EXP_INT:\n      r = random_reg();\n      emit("mov_n e->value, r");// n\n      return r;\n    case EXP_ID:\n      r = random_reg();\n      emit("mov e->value, r");// id\n      return r;\n    case EXP_BOOL:\n      r = random_reg();\n      emit("mov_n e->value, r");// 1/0\n      return r;\n    case EXP_ADD:\n      r1 = gen_exp(e->left);\n      r2 = gen_exp(e->right);\n      r = random_reg();\n      emit("add r1, r2, r");\n      return r;\n    case EXP_AND:\n      r1 = gen_exp(e->left);\n      r2 = gen_exp(e->right);\n      r = random_reg();\n      emit("and r1, r2, r");\n      return r;\n  }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68

    Garbage Collection

    Mark and Sweep

    • mark phase: traces reachable objects (mark_bit |= 1)
    let todo = {all roots}\nwhile todo != nil do\n    pick v <- todo\n    todo -= {v}\n    if mark(v) == 0 then\n        mark(v) |= 1\n        let v1, ..., vn be the pointers contained in v\n        todo += {v1, ..., vn}\n    fi\nod\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    • sweep phase: collects garbage objects (mark_bit == 0)
    p = bottom of heap\nwhile p < top of heap do\n    if mark(p) == 1 then\n        mark(p) = 0\n    else\n        add block p...(p + sizeof(p) - 1)  to freeList\n    fi\n    p += sizeof(p)\nod\n
    1
    2
    3
    4
    5
    6
    7
    8
    9

    Stop and Copy

    Copy all reachable objects in old space to new space(reserved for GC):

    • Copied objects
    • Scanned objects: pointers have been restored

    Compilers Exercise

    C Declaration Interpreter

    #include <stdio.h>\n#include <string.h>\n#include <ctype.h>\n#include <stdlib.h>\n\n#define MAX_TOKENS 100\n#define MAX_TOKEN_LEN 64\n\nenum type_tag {\n    IDENTIFIER,\n    QUALIFIER,\n    TYPE,\n};\n\nstruct token {\n    char type;\n    char string[MAX_TOKEN_LEN];\n};\n\nint top = -1;\nstruct token stack[MAX_TOKENS];\nstruct token ts;\n\n#define pop stack[top--]\n#define push(s) stack[++top] = s\n\nenum type_tag classify_string(void) {\n    char *s = ts.string;\n\n    if (!strcmp(s, "const")) {\n        strcpy(s, "read-only ");\n        return QUALIFIER;\n    }\n\n    if (!strcmp(s, "volatile")) return QUALIFIER;\n    if (!strcmp(s, "void")) return TYPE;\n    if (!strcmp(s, "char")) return TYPE;\n    if (!strcmp(s, "signed")) return TYPE;\n    if (!strcmp(s, "unsigned")) return TYPE;\n    if (!strcmp(s, "short")) return TYPE;\n    if (!strcmp(s, "int")) return TYPE;\n    if (!strcmp(s, "long")) return TYPE;\n    if (!strcmp(s, "float")) return TYPE;\n    if (!strcmp(s, "double")) return TYPE;\n    if (!strcmp(s, "struct")) return TYPE;\n    if (!strcmp(s, "union")) return TYPE;\n    if (!strcmp(s, "enum")) return TYPE;\n\n    return IDENTIFIER;\n}\n\nvoid get_token(void) {\n    char *p = ts.string;\n\n    /* 略过空白字符 */\n    while ((*p = getchar()) == ' ');\n\n    if (isalnum(*p)) {\n        /* 读入得标识符以a-Z,0-9开头 */\n        while (isalnum(*++p = getchar()));\n        ungetc(*p, stdin);\n        *p = '\\0';\n        ts.type = classify_string();\n        return;\n    }\n\n    if (*p == '*') {\n        strcpy(ts.string, "pointer to");\n        ts.type = '*';\n        return;\n    }\n\n    ts.string[1] = '\\0';\n    ts.type = *p;\n    return;\n}\n\nvoid read_to_first_identifer(void) {\n    get_token();\n\n  // read til identifier\n    while (ts.type != IDENTIFIER) {\n        push(ts);\n        get_token();\n    }\n\n    printf("%s is ", ts.string);\n    get_token();\n}\n\nvoid deal_with_arrays(void) {\n    while (ts.type == '[') {\n        printf("array ");\n        get_token();\n\n    /* 数字或']' */\n        if (isdigit(ts.string[0])) {\n            printf("0..%d ", atoi(ts.string) - 1);\n            get_token();\n        }\n\n        get_token();\n        printf("of ");\n    }\n}\n\nvoid deal_with_pointers(void) {\n    while (stack[top].type == '*')\n    {\n        printf("%s ", pop.string);\n    }\n}\n\nvoid deal_with_function_args(void) {\n    while (ts.type != ')') {\n        get_token();\n    }\n\n    get_token();\n    printf("function returning ");\n}\n\nvoid deal_with_declarator(void) {\n    /* 处理标识符之后可能存在的数组/函数 */\n\n    switch (ts.type) {\n      case '[':\n          deal_with_arrays();\n          break;\n      case '(':\n          deal_with_function_args();\n          break;\n    }\n\n    deal_with_pointers();\n\n    /* 处理在读入到标识符之前压入到堆栈中的符号 */\n    while (top >= 0) {\n        if (stack[top].type == '(') {\n            pop;\n            get_token();  //读取')'之后的符号\n            deal_with_declarator();\n        } else {\n            printf("%s", pop.string);\n        }\n    }\n}\n\nint main(void) {\n    /* 将标记压入堆栈中, 直到遇见标识符 */\n    read_to_first_identifer();\n    deal_with_declarator();\n    printf("\\n");\n\n    system("pause");\n    return 0;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157

    Cool Language

    Classroom Object-Oriented Language:

    Parser Implementation

    // 返回下一个Token(只测试该Token,不向前移动Token List的offset指针)\nToken Peek(void);\n
    1
    2
    // 消费下一个Token\nToken Next(void);\n
    1
    2
    // void Expect(expectedToken)\nif (Peek() != expectedToken) {\n    Error("expect %s, but got %s\\n", expectedToken, Peek());\n}\n
    1
    2
    3
    4
    // void Try(expectedToken)\nif (Peek() == expectedToken) {\n    Next(); // 消费之\n    return true;\n}\n\nreturn false;\n
    1
    2
    3
    4
    5
    6
    7
    ',320);t.render=function(a,p,t,o,c,l){return n(),s("div",null,[e])};export default t;export{p as __pageData}; diff --git a/assets/computerScience_compilers_compilersBasicNotes.md.5ebb309b.lean.js b/assets/computerScience_compilers_compilersBasicNotes.md.5ebb309b.lean.js new file mode 100644 index 00000000000..4f2e9b02437 --- /dev/null +++ b/assets/computerScience_compilers_compilersBasicNotes.md.5ebb309b.lean.js @@ -0,0 +1 @@ +import{o as n,c as s,a}from"./app.6dd2a1b7.js";const p='{"title":"Compiler Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Basic Concepts","slug":"basic-concepts"},{"level":3,"title":"Definition of compilers","slug":"definition-of-compilers"},{"level":3,"title":"Structure of compilers","slug":"structure-of-compilers"},{"level":2,"title":"文法与语言","slug":"文法与语言"},{"level":3,"title":"符号与符号串","slug":"符号与符号串"},{"level":3,"title":"文法与语言的形式化表示","slug":"文法与语言的形式化表示"},{"level":3,"title":"乔姆斯基文法体系","slug":"乔姆斯基文法体系"},{"level":3,"title":"上下文无关文法","slug":"上下文无关文法"},{"level":3,"title":"正规文法","slug":"正规文法"},{"level":3,"title":"正则语言(Regular Expressions)","slug":"正则语言-regular-expressions"},{"level":3,"title":"分析树","slug":"分析树"},{"level":3,"title":"文法规则","slug":"文法规则"},{"level":2,"title":"Lexical Analysis","slug":"lexical-analysis"},{"level":3,"title":"Tokenizer - 词法分析器","slug":"tokenizer-词法分析器"},{"level":3,"title":"有限状态自动机(Finite Automaton)","slug":"有限状态自动机-finite-automaton"},{"level":3,"title":"自动词法分析器","slug":"自动词法分析器"},{"level":2,"title":"Syntax Analysis(语法分析)","slug":"syntax-analysis-语法分析"},{"level":3,"title":"自顶向下分析","slug":"自顶向下分析"},{"level":3,"title":"自底向上分析","slug":"自底向上分析"},{"level":3,"title":"抽象语法树","slug":"抽象语法树"},{"level":2,"title":"Semantic Analysis(语义分析)","slug":"semantic-analysis-语义分析"},{"level":3,"title":"类型系统(type system)","slug":"类型系统-type-system"},{"level":3,"title":"符号表(上下文相关)","slug":"符号表-上下文相关"},{"level":3,"title":"类型检查","slug":"类型检查"},{"level":3,"title":"作用域检查","slug":"作用域检查"},{"level":3,"title":"类型相容性","slug":"类型相容性"},{"level":3,"title":"错误诊断","slug":"错误诊断"},{"level":2,"title":"Immediate Representation","slug":"immediate-representation"},{"level":3,"title":"三地址码","slug":"三地址码"},{"level":3,"title":"控制流图","slug":"控制流图"},{"level":2,"title":"代码优化","slug":"代码优化"},{"level":3,"title":"组织管理","slug":"组织管理"},{"level":3,"title":"优化类型","slug":"优化类型"},{"level":3,"title":"局部优化","slug":"局部优化"},{"level":3,"title":"全局优化","slug":"全局优化"},{"level":2,"title":"Code Generation(代码生成)","slug":"code-generation-代码生成"},{"level":3,"title":"递归下降代码生成算法","slug":"递归下降代码生成算法"},{"level":2,"title":"Garbage Collection","slug":"garbage-collection"},{"level":3,"title":"Mark and Sweep","slug":"mark-and-sweep"},{"level":3,"title":"Stop and Copy","slug":"stop-and-copy"},{"level":2,"title":"Compilers Exercise","slug":"compilers-exercise"},{"level":3,"title":"C Declaration Interpreter","slug":"c-declaration-interpreter"},{"level":3,"title":"Cool Language","slug":"cool-language"},{"level":3,"title":"Parser Implementation","slug":"parser-implementation"}],"relativePath":"computerScience/compilers/compilersBasicNotes.md","lastUpdated":1627194884000}',t={},e=a('',320);t.render=function(a,p,t,o,c,l){return n(),s("div",null,[e])};export default t;export{p as __pageData}; diff --git a/assets/computerScience_database_databaseBasicNotes.md.aff8f197.js b/assets/computerScience_database_databaseBasicNotes.md.aff8f197.js new file mode 100644 index 00000000000..69ee0f03c6a --- /dev/null +++ b/assets/computerScience_database_databaseBasicNotes.md.aff8f197.js @@ -0,0 +1 @@ +import{o as n,c as s,a}from"./app.6dd2a1b7.js";const e='{"title":"Database Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Basic Concepts","slug":"basic-concepts"},{"level":3,"title":"Feature","slug":"feature"},{"level":3,"title":"Common Words","slug":"common-words"},{"level":2,"title":"Data Format","slug":"data-format"},{"level":3,"title":"XML","slug":"xml"},{"level":3,"title":"JSON","slug":"json"},{"level":2,"title":"Relational Algebra","slug":"relational-algebra"},{"level":3,"title":"Operators","slug":"operators"},{"level":2,"title":"Higher-Level Database Design Models","slug":"higher-level-database-design-models"},{"level":3,"title":"UML","slug":"uml"},{"level":3,"title":"Entity Relationship Model","slug":"entity-relationship-model"},{"level":2,"title":"SQL","slug":"sql"},{"level":2,"title":"Relational Design","slug":"relational-design"},{"level":3,"title":"Decomposition","slug":"decomposition"},{"level":3,"title":"functional dependencies","slug":"functional-dependencies"},{"level":3,"title":"BCNF","slug":"bcnf"},{"level":3,"title":"Multi Valued Dependencies","slug":"multi-valued-dependencies"},{"level":3,"title":"4NF","slug":"_4nf"},{"level":3,"title":"Normalized Design","slug":"normalized-design"},{"level":2,"title":"Indexes","slug":"indexes"},{"level":2,"title":"Transactions","slug":"transactions"},{"level":3,"title":"Transaction Standard","slug":"transaction-standard"},{"level":3,"title":"ACID Properties","slug":"acid-properties"},{"level":2,"title":"Integrity Constraints","slug":"integrity-constraints"},{"level":2,"title":"Triggers (DBMS Level Constraints)","slug":"triggers-dbms-level-constraints"},{"level":2,"title":"Views","slug":"views"},{"level":3,"title":"Modifications on Views","slug":"modifications-on-views"},{"level":2,"title":"MongoDB Basic Notes","slug":"mongodb-basic-notes"},{"level":3,"title":"MongoDB Set Up","slug":"mongodb-set-up"},{"level":3,"title":"Shell Instruction","slug":"shell-instruction"}],"relativePath":"computerScience/database/databaseBasicNotes.md","lastUpdated":1627194884000}',p={},t=a('

    Database Basic Notes

    Basic Concepts

    Feature

    • Massive
    • Persistent
    • Safe
    • Multi-user
    • Convenient
    • Efficient
    • Reliable

    Common Words

    • create/drop(from)/insert into/delete from/update
    • restricts
    • sub-queries
    • views(shorthand for queries)
    • left/right join on ...
    • primary/foreign key
    • references

    (id, name, birth, major, grade) is not normalized, because grade is not relevant to student id (id, name, birth) + (id, major, grade) is normalized (name, os, lang) is not normalized, because os isn't relevant to lang (name, os) + (name, lang) is normalized Data-intensive applications may not use DBMS/Query Language at all e.g Hadoop, all operations on data stores in files

    Data Format

    XML

    • single root element
    • matched tags with proper nesting
    • unique attributes within elements

    DTD

    Document Type Definition:

    • similar grammar to regular expression(*?)
    • ID/IDRef should be unique
    • CDATA: character data
    • (#PCDATA): parsed character data (plain text between tags)
    <?xml version="1.0" encoding="utf-8"?>\n\n<!DOCTYPE Bookstore [\n    <!ELEMENT Bookstore (Book)*>\n    <!ELEMENT Book (Title, Authors, Remark?)>\n    <!ATTLIST Book  ISBN ID #REQUIRED\n                    Price CDATA #REQUIRED\n                    Authors IDREFS #REQUIRED>\n    <!ELEMENT Title (#PCDATA)>\n    <!ELEMENT Remark (#PCDATA | BookRef)*>\n    <!ELEMENT BookRef EMPTY>\n    <!ATTLIST BookRef book IDREF #REQUIRED>\n    <!ELEMENT Authors (Author)*>\n    <!ELEMENT Author (First_Name, Last_Name)>\n    <!ATTLIST Author Ident ID #REQUIRED>\n    <!ELEMENT First_Name (#PCDATA)>\n    <!ELEMENT Last_Name (#PCDATA)>\n]>\n\n<Bookstore>\n    <Book ISBN="ISBN-0-23-23333-233" Price="233" Authors="Sabertazimi">\n        <Title>Kind of sword</Title>\n        <Authors>\n            <Author Ident="Sabertazimi">\n                <First_Name>Yilong</First_Name>\n                <Last_Name>Liu</Last_Name>\n            </Author>\n        </Authors>\n    </Book>\n</Bookstore>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30

    Tools: XML Copy Editor, XML Linter:

    xmllint --valid --noout Bookstore.xml\n
    1

    XSD

    XML Schema Definition:

    xmllint -schema Bookstore.xsd -noout Bookstore.xml\n
    1

    JSON

    JavaScript Object Notation:

    • serializing data objects in files
    • human-readable data
    • semi-structured data
    • number/boolean/string/array/object(empty or key-value pair) recursive constructs

    Relational Algebra

    Operators

    • select operator σ(sigma): σ(sID < 100 ^ sAge > 20)Table_Name set constraints
    • project operator π(pi) : π(sID, GPA)Table_Name select certain columns
    • cross-product operator x: Table1 x Table2, m tuples(rows) x n tuples(rows) => m*n tuples(rows)
    • natural join operator ∞: σ(E1.A1 = E2.A1 ^ E1.A2 = E2.A2 ...) (E1 x E2)
    • theta join operator ∞(condition): σ(condition) (E1 x E2), call condition as ϴ
    • difference operator -: matching schemas => change rows/tuples
    • union/intersection operator ∪ / ∩: matching schemas => change rows/tuples
    • rename operator ρ: change schemas(attributes name), different schemas <=> same schemas (union/intersection/self-join)
    • assign statement :=
    • tree notation
    π(sID, GPA) (σ(sID < 100 ^ GPA > 3.7) Student)\n
    1

    Higher-Level Database Design Models

    Higher-Level Database Design Models -Translator-> Relational implemented by RDBMS

    UML

    Unified Modeling Language: PlantUML

    Classes

    for data modeling:

    • add PK(primary key)
    • drop methods
    -----------\n| student |\n|---------|\n|sID   PK |\n|sName    |\n|GPA      |\n|---------|\n|<methods>|\n-----------\n
    1
    2
    3
    4
    5
    6
    7
    8
    9

    Associations

    relationships between objects of 2 classes):

    • one to one: 1..1 --- 1..1
    • many to one: * --- 1..1
    • one to many:1..1 --- *
    • many to many: * --- *
    -----------                   ---------\n| student |                   |college|\n|---------|                   |       |\n|sID   PK |x..y   Apply   m..n|       |\n|sName    |-------------------|       |\n|GPA      |                   |       |\n|---------|                   |       |\n|<methods>|                   |       |\n-----------                   ---------\n
    1
    2
    3
    4
    5
    6
    7
    8
    9

    Associations Classes

    • classes store information of relationship edge between 2 data classes
    • unnecessary if 0..1 or 1..1
    c1 * --- 1..1 c2\ninformation of relationship edge can stored in c1\nowing to every object of c1 only associated with 1 object of c2\n
    1
    2
    3

    Subclasses

    children classes

    Composition and Aggregation

    Entity Relationship Model

    SQL

    • select ... from ... where
    • insert into ... ...
    • delete from ... where ...
    • update ... set ... = ... where ...
    DROP VIEW IF EXISTS Standings;\nDROP VIEW IF EXISTS Count;\nDROP VIEW IF EXISTS Wins;\nDROP TABLE IF EXISTS Matches;\nDROP TABLE IF EXISTS Players;\n\n-- Players Table\nCREATE TABLE Players (\n  id SERIAL primary key,\n  name varchar(255)\n);\n\n-- Matches Table\nCREATE TABLE Matches (\n  id SERIAL primary key,\n  player int references Players(id),\n  opponent int references Players(id),\n  result int\n);\n\n-- Wins View shows number of wins for each Player\nCREATE VIEW Wins AS\n  SELECT Players.id, COUNT(Matches.opponent) AS n\n  FROM Players\n  LEFT JOIN (SELECT * FROM Matches WHERE result>0) as Matches\n  ON Players.id = Matches.player\n  GROUP BY Players.id;\n\n-- Count View shows number of matches for each Player\nCREATE VIEW Count AS\n  SELECT Players.id, Count(Matches.opponent) AS n\n  FROM Players\n  LEFT JOIN Matches\n  ON Players.id = Matches.player\n  GROUP BY Players.id;\n\n-- Standings View shows number of wins and matches for each Player\nCREATE VIEW Standings AS\n  SELECT Players.id,Players.name,Wins.n as wins,Count.n as matches\n  FROM Players,Count,Wins\n  WHERE Players.id = Wins.id and Wins.id = Count.id;\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41

    Relational Design

    Decomposition

    • start with mega-relations: including all attributes
    • decompose into smaller relations(BCNF/4NF)

    functional dependencies

    • A -> B => 1-1/n-1 mapping
    • key sets: closure of sets contains all attributes

    assuming relation R(A, B, C, D, ..., G) and closure of A, B {A, B} + A->C->D, B->E->F, F->G => {A, B}+ = {A, B, C, ..., G} then, {A, B} is a key if there no exists such closure, then treat all-attributes as a key

    BCNF

    boyce-codd normal form:

    • for each A -> B having A is super key && B isn't key
    • not exists A -> B -> C
    • here's the algorithm:
    /*\n * @brief fixed point algorithm just like most algorithms from compiler\n *\n * by decomposing to transform non-key dependent attributes to key dependent attributes\n */\n\ncompute FDs for R\ncompute key for R using its FDs\n\nwhile (there is relation R' aren't in BCNF) {\n    pick any R' with A -> B that violates BCNF (A is not its key)\n    decompose R' into R1(A, B) and R2(A, rest)\n    compute FDs for R1 and R2\n    compute keys for R1 and R2 using their FDs\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    Multi Valued Dependencies

    • A -> B && rest attributes => A ->> B
    • A ->> B(1-n mapping), A ->> C(1-n mapping), no B -> C/C ->> B, B * C redundant tuples/rows
    • A ->>B && A ->>C => A ->> B∩C
    • A ->>B && B ->>C => A ->> C-B

    4NF

    Forth normal form:

    • if A ->> B then A is key && B isn't key
    • here's the algorithm:
    /*\n * @brief fixed point algorithm just like most algorithms from compiler\n *\n * by decomposing to transform non-key dependent attributes to key dependent attributes\n */\n\ncompute FDs and MVDs for R\ncompute key for R using its FDs\n\nwhile (there is relation R' aren't in 4NF) {\n    pick any R' with A ->> B that violates 4NF(A is not its key)\n    decompose R' into R1(A, B) and R2(A, rest)\n    compute FDs and MVDs for R1 and R2\n    compute keys for R1 and R2 using their FDs\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    Normalized Design

    • every row has the same number of columns
    • every row has a unique key(PRIMARY KEY)
    • everything in a row is all relevant to unique key
    • everything in a row is all relevant to each other

    Indexes

    • primary mechanism to improve performance of database
    • persist data structures stored in database (hash tables/B trees/B+ trees)
    • trade off: scale of database and workload(query/update rate) as input of physical design advisors
    CREATE INDEX IndexName on T(A)\nCREATE INDEX IndexName on T(A1, A2, ..., An)\nCREATE UNIQUE INDEX IndexName on T(A)\nDROP INDEX IndexName\n
    1
    2
    3
    4

    Transactions

    • a sequence of one/more SQL operations treated as a unit
    • target: concurrency and failures recovery

    Transaction Standard

    • all or nothing(atomicity)
    • transaction begins automatically on first SQL statement
    • on "commit": old transaction ends, new one begins
    • on session termination: current transaction ends
    • "AutoCommit" turns each statement into transaction

    ACID Properties

    • Atomicity(Logging)
    • Consistency
    • Isolation: guarantee serializability(Locking)
    • Durability(Logging)

    Isolation Level

    weaker isolation level: read uncommitted < read committed < repeatable read < serializable

    • increased concurrency + decreased overhead = increased performance
    • weaker consistency guarantees
    • some system default: repeatable read
    SET TRANSACTION READ ONLY;\nSET TRANSACTION ISOLATION LEVEL REPEATABLE READ;\n
    1
    2

    Integrity Constraints

    CREATE TABLE TableName (\n    ... PRIMARY KEY,\n    ... UNIQUE,\n    ... CHECK (Condition),\n    ... references TableName(ForeignKey),\n    ... references TableName(ForeignKey) ON DELETE/UPDATE RESTRICT/SET NULL/CASCADE,\n    ... ,\n    PRIMARY KEY (Attr1, Attr2, ...),\n    UNIQUE (Attr1, Attr2, ...),\n    CHECK (Condition),\n    FOREIGN KEY (Attr1, Attr2, ...) references\n      TableName(Bttr1, Bttr2, ...) [ ON ... (default RESTRICT) ]\n);\n\nCREATE ASSERTION AssertionName\nCHECK (Condition);\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

    Triggers (DBMS Level Constraints)

    CREATE TRIGGER TriggerName\nBEFORE|AFTER|INSTEAD OF Events(INSERT/UPDATE OF/DELETE ON TableName)\n[ referencing-variables ]\n[ FOR EACH ROW ]\nWHEN ( Condition )\n[ BEGIN ]\nAction\n[ END ];\n\nCREATE TRIGGER Cascade\nAfter DELETE ON S\nREFERENCING OLD ROW AS O\nFOR EACH ROW\nDELETE FROM R WHERE A = O.B (R.A = S.B)\n\nCREATE TRIGGER Cascade\nAfter DELETE ON S\nREFERENCING OLD TABLE AS OT\nDELETE FROM R WHERE A IN (SELECT B FROM BT)\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    Views

    • logical layer: hiding data from users
    • modularity and reuse of query
    VIEW ViewName = VIEWQUERY (R1, R2, ..., Rn)\n\nCREATE VIEW ViewName (T1, T2, ..., Tn) AS\n< Query >\n
    1
    2
    3
    4

    Modifications on Views

    owing to views are logical layer, it's senseless to modify data on views

    Implements Modification with Triggers

    CREATE TRIGGER TriggerName\nINSTEAD OF DELETE/UPDATE OF/INSERT ON ViewName\n[ referencing-variables ]\n[ FOR EACH ROW ]\nWHEN ( Condition )\n[ BEGIN ]\nAction\n[ END ];\n
    1
    2
    3
    4
    5
    6
    7
    8

    SQL Standard - Updatable Views

    • SELECT (no DISTINCT) on single table T
    • no GROUP BY/HAVING or Aggregation
    • attributes can't be NULL/default values
    • sub-queries cant' refer to table T
    CREATE VIEW\n...\nWITH CHECK OPTION;\n
    1
    2
    3

    MongoDB Basic Notes

    MongoDB Set Up

    MongoDB Installation

    sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927\necho "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.2 multiverse"\n\\ | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list\nsudo apt-get update\nsudo apt-get install -y mongodb-org mongodb-org-server\n\\ mongodb-org-shell mongodb-org-mongos mongodb-org-tools\n
    1
    2
    3
    4
    5
    6

    MongoDB Not Upgrade

    echo "mongodb-org hold" | sudo dpkg --set-selections\necho "mongodb-org-server hold" | sudo dpkg --set-selections\necho "mongodb-org-shell hold" | sudo dpkg --set-selections\necho "mongodb-org-mongos hold" | sudo dpkg --set-selections\necho "mongodb-org-tools hold" | sudo dpkg --set-selections\n
    1
    2
    3
    4
    5

    MongoDB Control

    sudo service mongod start\nsudo service mongod stop\nsudo service mongod restart\n
    1
    2
    3

    MongoDB Uninstall

    sudo service mongod stop\nsudo apt-get purge mongodb-org*\nsudo rm -r /var/log/mongodb\nsudo rm -r /var/lib/mongodb\n
    1
    2
    3
    4

    Shell Instruction

    create and drop

    create
    use test\nshow dbs\n
    1
    2
    drop
    use dbToDrop\ndb.dropDatabase()\n
    1
    2

    query

    db.collection.find().pretty()\n
    1

    insert

    db.collection.insert();\n
    1

    information

    database
    db.getName()\ndb.stats()\ndb.version()\ndb.getMongo()\n
    1
    2
    3
    4
    collection
    db.getCollectionNames()\ndb.printCollectionStats()\n
    1
    2
    ',119);p.render=function(a,e,p,o,l,r){return n(),s("div",null,[t])};export default p;export{e as __pageData}; diff --git a/assets/computerScience_database_databaseBasicNotes.md.aff8f197.lean.js b/assets/computerScience_database_databaseBasicNotes.md.aff8f197.lean.js new file mode 100644 index 00000000000..c2c0510a936 --- /dev/null +++ b/assets/computerScience_database_databaseBasicNotes.md.aff8f197.lean.js @@ -0,0 +1 @@ +import{o as n,c as s,a}from"./app.6dd2a1b7.js";const e='{"title":"Database Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Basic Concepts","slug":"basic-concepts"},{"level":3,"title":"Feature","slug":"feature"},{"level":3,"title":"Common Words","slug":"common-words"},{"level":2,"title":"Data Format","slug":"data-format"},{"level":3,"title":"XML","slug":"xml"},{"level":3,"title":"JSON","slug":"json"},{"level":2,"title":"Relational Algebra","slug":"relational-algebra"},{"level":3,"title":"Operators","slug":"operators"},{"level":2,"title":"Higher-Level Database Design Models","slug":"higher-level-database-design-models"},{"level":3,"title":"UML","slug":"uml"},{"level":3,"title":"Entity Relationship Model","slug":"entity-relationship-model"},{"level":2,"title":"SQL","slug":"sql"},{"level":2,"title":"Relational Design","slug":"relational-design"},{"level":3,"title":"Decomposition","slug":"decomposition"},{"level":3,"title":"functional dependencies","slug":"functional-dependencies"},{"level":3,"title":"BCNF","slug":"bcnf"},{"level":3,"title":"Multi Valued Dependencies","slug":"multi-valued-dependencies"},{"level":3,"title":"4NF","slug":"_4nf"},{"level":3,"title":"Normalized Design","slug":"normalized-design"},{"level":2,"title":"Indexes","slug":"indexes"},{"level":2,"title":"Transactions","slug":"transactions"},{"level":3,"title":"Transaction Standard","slug":"transaction-standard"},{"level":3,"title":"ACID Properties","slug":"acid-properties"},{"level":2,"title":"Integrity Constraints","slug":"integrity-constraints"},{"level":2,"title":"Triggers (DBMS Level Constraints)","slug":"triggers-dbms-level-constraints"},{"level":2,"title":"Views","slug":"views"},{"level":3,"title":"Modifications on Views","slug":"modifications-on-views"},{"level":2,"title":"MongoDB Basic Notes","slug":"mongodb-basic-notes"},{"level":3,"title":"MongoDB Set Up","slug":"mongodb-set-up"},{"level":3,"title":"Shell Instruction","slug":"shell-instruction"}],"relativePath":"computerScience/database/databaseBasicNotes.md","lastUpdated":1627194884000}',p={},t=a('',119);p.render=function(a,e,p,o,l,r){return n(),s("div",null,[t])};export default p;export{e as __pageData}; diff --git a/assets/computerScience_latex_latexBasicNotes.md.d95b2977.js b/assets/computerScience_latex_latexBasicNotes.md.d95b2977.js new file mode 100644 index 00000000000..ff30cd7bafd --- /dev/null +++ b/assets/computerScience_latex_latexBasicNotes.md.d95b2977.js @@ -0,0 +1 @@ +import{o as n,c as s,a}from"./app.6dd2a1b7.js";const t='{"title":"Latex Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Workflow","slug":"workflow"},{"level":3,"title":"Installation","slug":"installation"},{"level":3,"title":"Build Script","slug":"build-script"},{"level":2,"title":"Basis","slug":"basis"},{"level":3,"title":"Layout","slug":"layout"},{"level":2,"title":"Math","slug":"math"},{"level":3,"title":"Symbol","slug":"symbol"},{"level":2,"title":"template","slug":"template"},{"level":2,"title":"Tools","slug":"tools"},{"level":3,"title":"PDF to Tex","slug":"pdf-to-tex"},{"level":3,"title":"tlmgr","slug":"tlmgr"}],"relativePath":"computerScience/latex/latexBasicNotes.md","lastUpdated":1627194884000}',p={},e=a('

    Latex Basic Notes

    Workflow

    Installation

    sudo apt-get install libdigest-perl-md5-perl perl-tk\nwget http://mirrors.ustc.edu.cn/CTAN/systems/texlive/Images/texlive2018.iso\nsudo mount -o loop texlive2018.iso /mnt/iso\ncd /mnt/iso\nsudo ./install-tl -gui perltk\nsudo umount /mnt/iso\n\nexport MANPATH=${MANPATH}:/usr/local/texlive/2018/texmf-dist/doc/man\nexport INFOPATH=${INFOPATH}:/usr/local/texlive/2018/texmf-dist/doc/info\nexport PATH=${PATH}:/usr/local/texlive/2018/bin/x86_64-linux\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    wget https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/tlnet/install-tl-unx.tar.gz\ntar -xzf install-tl-unx.tar.gz\ncd install-tl-201*\nsudo apt-get install perl-tk perl-doc\nsudo ./install-tl -gui -repository https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/tlnet/\n\nsudo cp /usr/local/texlive/2018/texmf-var/fonts/conf/texlive-fontconfig.conf /etc/fonts/conf.d/09-texlive.conf\nsudo fc-cache -fv\n\nsudo tlmgr option repository https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/tlnet/\nsudo tlmgr update --list\nsudo tlmgr update --self --all\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    Build Script

    filename=main\n\npdf:\n  pdflatex -synctex=1 -shell-escape -interaction=nonstopmode ${filename}.tex\n  bibtex ${filename}\n  pdflatex -synctex=1 -shell-escape -interaction=nonstopmode ${filename}.tex\n  pdflatex -synctex=1 -shell-escape -interaction=nonstopmode ${filename}.tex\n\nclean:\n  rm -f ${filename}.{ps,pdf,log,aux,out,dvi,bbl,blg,synctex.gz,toc,bcf,run.xml,tex.bbl,tex.blg}\n  rm -f ${filename}-blx.bib\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    Basis

    Layout

    \\footnote{}\n\\emph{}\n\\raggedright\n\\centering\n\\raggedleft\n
    1
    2
    3
    4
    5

    Page Size

    \\usepackage[left=1cm,right=1cm,top=2cm,bottom=3cm]{geometry}\n
    1

    Font Size

    \\zihao{0}  % 初号\n\\zihao{-6} % 小六\n
    1
    2

    Math

    Typeset Equations

    Symbol

    $\\gamma \\delta \\sigma \\phi \\psi \\rho \\mu \\pi$\n$\\sim \\in$\n$\\geq \\leq$\n$\\infty$\n$\\rightarrow$\n$\\surd \\sqrt{2} \\frac{x}{y}$\n
    1
    2
    3
    4
    5
    6

    template

    \\usepackage{mathbbold}\n\\usepackage{CJK,CJKnumb}\n\\usepackage{indentfirst}        %首行缩进宏包\n\\usepackage{latexsym,bm}        % 处理数学公式中和黑斜体的宏包\n\\usepackage{amsmath,amssymb}    % AMSLaTeX宏包 用来排出更加漂亮的公式\n\\usepackage{graphicx}\n\\usepackage{cases}\n\\usepackage{pifont}\n\\usepackage{txfonts}\n\n%%%%%%%%%%% CJK下设置中文字体 %%%%%%%%%%%%%\n\\newcommand{\\song}{\\CJKfamily{song}}    % 宋体   (Windows自带simsun.ttf)\n\\newcommand{\\fs}{\\CJKfamily{fs}}        % 仿宋体 (Windows自带simfs.ttf)\n\\newcommand{\\kai}{\\CJKfamily{kai}}      % 楷体   (Windows自带simkai.ttf)\n\\newcommand{\\hei}{\\CJKfamily{hei}}      % 黑体   (Windows自带simhei.ttf)\n\\newcommand{\\li}{\\CJKfamily{li}}        % 隶书   (Windows自带simli.ttf)\n\n%%%%%%%%%%%  设置字体大小 %%%%%%%%%%%%%\n\\newcommand{\\chuhao}{\\fontsize{42pt}{\\baselineskip}\\selectfont}\n\\newcommand{\\xiaochuhao}{\\fontsize{36pt}{\\baselineskip}\\selectfont}\n\\newcommand{\\yihao}{\\fontsize{28pt}{\\baselineskip}\\selectfont}\n\\newcommand{\\erhao}{\\fontsize{21pt}{\\baselineskip}\\selectfont}\n\\newcommand{\\xiaoerhao}{\\fontsize{18pt}{\\baselineskip}\\selectfont}\n\\newcommand{\\sanhao}{\\fontsize{15.75pt}{\\baselineskip}\\selectfont}\n\\newcommand{\\sihao}{\\fontsize{14pt}{\\baselineskip}\\selectfont}\n\\newcommand{\\xiaosihao}{\\fontsize{12pt}{\\baselineskip}\\selectfont}\n\\newcommand{\\wuhao}{\\fontsize{10.5pt}{\\baselineskip}\\selectfont}\n\\newcommand{\\xiaowuhao}{\\fontsize{9pt}{\\baselineskip}\\selectfont}\n\\newcommand{\\liuhao}{\\fontsize{7.875pt}{\\baselineskip}\\selectfont}\n\\newcommand{\\qihao}{\\fontsize{5.25pt}{\\baselineskip}\\selectfont}\n\n%%%%%%%% 设置版心 %%%%%%%%%%%%%\n\\setlength{\\textwidth}{14cm}\n\\setlength{\\textheight}{20cm}\n\\setlength{\\hoffset}{0cm}\n\\setlength{\\voffset}{0cm}\n\\setlength{\\parindent}{2em}                 % 首行两个汉字的缩进量\n\\setlength{\\parskip}{3pt plus1pt minus1pt} % 段落之间的竖直距离\n\\renewcommand{\\baselinestretch}{1.2}        % 定义行距\n\\setlength{\\abovedisplayskip}{2pt plus1pt minus1pt}     %公式前的距离\n\\setlength{\\belowdisplayskip}{6pt plus1pt minus1pt}     %公式后面的距离\n\\setlength{\\arraycolsep}{2pt}   %在一个array中列之间的空白长度, 因为原来的太宽了\n\n\\allowdisplaybreaks[4] % \\eqnarray如果很长,影响分栏、换行和分页\n                        %(整块挪动,造成页面空白),可以设置成为自动调整模式\n\n\n\\CJKtilde   %用于解决英文字母和汉字的间距问题。例如:变量~$x$~的值。\n\\renewcommand{\\CJKglue}{\\hskip 0pt plus 0.08\\baselineskip}\n%它于必要时在汉字之间插入一个附加的空隙,以解决行的超长问题。\n\n%\\numberwithin{equation}{section}\n\n%================= 一些自定义命令 =============%\n\\newcommand{\\R}{\\ensuremath{\\mathbb{R}}}\n\\newcommand{\\p}{\\partial}\n\\newcommand{\\g}{\\gamma}\n%=================== End ======================%\n\n\\usepackage{fancyhdr}\n\\pagestyle{fancy}\n\\renewcommand{\\headrulewidth}{0.6pt}\n%\\addtolength{\\parinddent}{2em plus 1em minus 1em]\n\n%===============标题名称中文化 ===================%\n\\renewcommand\\abstractname{\\hei\\ }\n\\renewcommand\\refname{\\hei 参考文献}\n\\renewcommand\\figurename{\\hei}\n\\renewcommand\\tablename{\\hei}\n\\newtheorem{dingyi}{\\hei 定义~}[section]\n\\newtheorem{dingli}{\\hei 定理~}[section]\n\\newtheorem{yinli}[dingli]{\\hei 引理~}\n\\newtheorem{tuilun}[dingli]{\\hei 推论~}\n\\newtheorem{mingti}[dingli]{\\hei 命题~}\n\n%% 注:在印刷出版上,中文字号制与点数制的对照关系如下:\n%% 1770年法国人狄道(F.A.Didot)制定点数制,规定1法寸为72点,即:1点=0.3759毫米。\n%% 狄道点数制在法国、德国、奥地利、比利时、丹麦、匈牙利等国比较流行。\n%% 1886年全美活字铸造协会以派卡(pica)为基准制定派卡点数制,规定1pica=12point(点),即:\n%% 1点=0.013837英寸=0.35146毫米\n%% 20世纪初派卡点数制传入我国,并得到逐步推广。在实用中对常用点数以号数命名而产生了号数制,\n%% 二者换算如下(以pt代表“点”):\n%% 初号……42pt   小初号……36pt    一号……28pt     二号……21pt    小二号……18pt   三号……15.75pt\n%% 四号……14pt   小四号……12pt    五号……10.5pt   小五号……9pt   六号 …… 7.875pt  七号 …… 5.25pt\n\n%%%%% xeCJK下设置中文字体 %%%%%%%%%%%\n\\setCJKfamilyfont{song}{SimSun}                                 %宋体 song\n\\newcommand{\\song}{\\CJKfamily{song}}\n\\setCJKfamilyfont{xs}{NSimSun}                            %新宋体 xs\n\\newcommand{\\xs}{\\CJKfamily{xs}}\n\\setCJKfamilyfont{fs}{FangSong_GB2312}        %仿宋2312 fs\n\\newcommand{\\fs}{\\CJKfamily{fs}}\n\\setCJKfamilyfont{kai}{KaiTi_GB2312}                        %楷体2312  kai\n\\newcommand{\\kai}{\\CJKfamily{kai}}\n\\setCJKfamilyfont{yh}{Microsoft YaHei}                    %微软雅黑 yh\n\\newcommand{\\yh}{\\CJKfamily{yh}}\n\\setCJKfamilyfont{hei}{SimHei}                                    %黑体  hei\n\\newcommand{\\hei}{\\CJKfamily{hei}}\n\\setCJKfamilyfont{msunicode}{Arial Unicode MS}            %Arial Unicode MS: msunicode\n\\newcommand{\\msunicode}{\\CJKfamily{msunicode}}\n\\setCJKfamilyfont{li}{LiSu}                                            %隶书  li\n\\newcommand{\\li}{\\CJKfamily{li}}\n\\setCJKfamilyfont{yy}{YouYuan}                             %幼圆  yy\n\\newcommand{\\yy}{\\CJKfamily{yy}}\n\\setCJKfamilyfont{xm}{MingLiU}                                        %细明体  xm\n\\newcommand{\\xm}{\\CJKfamily{xm}}\n\\setCJKfamilyfont{xxm}{PMingLiU}                             %新细明体  xxm\n\\newcommand{\\xxm}{\\CJKfamily{xxm}}\n\\setCJKfamilyfont{hwsong}{STSong}                            %华文宋体  hwsong\n\\newcommand{\\hwsong}{\\CJKfamily{hwsong}}\n\\setCJKfamilyfont{hwzs}{STZhongsong}                        %华文中宋  hwzs\n\\newcommand{\\hwzs}{\\CJKfamily{hwzs}}\n\\setCJKfamilyfont{hwfs}{STFangsong}                            %华文仿宋  hwfs\n\\newcommand{\\hwfs}{\\CJKfamily{hwfs}}\n\\setCJKfamilyfont{hwxh}{STXihei}                                %华文细黑  hwxh\n\\newcommand{\\hwxh}{\\CJKfamily{hwxh}}\n\\setCJKfamilyfont{hwl}{STLiti}                                        %华文隶书  hwl\n\\newcommand{\\hwl}{\\CJKfamily{hwl}j\n\\setCJKfamilyfont{hwxw}{STXinwei}                                %华文新魏  hwxw\n\\newcommand{\\hwxw}{\\CJKfamily{hwxw}}\n\\setCJKfamilyfont{hwk}{STKaiti}                                    %华文楷体  hwk\n\\newcommand{\\hwk}{\\CJKfamily{hwk}}\n\\setCJKfamilyfont{hwxk}{STXingkai}                            %华文行楷  hwxk\n\\newcommand{\\hwxk}{\\CJKfamily{hwxk}}\n\\setCJKfamilyfont{hwcy}{STCaiyun}                                 %华文彩云 hwcy\n\\newcommand{\\hwcy}{\\CJKfamily{hwcy}}\n\\setCJKfamilyfont{hwhp}{STHupo}                                 %华文琥珀   hwhp\n\\newcommand{\\hwhp}{\\CJKfamily{hwhp}}\n\\setCJKfamilyfont{fzsong}{Simsun (Founder Extended)}     %方正宋体超大字符集   fzsong\n\\newcommand{\\fzsong}{\\CJKfamily{fzsong}}\n\\setCJKfamilyfont{fzyao}{FZYaoTi}                                    %方正姚体  fzy\n\\newcommand{\\fzyao}{\\CJKfamily{fzyao}}\n\\setCJKfamilyfont{fzshu}{FZShuTi}                                    %方正舒体 fzshu\n\\newcommand{\\fzshu}{\\CJKfamily{fzshu}}\n\\setCJKfamilyfont{asong}{Adobe Song Std}                        %Adobe 宋体  asong\n\\newcommand{\\asong}{\\CJKfamily{asong}}\n\\setCJKfamilyfont{ahei}{Adobe Heiti Std}                            %Adobe 黑体  ahei\n\\newcommand{\\ahei}{\\CJKfamily{ahei}}\n\\setCJKfamilyfont{akai}{Adobe Kaiti Std}                            %Adobe 楷体  akai\n\\newcommand{\\akai}{\\CJKfamily{akai}}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140

    Tools

    PDF to Tex

    sudo apt install abiword\nabiword --to=tex a.pdf\n
    1
    2

    tlmgr

    sudo apt-get install xzdec\ncd ~\nmkdir texmf\ntlmgr init-usertree\ntlmgr install <package>\n
    1
    2
    3
    4
    5
    tlmgr update --self --all\ntlmgr update --list\n
    1
    2
    ',30);p.render=function(a,t,p,o,c,l){return n(),s("div",null,[e])};export default p;export{t as __pageData}; diff --git a/assets/computerScience_latex_latexBasicNotes.md.d95b2977.lean.js b/assets/computerScience_latex_latexBasicNotes.md.d95b2977.lean.js new file mode 100644 index 00000000000..94b5d25aa06 --- /dev/null +++ b/assets/computerScience_latex_latexBasicNotes.md.d95b2977.lean.js @@ -0,0 +1 @@ +import{o as n,c as s,a}from"./app.6dd2a1b7.js";const t='{"title":"Latex Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Workflow","slug":"workflow"},{"level":3,"title":"Installation","slug":"installation"},{"level":3,"title":"Build Script","slug":"build-script"},{"level":2,"title":"Basis","slug":"basis"},{"level":3,"title":"Layout","slug":"layout"},{"level":2,"title":"Math","slug":"math"},{"level":3,"title":"Symbol","slug":"symbol"},{"level":2,"title":"template","slug":"template"},{"level":2,"title":"Tools","slug":"tools"},{"level":3,"title":"PDF to Tex","slug":"pdf-to-tex"},{"level":3,"title":"tlmgr","slug":"tlmgr"}],"relativePath":"computerScience/latex/latexBasicNotes.md","lastUpdated":1627194884000}',p={},e=a('',30);p.render=function(a,t,p,o,c,l){return n(),s("div",null,[e])};export default p;export{t as __pageData}; diff --git a/assets/computerScience_network_networkBasicNotes.md.81a62821.js b/assets/computerScience_network_networkBasicNotes.md.81a62821.js new file mode 100644 index 00000000000..6090e0b3174 --- /dev/null +++ b/assets/computerScience_network_networkBasicNotes.md.81a62821.js @@ -0,0 +1 @@ +import{o as e,c as a,a as r}from"./app.6dd2a1b7.js";const s='{"title":"Computer NetWorking Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Computer Network and Internet","slug":"computer-network-and-internet"},{"level":3,"title":"What is Internet","slug":"what-is-internet"},{"level":2,"title":"Application Layer","slug":"application-layer"},{"level":3,"title":"Application Layer Protocol","slug":"application-layer-protocol"},{"level":3,"title":"HTTP","slug":"http"},{"level":3,"title":"Process","slug":"process"},{"level":2,"title":"Transport Layer","slug":"transport-layer"},{"level":3,"title":"TCP(Transmission Control Protocol)","slug":"tcp-transmission-control-protocol"},{"level":3,"title":"UDP","slug":"udp"},{"level":3,"title":"ICMP","slug":"icmp"},{"level":3,"title":"Error Detection","slug":"error-detection"},{"level":3,"title":"Slide Window and Retransmission","slug":"slide-window-and-retransmission"},{"level":2,"title":"Network Layer","slug":"network-layer"},{"level":3,"title":"IP Service Model","slug":"ip-service-model"},{"level":3,"title":"IPv4 Addresses","slug":"ipv4-addresses"},{"level":3,"title":"ARP(Address Resolution Protocol)","slug":"arp-address-resolution-protocol"},{"level":3,"title":"Packet Format","slug":"packet-format"},{"level":2,"title":"WireShark","slug":"wireshark"},{"level":3,"title":"WireShark SetUp","slug":"wireshark-setup"},{"level":2,"title":"Other Tools","slug":"other-tools"}],"relativePath":"computerScience/network/networkBasicNotes.md","lastUpdated":1627194884000}',n={},t=r('

    Computer NetWorking Notes

    Computer Network and Internet

    What is Internet

    end-to-end principle: implement features in the end-system/hosts where possible

    congestion implemented on Transport Layer

    Consist

    Internet Service Provider -> Packet Switch/Communication Link -> Host/End System

    Delay

    nodal = proc + queue + trans + prop: 总时延 = 产生/到达时延 + 排队时延 + 传输时延 + 传播时延

    Layer

    • Application Layer Protocol: HTTP SMTP (message, stream of data)
    • Transport Layer Protocol: TCP UDP (segment, segment of data)
    • Network Layer Protocol: IP (因特网的粘合剂) (unreliable datagram, packet of data)
    • Data Link Layer Protocol: WiFi PPP(点对点) 以太网 (frame)
    • Physical Layer Protocol

    Layering Principle

    • modularity
    • well defined service: simple service model provided by lower level, providing for higher level
    • reuse
    • separation of concerns
    • continuous improvement: change inner structure of layer independently

    Application Layer

    Application Layer Protocol

    defines:

    • types of messages exchanged
    • syntax of various message types(fields definition)
    • semantics of fields
    • rules for when/how to send/respond to messages

    HTTP

    • HTTP -> Socket Interface -> TCP
    • stateless protocol

    Non-Persistent Connections and Persistent Connections

    • non-persistent connections: 1 http request with 1 tcp connection
    • persistent connections: multiple http request with 1 tcp connection

    HTTP Message Format

    • http request format
    request line -> (method field, object url field, protocol version)\nheader lines -> Host/Connections(close -> non-persistent connection)/User-agent/Accept-language\n\\r\\n\nentity body\n
    1
    2
    3
    4
    • http response format
    status line -> (protocol version, status code, corresponding status message)\nheader lines -> Connections/Date/Server/Last-Modified/Content-Length(bytes)/Content-Type\n\\r\\n\nentity body\n
    1
    2
    3
    4

    Cookies

    • first request header -> without cookie
    • first response header -> Set-Cookie: number to client
    • client store identification number for specific site into cookies files
    • second request header -> Cookie: number (extract identification number for specific site from cookies files)
    • function: create User Session Layer on top of stateless HTTP

    Process

    Port to Transport Layer

    • bandwidth-sensitive application: UDP
    • reliable-sensitive application: TCP
    email                   - SMTP              - TCP\nremote terminal access  - Telnet            - TCP\nWeb                     - HTTP/HTTPS        - TCP\nfile transfer            - FTP               - TCP\nstreaming multimedia    - HTTP/HTTPS/RTP    - TCP/UDP\ninternet telephony      - SIP/RTP           - UDP\n
    1
    2
    3
    4
    5
    6

    Address

    • (32 bits network layer )IP : find specific host/end-system
    • (16 bits transport layer)port: find specific process

    Transport Layer

    TCP(Transmission Control Protocol)

    • connection-oriented service
    • in-sequence stream of bytes service
    • reliable delivery
    • congestion control

    3-way handshake

    • SYN -> SYN/ACK -> ACK
    • FIN(toB) -> [Data+]ACK(toA) -> FIN(toA) -> ACK(toB)

    UDP

    User Datagram Protocol:

    • lightweight and connectionless
    • datagram service
    • unreliable delivery
    • udp header: source port(16 bit), destination port(16 bit), checksum(16 bit), length(16 bit)

    ICMP

    Internet Control Message Protocol:

    • report error conditions back
    • help diagnose problems
    • site above IP

    ICMP Message Type

    • 0 type 0 code: echo reply(by ping)
    • 3 type 0 code: destination network unreachable
    • 3 type 1 code: destination host unreachable
    • 3 type 3 code: destination port unreachable
    • 8 type 0 code: echo request(by ping)
    • 11 type 0 code: TTL(time to live) Expired(by ping)

    Error Detection

    • TCP/IP: checksums(1 bit)
    • Ethernet(Link Layer): cyclic redundancy code(2 bit/more)
    • SSL(Secure Sockets Layer)/TLS(Transport Layer Security): message authentication code(MAC)(cryptographic data) - prevent malicious attacks

    Slide Window and Retransmission

    • SWZ N and RWS 1: go back N
    • SWZ N and RWZ N: selective repeat

    Network Layer

    IP Service Model

    • prevent packets looping forever(TTL/time to live field in header): if TTL gets decreased to zero, then drop this datagram
    • limit fragment packets size(Packet ID, Flags, Fragment Offset)
    • reduce changes of wrong destination(Checksum, Destination Address)

    IPv4 Addresses

    • 32 bits long: a.b.c.d

    Address Structure

    • historical: class A: 0-network(7 bits)-host(24 bits) class B: 10-network(14 bits)-host(16 bits) class C: 110-network(21 bits)-host(8 bits)
    • today: 171.64.0.0/16 means 171.64.0.0 to 171.64.255.255, A/24 describes 256 addresses, A/20 describes 4096 addresses
    • longest prefix matching and netmask(A/16 e.g 0.0.0.0/0 => matching all addresses)

    ARP(Address Resolution Protocol)

    • generates mappings between link layer and network layer addresses cached in nodes
    • request-reply protocol: who has network address X => I have network address X
    • request sent to link layer broadcast address, reply sent to requesting address
    • when request to dest ARP packet header with empty DEST HARDWARE ADDRESS field and opcode 1(request)
    • when reply to src ARP packet header with dest hardware address as SRC HARDWARE ADDRESS field, src hardware address as DEST HARDWARE ADDRESS field and opcode 2(reply)
    • if A and B aren't in same sub-net, they delivery ARP broadcast with third public gateway

    Packet Format

    Endian

    • network is big-endian
    • in x86 processor, use htons()/ntohs()/htonl()/ntohl() host: network -short/long helper function to transform format
    #include <arpa/inet.h>\n\nuint16_t http_port = 80;\nuint16_t packet_port = ntohs(packet->port);\n\nif (packet_port == http_port) {\n    // OK\n}\n
    1
    2
    3
    4
    5
    6
    7
    8

    WireShark

    WireShark SetUp

    sudo dpkg-reconfigure wireshark-common\nsudo gpasswd -a $USER wireshark\n
    1
    2

    Other Tools

    • ifconfig + egrep
    • netstat + egrep
    • tcpdump
    • nslookup
    ',70);n.render=function(r,s,n,i,l,o){return e(),a("div",null,[t])};export default n;export{s as __pageData}; diff --git a/assets/computerScience_network_networkBasicNotes.md.81a62821.lean.js b/assets/computerScience_network_networkBasicNotes.md.81a62821.lean.js new file mode 100644 index 00000000000..d343079b7b7 --- /dev/null +++ b/assets/computerScience_network_networkBasicNotes.md.81a62821.lean.js @@ -0,0 +1 @@ +import{o as e,c as a,a as r}from"./app.6dd2a1b7.js";const s='{"title":"Computer NetWorking Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Computer Network and Internet","slug":"computer-network-and-internet"},{"level":3,"title":"What is Internet","slug":"what-is-internet"},{"level":2,"title":"Application Layer","slug":"application-layer"},{"level":3,"title":"Application Layer Protocol","slug":"application-layer-protocol"},{"level":3,"title":"HTTP","slug":"http"},{"level":3,"title":"Process","slug":"process"},{"level":2,"title":"Transport Layer","slug":"transport-layer"},{"level":3,"title":"TCP(Transmission Control Protocol)","slug":"tcp-transmission-control-protocol"},{"level":3,"title":"UDP","slug":"udp"},{"level":3,"title":"ICMP","slug":"icmp"},{"level":3,"title":"Error Detection","slug":"error-detection"},{"level":3,"title":"Slide Window and Retransmission","slug":"slide-window-and-retransmission"},{"level":2,"title":"Network Layer","slug":"network-layer"},{"level":3,"title":"IP Service Model","slug":"ip-service-model"},{"level":3,"title":"IPv4 Addresses","slug":"ipv4-addresses"},{"level":3,"title":"ARP(Address Resolution Protocol)","slug":"arp-address-resolution-protocol"},{"level":3,"title":"Packet Format","slug":"packet-format"},{"level":2,"title":"WireShark","slug":"wireshark"},{"level":3,"title":"WireShark SetUp","slug":"wireshark-setup"},{"level":2,"title":"Other Tools","slug":"other-tools"}],"relativePath":"computerScience/network/networkBasicNotes.md","lastUpdated":1627194884000}',n={},t=r('',70);n.render=function(r,s,n,i,l,o){return e(),a("div",null,[t])};export default n;export{s as __pageData}; diff --git a/assets/computerScience_operatingSystems_CSAPP.md.fa06cc16.js b/assets/computerScience_operatingSystems_CSAPP.md.fa06cc16.js new file mode 100644 index 00000000000..72451a0949d --- /dev/null +++ b/assets/computerScience_operatingSystems_CSAPP.md.fa06cc16.js @@ -0,0 +1 @@ +import{o as n,c as s,b as a,d as t}from"./app.6dd2a1b7.js";const e='{"title":"Computer Systems: A Programmer\'s Perspective - System Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"机器码与进制转换","slug":"机器码与进制转换"},{"level":3,"title":"浮点数","slug":"浮点数"},{"level":3,"title":"Stack Frame","slug":"stack-frame"},{"level":2,"title":"Architecture","slug":"architecture"},{"level":3,"title":"Control Signal","slug":"control-signal"},{"level":3,"title":"Special Control Signal","slug":"special-control-signal"},{"level":3,"title":"Procedure Control Signal","slug":"procedure-control-signal"},{"level":3,"title":"Forwarding","slug":"forwarding"},{"level":3,"title":"Exception","slug":"exception"},{"level":3,"title":"Efficiency","slug":"efficiency"},{"level":2,"title":"Optimization","slug":"optimization"},{"level":3,"title":"Principles","slug":"principles"},{"level":3,"title":"Tips","slug":"tips"},{"level":2,"title":"异常控制流","slug":"异常控制流"},{"level":3,"title":"异常","slug":"异常"},{"level":3,"title":"进程","slug":"进程"},{"level":3,"title":"信号","slug":"信号"},{"level":3,"title":"非本地跳转","slug":"非本地跳转"},{"level":2,"title":"系统级 I/O","slug":"系统级-i-o"},{"level":3,"title":"socket I/O","slug":"socket-i-o"},{"level":2,"title":"网络","slug":"网络"},{"level":2,"title":"并发","slug":"并发"},{"level":3,"title":"锁","slug":"锁"},{"level":2,"title":"调试/测试","slug":"调试-测试"},{"level":3,"title":"日志","slug":"日志"}],"relativePath":"computerScience/operatingSystems/CSAPP.md","lastUpdated":1627194884000}',l={},o=a("h1",{id:"computer-systems-a-programmer-s-perspective-system-basic-notes"},[a("a",{class:"header-anchor",href:"#computer-systems-a-programmer-s-perspective-system-basic-notes","aria-hidden":"true"},"#"),t(" Computer Systems: A Programmer's Perspective - System Basic Notes")],-1),c=a("p",null,[a("div",{class:"table-of-contents"},[a("ul",null,[a("li",null,[a("a",{href:"#computer-systems-a-programmer-s-perspective-system-basic-notes"},"Computer Systems: A Programmer's Perspective - System Basic Notes"),a("ul",null,[a("li",null,[a("a",{href:"#机器码与进制转换"},"机器码与进制转换")]),a("li",null,[a("a",{href:"#architecture"},"Architecture")]),a("li",null,[a("a",{href:"#optimization"},"Optimization")]),a("li",null,[a("a",{href:"#异常控制流"},"异常控制流")]),a("li",null,[a("a",{href:"#系统级-i-o"},"系统级 I/O")]),a("li",null,[a("a",{href:"#网络"},"网络")]),a("li",null,[a("a",{href:"#并发"},"并发")]),a("li",null,[a("a",{href:"#调试-测试"},"调试/测试")])])])])])],-1),p=a("h2",{id:"机器码与进制转换"},[a("a",{class:"header-anchor",href:"#机器码与进制转换","aria-hidden":"true"},"#"),t(" 机器码与进制转换")],-1),u=a("h3",{id:"浮点数"},[a("a",{class:"header-anchor",href:"#浮点数","aria-hidden":"true"},"#"),t(" 浮点数")],-1),r=a("p",null,[t("规格化浮点数: "),a("a",{href:"http://1.xxx",target:"_blank",rel:"noopener noreferrer"},"1.xxx"),t(" _ 2^(exp - 127) - e.g "),a("code",null,"5 = 5.0 = 1.25 _ 2^(129 - 127)")],-1),i=a("ul",null,[a("li",null,"xxx: 尾数"),a("li",null,"exp: 阶码")],-1),k=a("h3",{id:"stack-frame"},[a("a",{class:"header-anchor",href:"#stack-frame","aria-hidden":"true"},"#"),t(" Stack Frame")],-1),b=a("p",null,[a("img",{src:"/awesome-notes/assets/stack_frame.daa8403a.png",alt:"stack frame"})],-1),d=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[t("# 准备阶段\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),t(),a("span",{class:"token expression"},[t("Caller"),a("span",{class:"token operator"},"-"),t("Save"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token operator"},"%"),t("eax "),a("span",{class:"token operator"},"%"),t("ecx "),a("span",{class:"token operator"},"%"),t("edx")])]),t("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),t(),a("span",{class:"token expression"},[t("Callee"),a("span",{class:"token operator"},"-"),t("Save"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token operator"},"%"),t("ebx "),a("span",{class:"token operator"},"%"),t("esi "),a("span",{class:"token operator"},"%"),t("edi")])]),t("\n# 传参顺序"),a("span",{class:"token operator"},":"),t(" rdi"),a("span",{class:"token punctuation"},","),t(" dsi"),a("span",{class:"token punctuation"},","),t(" rdx"),a("span",{class:"token punctuation"},","),t(" rcx"),a("span",{class:"token punctuation"},","),t(" r8"),a("span",{class:"token punctuation"},","),t(" r9"),a("span",{class:"token punctuation"},","),t(" stack\n\npushl "),a("span",{class:"token operator"},"%"),t("ebp\nmovl "),a("span",{class:"token operator"},"%"),t("esp"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token operator"},"%"),t("ebp\npushl "),a("span",{class:"token operator"},"%"),t("ebx\n\n# 结束阶段\n\nmovl "),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"%"),t("ebp"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token operator"},"%"),t("ebx\nmovl "),a("span",{class:"token operator"},"%"),t("ebp"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token operator"},"%"),t("esp\npopl "),a("span",{class:"token operator"},"%"),t("ebp\nret\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br")])],-1),m=a("p",null,[a("code",null,"x86_64"),t(": 可使用超出 Stack Pointer 128 bytes 的内存区域, 称为 Red Zone.")],-1),h=a("h2",{id:"architecture"},[a("a",{class:"header-anchor",href:"#architecture","aria-hidden":"true"},"#"),t(" Architecture")],-1),f=a("h3",{id:"control-signal"},[a("a",{class:"header-anchor",href:"#control-signal","aria-hidden":"true"},"#"),t(" Control Signal")],-1),g=a("table",null,[a("thead",null,[a("tr",null,[a("th",{style:{"text-align":"left"}},"State"),a("th",{style:{"text-align":"left"}},"Signal")])]),a("tbody",null,[a("tr",null,[a("td",{style:{"text-align":"left"}},"Fetch"),a("td",{style:{"text-align":"left"}},"icode,ifun rA,rB valC,valP")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"Decode"),a("td",{style:{"text-align":"left"}},"valA,srcA valB,srcB")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"Execute"),a("td",{style:{"text-align":"left"}},"valE Condition")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"Memory"),a("td",{style:{"text-align":"left"}},"valM read/write")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"WriteBack"),a("td",{style:{"text-align":"left"}},"E port,dstE M port,dstM")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"PCUpdate"),a("td",{style:{"text-align":"left"}},"PC")])])],-1),y=a("h3",{id:"special-control-signal"},[a("a",{class:"header-anchor",href:"#special-control-signal","aria-hidden":"true"},"#"),t(" Special Control Signal")],-1),w=a("ul",null,[a("li",null,[t("handle ret: "),a("code",null,"IRET in {D_icode, E_icode, M_icode}")]),a("li",null,[t("load/use hazard: "),a("code",null,"E_icode in {IMRMOVL, IPOPL} && E_dstM in {d_srcA, d_srcB}")]),a("li",null,[t("mispredicted branch: "),a("code",null,"E_icode in {IJXX} && !e_Cnd")]),a("li",null,[t("exception: "),a("code",null,"m_stat in {SADR, SINS, SHLT} || W_stat in {SADR, SINS, SHLT}")])],-1),_=a("h3",{id:"procedure-control-signal"},[a("a",{class:"header-anchor",href:"#procedure-control-signal","aria-hidden":"true"},"#"),t(" Procedure Control Signal")],-1),v=a("p",null,"Branch, Loop, Jump:",-1),x=a("p",null,[t("PrectPC | "),a("code",null,"W_valM"),t("(无法预测) | "),a("code",null,"M_valP/M_valA"),t(" (在译码阶段合并信号量 valA 与 valP: PCUpdate 位于 Fetch,无需传递 valP, 只剩 call/jump 需要 valP)")],-1),S=a("ul",null,[a("li",null,"AT: always taken"),a("li",null,"NT: never taken"),a("li",null,"BTFNT: backward taken forward not taken")],-1),I=a("h3",{id:"forwarding"},[a("a",{class:"header-anchor",href:"#forwarding","aria-hidden":"true"},"#"),t(" Forwarding")],-1),L=a("p",null,"流水线中最早阶段的转发源, 优先级最高 execute > memory > write",-1),C=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"int"),t(" d_valA "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"["),t("\n D_icode in "),a("span",{class:"token operator"},"{"),t("ICALL"),a("span",{class:"token punctuation"},","),t(" IJXX"),a("span",{class:"token operator"},"}"),a("span",{class:"token punctuation"},":"),t(" D_valP"),a("span",{class:"token punctuation"},";"),t("\n\n d_srcA "),a("span",{class:"token operator"},"=="),t(" e_dstE "),a("span",{class:"token punctuation"},":"),t(" e_valE"),a("span",{class:"token punctuation"},";"),t("\n d_srcA "),a("span",{class:"token operator"},"=="),t(" M_dstM "),a("span",{class:"token punctuation"},":"),t(" m_valM"),a("span",{class:"token punctuation"},";"),t("\n d_srcA "),a("span",{class:"token operator"},"=="),t(" M_dstE "),a("span",{class:"token punctuation"},":"),t(" M_valE"),a("span",{class:"token punctuation"},";"),t("\n d_srcA "),a("span",{class:"token operator"},"=="),t(" W_dstM "),a("span",{class:"token punctuation"},":"),t(" W_valM"),a("span",{class:"token punctuation"},";"),t("\n d_srcA "),a("span",{class:"token operator"},"=="),t(" W_dstE "),a("span",{class:"token punctuation"},":"),t(" W_valE"),a("span",{class:"token punctuation"},";"),t("\n\n # register file\n "),a("span",{class:"token number"},"1"),t(),a("span",{class:"token punctuation"},":"),t(" d_rvalA"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br")])],-1),E=a("h3",{id:"exception"},[a("a",{class:"header-anchor",href:"#exception","aria-hidden":"true"},"#"),t(" Exception")],-1),A=a("p",null,"流水线中最深的指令引起的异常, 优先级最高 e.g 访存阶段地址越界异常优先级高于取指阶段地址越界异常优先级",-1),N=a("h3",{id:"efficiency"},[a("a",{class:"header-anchor",href:"#efficiency","aria-hidden":"true"},"#"),t(" Efficiency")],-1),P=a("p",null,"CPI = 1.0 + lp + mp + rp:",-1),D=a("ul",null,[a("li",null,"lp: load penalty(load/use hazard)"),a("li",null,"mp: mispredicted branch penalty"),a("li",null,"rp: return penalty")],-1),M=a("h2",{id:"optimization"},[a("a",{class:"header-anchor",href:"#optimization","aria-hidden":"true"},"#"),t(" Optimization")],-1),z=a("h3",{id:"principles"},[a("a",{class:"header-anchor",href:"#principles","aria-hidden":"true"},"#"),t(" Principles")],-1),O=a("ul",null,[a("li",null,"合适的算法和数据结构"),a("li",null,"编写编译器能够有效优化的代码 e.g 寄存器别名,存储器别名,函数的副作用 导致编译器无法(不敢)合并/删除冗余代码"),a("li",null,"提高代码的并行性"),a("li",null,"消除不必要的访存 e.g 多次访存(可用中间量优化), 多次函数调用(可用宏/内联函数优化)")],-1),T=a("h3",{id:"tips"},[a("a",{class:"header-anchor",href:"#tips","aria-hidden":"true"},"#"),t(" Tips")],-1),B=a("h4",{id:"replacement"},[a("a",{class:"header-anchor",href:"#replacement","aria-hidden":"true"},"#"),t(" Replacement")],-1),U=a("ul",null,[a("li",null,"用多条 Shift/Add/Sub 指令, 代替 Mul/Div")],-1),G=a("h4",{id:"branch"},[a("a",{class:"header-anchor",href:"#branch","aria-hidden":"true"},"#"),t(" Branch")],-1),H=a("ul",null,[a("li",null,"利用条件表达式代替条件分支语句: 降低预测错误惩罚")],-1),R=a("h4",{id:"code-motion"},[a("a",{class:"header-anchor",href:"#code-motion","aria-hidden":"true"},"#"),t(" Code Motion")],-1),j=a("ul",null,[a("li",null,"将不变测试条件/常变量的计算从循环中移出"),a("li",null,"将多次访存利用中间自动/寄存器变量改写成一次访存")],-1),F=a("h4",{id:"unrolling-duff-s-device"},[a("a",{class:"header-anchor",href:"#unrolling-duff-s-device","aria-hidden":"true"},"#"),t(" Unrolling (Duff's Device)")],-1),W=a("p",null,"循环展开: 增大循环的步长 - Duff's Device 以 7 为步长:",-1),X=a("ul",null,[a("li",null,"提升循环的运行效率"),a("li",null,"一次循环内: 可先将所有数据先读出来(Memory State),将进行计算(Execute State), 从而消除 Load/Use 冒险而产生的 Bubble")],-1),K=a("h2",{id:"异常控制流"},[a("a",{class:"header-anchor",href:"#异常控制流","aria-hidden":"true"},"#"),t(" 异常控制流")],-1),J=a("p",null,"理解异常控制流,有助于理解以下概念:",-1),V=a("ul",null,[a("li",null,"陷阱(trap)/系统调用(system call)"),a("li",null,"系统级 I/O"),a("li",null,"线程/进程(concurrency)"),a("li",null,"虚拟存储器"),a("li",null,"软件异常")],-1),Z=a("h3",{id:"异常"},[a("a",{class:"header-anchor",href:"#异常","aria-hidden":"true"},"#"),t(" 异常")],-1),q=a("h4",{id:"分类"},[a("a",{class:"header-anchor",href:"#分类","aria-hidden":"true"},"#"),t(" 分类")],-1),Q=a("table",null,[a("thead",null,[a("tr",null,[a("th",{style:{"text-align":"left"}},"类别"),a("th",{style:{"text-align":"left"}},"原因"),a("th",{style:{"text-align":"left"}},"异步/同步"),a("th",{style:{"text-align":"left"}},"返回行为"),a("th",{style:{"text-align":"left"}},"例子")])]),a("tbody",null,[a("tr",null,[a("td",{style:{"text-align":"left"}},"interrupt"),a("td",{style:{"text-align":"left"}},"输入/输出外部中断"),a("td",{style:{"text-align":"left"}},"async"),a("td",{style:{"text-align":"left"}},"next(concurrency)"),a("td",{style:{"text-align":"left"}},"磁盘")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"trap"),a("td",{style:{"text-align":"left"}},"主动异常/系统调用"),a("td",{style:{"text-align":"left"}},"sync"),a("td",{style:{"text-align":"left"}},"next"),a("td",{style:{"text-align":"left"}},"write/intN")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"fault"),a("td",{style:{"text-align":"left"}},"潜在可恢复的错误"),a("td",{style:{"text-align":"left"}},"sync"),a("td",{style:{"text-align":"left"}},"current/abort"),a("td",{style:{"text-align":"left"}},"seg/float exp")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"abort"),a("td",{style:{"text-align":"left"}},"不可恢复的错误"),a("td",{style:{"text-align":"left"}},"sync"),a("td",{style:{"text-align":"left"}},"abort(not return)"),a("td",{style:{"text-align":"left"}},"硬件错误")])])],-1),Y=a("h4",{id:"异常处理程序"},[a("a",{class:"header-anchor",href:"#异常处理程序","aria-hidden":"true"},"#"),t(" 异常处理程序")],-1),$=a("p",null,"异常处理程序主要分为 3 类:",-1),nn=a("ul",null,[a("li",null,"控制权返回给 Instruction_current"),a("li",null,"控制权返回给 Instruction_next"),a("li",null,"abort/exit")],-1),sn=a("h3",{id:"进程"},[a("a",{class:"header-anchor",href:"#进程","aria-hidden":"true"},"#"),t(" 进程")],-1),an=a("ul",null,[a("li",null,"一个独立的逻辑控制流(并行执行)"),a("li",null,"一个私有的地址空间(缓存与虚拟存储器)")],-1),tn=a("h4",{id:"上下文"},[a("a",{class:"header-anchor",href:"#上下文","aria-hidden":"true"},"#"),t(" 上下文")],-1),en=a("ul",null,[a("li",null,"代码/数据,堆/栈,通用寄存器,程序计数器,环境变量,文件描述符集合"),a("li",null,"上下文切换:用户模式与内核模式的切换"),a("li",null,"高速缓存污染(pollution): 每次切换后,总是会发生 cold cache miss")],-1),ln=a("h4",{id:"进程控制"},[a("a",{class:"header-anchor",href:"#进程控制","aria-hidden":"true"},"#"),t(" 进程控制")],-1),on=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"include"),t(),a("span",{class:"token string"},"")]),t("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"include"),t(),a("span",{class:"token string"},"")]),t("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"include"),t(),a("span",{class:"token string"},"")]),t("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"include"),t(),a("span",{class:"token string"},"")]),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),cn=a("h5",{id:"创建和终止进程"},[a("a",{class:"header-anchor",href:"#创建和终止进程","aria-hidden":"true"},"#"),t(" 创建和终止进程")],-1),pn=a("ul",null,[a("li",null,"父进程与子进程获得 2 份独立的私有空间与 2 份独立的上下文, 不同的 PID(process id)"),a("li",null,"由于指针(如打开的文件描述符),有可能互相影响,但大体上互不影响")],-1),un=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/*\n * output: parent: x=0\n * output: child: x=2\n * 独立上下文代表拥有独立的通用寄存器与栈,代表拥有拷贝的自动变量(局部变量),互不影响地进行修改\n */"),t("\n"),a("span",{class:"token keyword"},"int"),t(),a("span",{class:"token function"},"main"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token class-name"},"pid_t"),t(" pid"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"int"),t(" x "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("\n\n pid "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"fork"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("pid "),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t(),a("span",{class:"token comment"},"// child"),t("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"child: x=%d\\n"'),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token operator"},"++"),t("x"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"exit"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// parent"),t("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"parent: x=%d\\n"'),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token operator"},"--"),t("x"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"exit"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br")])],-1),rn=a("h5",{id:"回收子进程"},[a("a",{class:"header-anchor",href:"#回收子进程","aria-hidden":"true"},"#"),t(" 回收子进程")],-1),kn=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),t(),a("span",{class:"token macro-name"},"N"),t(),a("span",{class:"token expression"},[a("span",{class:"token number"},"2")])]),t("\n\n"),a("span",{class:"token keyword"},"int"),t(),a("span",{class:"token function"},"main"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"int"),t(" status"),a("span",{class:"token punctuation"},","),t(" i"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token class-name"},"pid_t"),t(" pid"),a("span",{class:"token punctuation"},"["),t("N"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),t(" ret_pid"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),t("i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(" N"),a("span",{class:"token punctuation"},";"),t(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),t("pid"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"fork"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t(),a("span",{class:"token comment"},"// child"),t("\n "),a("span",{class:"token function"},"exit"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"100"),a("span",{class:"token operator"},"+"),t("i"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// parent reaps(回收) N children in order"),t("\n i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"while"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),t("ret_pid "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"waitpid"),a("span",{class:"token punctuation"},"("),t("pid"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token operator"},"&"),t("status"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},">"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"WIFEXITED"),a("span",{class:"token punctuation"},"("),t("statue"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"child: %d terminated normally with exit status=%d\\n"'),a("span",{class:"token punctuation"},","),t("\n ret_pid"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token function"},"WEXITSTATUS"),a("span",{class:"token punctuation"},"("),t("status"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"child %d terminated abnormally\\n"'),a("span",{class:"token punctuation"},","),t(" ret_pid"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// only if there are no more children, it can exit normally"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("errno "),a("span",{class:"token operator"},"!="),t(" ECHILD"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"unix_error"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"waitpid error"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t(),a("span",{class:"token comment"},"// exit with error log"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token function"},"exit"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t(),a("span",{class:"token comment"},"// exit normally"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br")])],-1),bn=a("h3",{id:"信号"},[a("a",{class:"header-anchor",href:"#信号","aria-hidden":"true"},"#"),t(" 信号")],-1),dn=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"include"),t(),a("span",{class:"token string"},"")]),t("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"include"),t(),a("span",{class:"token string"},"")]),t("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"include"),t(),a("span",{class:"token string"},"")]),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),mn=a("ul",null,[a("li",null,"一个只发出而未被处理的信号为待处理信号"),a("li",null,[t("一种类型至多有一个待处理信号, 多余待处理信号"),a("strong",null,"不会进入处理队列"),t(",只是"),a("strong",null,"被简单丢弃")]),a("li",null,"不可以用信号对其他事件进行计数, 同一事件多次发生产生的信号有可能被简单丢弃")],-1),hn=a("h4",{id:"处理信号"},[a("a",{class:"header-anchor",href:"#处理信号","aria-hidden":"true"},"#"),t(" 处理信号")],-1),fn=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"handler"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" sig"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token class-name"},"pid_t"),t(" pid"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"while"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),t("pid "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"waitpid"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token constant"},"NULL"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},">"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(" "),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"Handler reaped child %d\\n"'),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},")"),t("pid"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("errno "),a("span",{class:"token operator"},"!="),t(" ECHILD"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"unix_error"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"waitpid error"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"sleep"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token keyword"},"int"),t(),a("span",{class:"token function"},"main"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"int"),t(" i"),a("span",{class:"token punctuation"},","),t(" n"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"char"),t(" buf"),a("span",{class:"token punctuation"},"["),t("MAX_BUF"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token class-name"},"pid_t"),t(" pid"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"signal"),a("span",{class:"token punctuation"},"("),t("SIGCHLD"),a("span",{class:"token punctuation"},","),t(" handler"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"=="),t(" SIG_ERR"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"unix_error"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"signal error"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),t("i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},";"),t(" I"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n pid "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"fork"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("pid "),a("span",{class:"token operator"},"=="),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"Hello from child %d\\n"'),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},")"),a("span",{class:"token function"},"getpid"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"sleep"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"exit"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// manually restart the READ call"),t("\n "),a("span",{class:"token keyword"},"while"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),t("n "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"read"),a("span",{class:"token punctuation"},"("),t("STDIN_FILENO"),a("span",{class:"token punctuation"},","),t(" buf"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"sizeof"),a("span",{class:"token punctuation"},"("),t("buf"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("errno "),a("span",{class:"token operator"},"!="),t(" EINTR"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"unix_error"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"read error"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"Parent processing input\\n"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"while"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token function"},"exit"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br")])],-1),gn=a("h4",{id:"阻塞信号"},[a("a",{class:"header-anchor",href:"#阻塞信号","aria-hidden":"true"},"#"),t(" 阻塞信号")],-1),yn=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// how: SIG_BLOCK, SIG_UNBLOCK, SIG_SETMASK, 是否阻塞set中的信号合集"),t("\n"),a("span",{class:"token keyword"},"int"),t(),a("span",{class:"token function"},"sigprocmask"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" how"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"const"),t(),a("span",{class:"token class-name"},"sigset_t"),t(),a("span",{class:"token operator"},"*"),t("set"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token class-name"},"sigset_t"),t(),a("span",{class:"token operator"},"*"),t("old_set"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token keyword"},"int"),t(),a("span",{class:"token function"},"sigemptyset"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"sigset_t"),t(),a("span",{class:"token operator"},"*"),t("set"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"int"),t(),a("span",{class:"token function"},"sigfillset"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"sigset_t"),t(),a("span",{class:"token operator"},"*"),t("set"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"int"),t(),a("span",{class:"token function"},"sigaddset"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"sigset_t"),t(),a("span",{class:"token operator"},"*"),t("set"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),t(" sig_num"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"int"),t(),a("span",{class:"token function"},"sigdelset"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"sigset_t"),t(),a("span",{class:"token operator"},"*"),t("set"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),t(" sig_num"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"int"),t(),a("span",{class:"token function"},"sigismember"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"const"),t(),a("span",{class:"token class-name"},"sigset_t"),t(),a("span",{class:"token operator"},"*"),t("set, "),a("span",{class:"token keyword"},"int"),t(" sig_num"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),wn=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"handler"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" sig"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token class-name"},"pid_t"),t(" pid"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"while"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),t("pid "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"waitpid"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token constant"},"NULL"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},">"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"delete_job"),a("span",{class:"token punctuation"},"("),t("pid"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("errno "),a("span",{class:"token operator"},"!="),t(" ECHILD"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"unix_error"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"waitpid error"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token comment"},"// 保证父进程先执行 add_job, 再执行 delete_job"),t("\n"),a("span",{class:"token keyword"},"int"),t(),a("span",{class:"token function"},"main"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" argc"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"char"),t(),a("span",{class:"token operator"},"*"),a("span",{class:"token operator"},"*"),t("argv"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"int"),t(" pid"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token class-name"},"sigset_t"),t(" mask"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token function"},"signal"),a("span",{class:"token punctuation"},"("),t("SIGCHLD"),a("span",{class:"token punctuation"},","),t(" handler"),a("span",{class:"token punctuation"},";"),a("span",{class:"token punctuation"},")"),t("\n "),a("span",{class:"token function"},"init_job"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"while"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"sigemptyset"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"&"),t("mask"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"sigaddset"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"&"),t("mask"),a("span",{class:"token punctuation"},","),t(" SIGCHLD"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"sigprocmask"),a("span",{class:"token punctuation"},"("),t("SIG_BLOCK"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token operator"},"&"),t("mask"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token constant"},"NULL"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t(),a("span",{class:"token comment"},"// block SIGCHLD"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),t("pid "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"fork"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// unblock SIGCHLD in child, make it can transfer signal"),t("\n "),a("span",{class:"token function"},"sigprocmask"),a("span",{class:"token punctuation"},"("),t("SIG_UNBLOCK"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token operator"},"&"),t("mask"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token constant"},"NULL"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"execve"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"/bin/date"'),a("span",{class:"token punctuation"},","),t(" argv"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token constant"},"NULL"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// parent process"),t("\n "),a("span",{class:"token function"},"add_job"),a("span",{class:"token punctuation"},"("),t("pid"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token comment"},"// after add_job, unblock SIGCHLD, make it can handle signal"),t("\n "),a("span",{class:"token function"},"sigprocmask"),a("span",{class:"token punctuation"},"("),t("SIG_UNBLOCK"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token operator"},"&"),t("mask"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token constant"},"NULL"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br")])],-1),_n=a("h3",{id:"非本地跳转"},[a("a",{class:"header-anchor",href:"#非本地跳转","aria-hidden":"true"},"#"),t(" 非本地跳转")],-1),vn=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"include"),t(),a("span",{class:"token string"},"")]),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),xn=a("ul",null,[a("li",null,"setjmp - catch: 返回多次"),a("li",null,"longjmp - throw: 不返回")],-1),Sn=a("h2",{id:"系统级-i-o"},[a("a",{class:"header-anchor",href:"#系统级-i-o","aria-hidden":"true"},"#"),t(" 系统级 I/O")],-1),In=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// robust I/O"),t("\n"),a("span",{class:"token class-name"},"ssize_t"),t(),a("span",{class:"token function"},"rio_read_n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" fd"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token operator"},"*"),t("usr_buf"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token class-name"},"size_t"),t(" n"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token class-name"},"size_t"),t(" n_left "),a("span",{class:"token operator"},"="),t(" n"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token class-name"},"ssize_t"),t(" n_read"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"char"),t(),a("span",{class:"token operator"},"*"),t("buf_p "),a("span",{class:"token operator"},"="),t(" usr_buf"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"while"),t(),a("span",{class:"token punctuation"},"("),t("n_left "),a("span",{class:"token operator"},">"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),t("n_read "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"read"),a("span",{class:"token punctuation"},"("),t("fd"),a("span",{class:"token punctuation"},","),t(" buf_p"),a("span",{class:"token punctuation"},","),t(" n_left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("errno "),a("span",{class:"token operator"},"=="),t(" EINTR"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n n_read "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(),a("span",{class:"token comment"},"// interrupted by signal_handler, re-call read()"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("n_read "),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"break"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n n_left "),a("span",{class:"token operator"},"-="),t(" n_read"),a("span",{class:"token punctuation"},";"),t("\n buf_p "),a("span",{class:"token operator"},"+="),t(" n_read"),a("span",{class:"token punctuation"},";"),t(),a("span",{class:"token comment"},"// remove data from buf_p"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token punctuation"},"("),t("n "),a("span",{class:"token operator"},"-"),t(" left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n\n"),a("span",{class:"token class-name"},"ssize_t"),t(),a("span",{class:"token function"},"rio_write_n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" fd"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token operator"},"*"),t("usr_buf"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token class-name"},"size_t"),t(" n"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token class-name"},"size_t"),t(" n_left "),a("span",{class:"token operator"},"="),t(" n"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token class-name"},"ssize_t"),t(" n_written"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"char"),t(),a("span",{class:"token operator"},"*"),t("buf_p "),a("span",{class:"token operator"},"="),t(" usr_buf"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"while"),t(),a("span",{class:"token punctuation"},"("),t("n_left "),a("span",{class:"token operator"},">"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),t("n_written "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"read"),a("span",{class:"token punctuation"},"("),t("fd"),a("span",{class:"token punctuation"},","),t(" buf_p"),a("span",{class:"token punctuation"},","),t(" n_left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("errno "),a("span",{class:"token operator"},"=="),t(" EINTR"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n n_written "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(),a("span",{class:"token comment"},"// interrupted by signal_handler, re-call read()"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n n_left "),a("span",{class:"token operator"},"-="),t(" n_written"),a("span",{class:"token punctuation"},";"),t("\n buf_p "),a("span",{class:"token operator"},"+="),t(" n_written"),a("span",{class:"token punctuation"},";"),t(),a("span",{class:"token comment"},"// remove data from buf_p"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" n"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br")])],-1),Ln=a("h3",{id:"socket-i-o"},[a("a",{class:"header-anchor",href:"#socket-i-o","aria-hidden":"true"},"#"),t(" socket I/O")],-1),Cn=a("h4",{id:"限制"},[a("a",{class:"header-anchor",href:"#限制","aria-hidden":"true"},"#"),t(" 限制")],-1),En=a("p",null,"输出函数+输入函数: 中间必须插入 fflush, fseek, fsetpos, rewind 输入函数+输出函数: 中间必须插入 fseek, fsetpos, rewind",-1),An=a("h4",{id:"i-o-函数的选择"},[a("a",{class:"header-anchor",href:"#i-o-函数的选择","aria-hidden":"true"},"#"),t(" I/O 函数的选择")],-1),Nn=a("ul",null,[a("li",null,"sprintf+rio_written: 格式化输出至套接口"),a("li",null,"rio_readlineb + sscanf: 格式化输入")],-1),Pn=a("h2",{id:"网络"},[a("a",{class:"header-anchor",href:"#网络","aria-hidden":"true"},"#"),t(" 网络")],-1),Dn=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"include"),t(),a("span",{class:"token string"},"")]),t("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"include"),t(),a("span",{class:"token string"},"")]),t("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"include"),t(),a("span",{class:"token string"},"")]),t("\n\n"),a("span",{class:"token keyword"},"int"),t(),a("span",{class:"token function"},"main"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" argc"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"char"),t(),a("span",{class:"token operator"},"*"),t("argv"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"char"),t(),a("span",{class:"token operator"},"*"),a("span",{class:"token operator"},"*"),t("pp"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"struct"),t(),a("span",{class:"token class-name"},"in_addr"),t(" addr"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"struct"),t(),a("span",{class:"token class-name"},"hostent"),t(),a("span",{class:"token operator"},"*"),t("host_p"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("argc "),a("span",{class:"token operator"},"!="),t(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"fprintf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"stderr"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},'"usage: %s \\n"'),a("span",{class:"token punctuation"},","),t(" argv"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"exit"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"inet_aton"),a("span",{class:"token punctuation"},"("),t("argv"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token operator"},"&"),t("addr"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"!="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n host_p "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"gethostbyaddr"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"const"),t(),a("span",{class:"token keyword"},"char"),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"&"),t("addr"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"sizeof"),a("span",{class:"token punctuation"},"("),t("addr"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),t(" AF_INET"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n host_p "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"gethostbyname"),a("span",{class:"token punctuation"},"("),t("argv"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"official hostname: %s\\n:"'),a("span",{class:"token punctuation"},","),t(" host_p"),a("span",{class:"token operator"},"->"),t("h_name"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),t("pp "),a("span",{class:"token operator"},"="),t(" host_p"),a("span",{class:"token operator"},"->"),t("h_aliases"),a("span",{class:"token punctuation"},";"),t(),a("span",{class:"token operator"},"*"),t("pp "),a("span",{class:"token operator"},"!="),t(),a("span",{class:"token constant"},"NULL"),a("span",{class:"token punctuation"},";"),t(" pp"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"alias: %s\\n"'),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token operator"},"*"),t("pp"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),t("pp "),a("span",{class:"token operator"},"="),t(" host_p"),a("span",{class:"token operator"},"->"),t("h_addr_list"),a("span",{class:"token punctuation"},";"),t(),a("span",{class:"token operator"},"*"),t("pp "),a("span",{class:"token operator"},"!="),t(),a("span",{class:"token constant"},"NULL"),a("span",{class:"token punctuation"},";"),t(" pp"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n addr"),a("span",{class:"token punctuation"},"."),t("s_addr "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"struct"),t(),a("span",{class:"token class-name"},"in_addr"),t(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"*"),t("pp"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"->"),t("s_addr"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"address: %s\\n"'),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token function"},"inet_ntoa"),a("span",{class:"token punctuation"},"("),t("addr"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token function"},"exit"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br")])],-1),Mn=a("h2",{id:"并发"},[a("a",{class:"header-anchor",href:"#并发","aria-hidden":"true"},"#"),t(" 并发")],-1),zn=a("h3",{id:"锁"},[a("a",{class:"header-anchor",href:"#锁","aria-hidden":"true"},"#"),t(" 锁")],-1),On=a("p",null,"防止死锁: 每对互斥锁(s, t), 每个线程顺序请求锁, 逆序释放锁",-1),Tn=a("h2",{id:"调试-测试"},[a("a",{class:"header-anchor",href:"#调试-测试","aria-hidden":"true"},"#"),t(" 调试/测试")],-1),Bn=a("h3",{id:"日志"},[a("a",{class:"header-anchor",href:"#日志","aria-hidden":"true"},"#"),t(" 日志")],-1),Un=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"unix_error"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"char"),t(),a("span",{class:"token operator"},"*"),t("msg"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"fprintf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"stderr"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},'"%s: %s\\n"'),a("span",{class:"token punctuation"},","),t(" msg"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token function"},"strerror"),a("span",{class:"token punctuation"},"("),t("errno"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"exit"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"posix_error"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" code"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"char"),t(),a("span",{class:"token operator"},"*"),t("msg"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"fprintf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"stderr"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},'"%s: %s\\n"'),a("span",{class:"token punctuation"},","),t(" msg"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token function"},"strerror"),a("span",{class:"token punctuation"},"("),t("code"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"exit"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"dns_error"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"char"),t(),a("span",{class:"token operator"},"*"),t("msg"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"fprintf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"stderr"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},'"%s: DNS error %d\\n"'),a("span",{class:"token punctuation"},","),t(" msg"),a("span",{class:"token punctuation"},","),t(" h_errno"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"exit"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"app_error"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"char"),t(),a("span",{class:"token operator"},"*"),t("msg"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"fprintf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"stderr"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},'"%s\\n"'),a("span",{class:"token punctuation"},","),t(" msg"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"exit"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br")])],-1);l.render=function(a,t,e,l,Gn,Hn){return n(),s("div",null,[o,c,p,u,r,i,k,b,d,m,h,f,g,y,w,_,v,x,S,I,L,C,E,A,N,P,D,M,z,O,T,B,U,G,H,R,j,F,W,X,K,J,V,Z,q,Q,Y,$,nn,sn,an,tn,en,ln,on,cn,pn,un,rn,kn,bn,dn,mn,hn,fn,gn,yn,wn,_n,vn,xn,Sn,In,Ln,Cn,En,An,Nn,Pn,Dn,Mn,zn,On,Tn,Bn,Un])};export default l;export{e as __pageData}; diff --git a/assets/computerScience_operatingSystems_CSAPP.md.fa06cc16.lean.js b/assets/computerScience_operatingSystems_CSAPP.md.fa06cc16.lean.js new file mode 100644 index 00000000000..72451a0949d --- /dev/null +++ b/assets/computerScience_operatingSystems_CSAPP.md.fa06cc16.lean.js @@ -0,0 +1 @@ +import{o as n,c as s,b as a,d as t}from"./app.6dd2a1b7.js";const e='{"title":"Computer Systems: A Programmer\'s Perspective - System Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"机器码与进制转换","slug":"机器码与进制转换"},{"level":3,"title":"浮点数","slug":"浮点数"},{"level":3,"title":"Stack Frame","slug":"stack-frame"},{"level":2,"title":"Architecture","slug":"architecture"},{"level":3,"title":"Control Signal","slug":"control-signal"},{"level":3,"title":"Special Control Signal","slug":"special-control-signal"},{"level":3,"title":"Procedure Control Signal","slug":"procedure-control-signal"},{"level":3,"title":"Forwarding","slug":"forwarding"},{"level":3,"title":"Exception","slug":"exception"},{"level":3,"title":"Efficiency","slug":"efficiency"},{"level":2,"title":"Optimization","slug":"optimization"},{"level":3,"title":"Principles","slug":"principles"},{"level":3,"title":"Tips","slug":"tips"},{"level":2,"title":"异常控制流","slug":"异常控制流"},{"level":3,"title":"异常","slug":"异常"},{"level":3,"title":"进程","slug":"进程"},{"level":3,"title":"信号","slug":"信号"},{"level":3,"title":"非本地跳转","slug":"非本地跳转"},{"level":2,"title":"系统级 I/O","slug":"系统级-i-o"},{"level":3,"title":"socket I/O","slug":"socket-i-o"},{"level":2,"title":"网络","slug":"网络"},{"level":2,"title":"并发","slug":"并发"},{"level":3,"title":"锁","slug":"锁"},{"level":2,"title":"调试/测试","slug":"调试-测试"},{"level":3,"title":"日志","slug":"日志"}],"relativePath":"computerScience/operatingSystems/CSAPP.md","lastUpdated":1627194884000}',l={},o=a("h1",{id:"computer-systems-a-programmer-s-perspective-system-basic-notes"},[a("a",{class:"header-anchor",href:"#computer-systems-a-programmer-s-perspective-system-basic-notes","aria-hidden":"true"},"#"),t(" Computer Systems: A Programmer's Perspective - System Basic Notes")],-1),c=a("p",null,[a("div",{class:"table-of-contents"},[a("ul",null,[a("li",null,[a("a",{href:"#computer-systems-a-programmer-s-perspective-system-basic-notes"},"Computer Systems: A Programmer's Perspective - System Basic Notes"),a("ul",null,[a("li",null,[a("a",{href:"#机器码与进制转换"},"机器码与进制转换")]),a("li",null,[a("a",{href:"#architecture"},"Architecture")]),a("li",null,[a("a",{href:"#optimization"},"Optimization")]),a("li",null,[a("a",{href:"#异常控制流"},"异常控制流")]),a("li",null,[a("a",{href:"#系统级-i-o"},"系统级 I/O")]),a("li",null,[a("a",{href:"#网络"},"网络")]),a("li",null,[a("a",{href:"#并发"},"并发")]),a("li",null,[a("a",{href:"#调试-测试"},"调试/测试")])])])])])],-1),p=a("h2",{id:"机器码与进制转换"},[a("a",{class:"header-anchor",href:"#机器码与进制转换","aria-hidden":"true"},"#"),t(" 机器码与进制转换")],-1),u=a("h3",{id:"浮点数"},[a("a",{class:"header-anchor",href:"#浮点数","aria-hidden":"true"},"#"),t(" 浮点数")],-1),r=a("p",null,[t("规格化浮点数: "),a("a",{href:"http://1.xxx",target:"_blank",rel:"noopener noreferrer"},"1.xxx"),t(" _ 2^(exp - 127) - e.g "),a("code",null,"5 = 5.0 = 1.25 _ 2^(129 - 127)")],-1),i=a("ul",null,[a("li",null,"xxx: 尾数"),a("li",null,"exp: 阶码")],-1),k=a("h3",{id:"stack-frame"},[a("a",{class:"header-anchor",href:"#stack-frame","aria-hidden":"true"},"#"),t(" Stack Frame")],-1),b=a("p",null,[a("img",{src:"/awesome-notes/assets/stack_frame.daa8403a.png",alt:"stack frame"})],-1),d=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[t("# 准备阶段\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),t(),a("span",{class:"token expression"},[t("Caller"),a("span",{class:"token operator"},"-"),t("Save"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token operator"},"%"),t("eax "),a("span",{class:"token operator"},"%"),t("ecx "),a("span",{class:"token operator"},"%"),t("edx")])]),t("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),t(),a("span",{class:"token expression"},[t("Callee"),a("span",{class:"token operator"},"-"),t("Save"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token operator"},"%"),t("ebx "),a("span",{class:"token operator"},"%"),t("esi "),a("span",{class:"token operator"},"%"),t("edi")])]),t("\n# 传参顺序"),a("span",{class:"token operator"},":"),t(" rdi"),a("span",{class:"token punctuation"},","),t(" dsi"),a("span",{class:"token punctuation"},","),t(" rdx"),a("span",{class:"token punctuation"},","),t(" rcx"),a("span",{class:"token punctuation"},","),t(" r8"),a("span",{class:"token punctuation"},","),t(" r9"),a("span",{class:"token punctuation"},","),t(" stack\n\npushl "),a("span",{class:"token operator"},"%"),t("ebp\nmovl "),a("span",{class:"token operator"},"%"),t("esp"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token operator"},"%"),t("ebp\npushl "),a("span",{class:"token operator"},"%"),t("ebx\n\n# 结束阶段\n\nmovl "),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"%"),t("ebp"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token operator"},"%"),t("ebx\nmovl "),a("span",{class:"token operator"},"%"),t("ebp"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token operator"},"%"),t("esp\npopl "),a("span",{class:"token operator"},"%"),t("ebp\nret\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br")])],-1),m=a("p",null,[a("code",null,"x86_64"),t(": 可使用超出 Stack Pointer 128 bytes 的内存区域, 称为 Red Zone.")],-1),h=a("h2",{id:"architecture"},[a("a",{class:"header-anchor",href:"#architecture","aria-hidden":"true"},"#"),t(" Architecture")],-1),f=a("h3",{id:"control-signal"},[a("a",{class:"header-anchor",href:"#control-signal","aria-hidden":"true"},"#"),t(" Control Signal")],-1),g=a("table",null,[a("thead",null,[a("tr",null,[a("th",{style:{"text-align":"left"}},"State"),a("th",{style:{"text-align":"left"}},"Signal")])]),a("tbody",null,[a("tr",null,[a("td",{style:{"text-align":"left"}},"Fetch"),a("td",{style:{"text-align":"left"}},"icode,ifun rA,rB valC,valP")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"Decode"),a("td",{style:{"text-align":"left"}},"valA,srcA valB,srcB")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"Execute"),a("td",{style:{"text-align":"left"}},"valE Condition")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"Memory"),a("td",{style:{"text-align":"left"}},"valM read/write")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"WriteBack"),a("td",{style:{"text-align":"left"}},"E port,dstE M port,dstM")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"PCUpdate"),a("td",{style:{"text-align":"left"}},"PC")])])],-1),y=a("h3",{id:"special-control-signal"},[a("a",{class:"header-anchor",href:"#special-control-signal","aria-hidden":"true"},"#"),t(" Special Control Signal")],-1),w=a("ul",null,[a("li",null,[t("handle ret: "),a("code",null,"IRET in {D_icode, E_icode, M_icode}")]),a("li",null,[t("load/use hazard: "),a("code",null,"E_icode in {IMRMOVL, IPOPL} && E_dstM in {d_srcA, d_srcB}")]),a("li",null,[t("mispredicted branch: "),a("code",null,"E_icode in {IJXX} && !e_Cnd")]),a("li",null,[t("exception: "),a("code",null,"m_stat in {SADR, SINS, SHLT} || W_stat in {SADR, SINS, SHLT}")])],-1),_=a("h3",{id:"procedure-control-signal"},[a("a",{class:"header-anchor",href:"#procedure-control-signal","aria-hidden":"true"},"#"),t(" Procedure Control Signal")],-1),v=a("p",null,"Branch, Loop, Jump:",-1),x=a("p",null,[t("PrectPC | "),a("code",null,"W_valM"),t("(无法预测) | "),a("code",null,"M_valP/M_valA"),t(" (在译码阶段合并信号量 valA 与 valP: PCUpdate 位于 Fetch,无需传递 valP, 只剩 call/jump 需要 valP)")],-1),S=a("ul",null,[a("li",null,"AT: always taken"),a("li",null,"NT: never taken"),a("li",null,"BTFNT: backward taken forward not taken")],-1),I=a("h3",{id:"forwarding"},[a("a",{class:"header-anchor",href:"#forwarding","aria-hidden":"true"},"#"),t(" Forwarding")],-1),L=a("p",null,"流水线中最早阶段的转发源, 优先级最高 execute > memory > write",-1),C=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"int"),t(" d_valA "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"["),t("\n D_icode in "),a("span",{class:"token operator"},"{"),t("ICALL"),a("span",{class:"token punctuation"},","),t(" IJXX"),a("span",{class:"token operator"},"}"),a("span",{class:"token punctuation"},":"),t(" D_valP"),a("span",{class:"token punctuation"},";"),t("\n\n d_srcA "),a("span",{class:"token operator"},"=="),t(" e_dstE "),a("span",{class:"token punctuation"},":"),t(" e_valE"),a("span",{class:"token punctuation"},";"),t("\n d_srcA "),a("span",{class:"token operator"},"=="),t(" M_dstM "),a("span",{class:"token punctuation"},":"),t(" m_valM"),a("span",{class:"token punctuation"},";"),t("\n d_srcA "),a("span",{class:"token operator"},"=="),t(" M_dstE "),a("span",{class:"token punctuation"},":"),t(" M_valE"),a("span",{class:"token punctuation"},";"),t("\n d_srcA "),a("span",{class:"token operator"},"=="),t(" W_dstM "),a("span",{class:"token punctuation"},":"),t(" W_valM"),a("span",{class:"token punctuation"},";"),t("\n d_srcA "),a("span",{class:"token operator"},"=="),t(" W_dstE "),a("span",{class:"token punctuation"},":"),t(" W_valE"),a("span",{class:"token punctuation"},";"),t("\n\n # register file\n "),a("span",{class:"token number"},"1"),t(),a("span",{class:"token punctuation"},":"),t(" d_rvalA"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br")])],-1),E=a("h3",{id:"exception"},[a("a",{class:"header-anchor",href:"#exception","aria-hidden":"true"},"#"),t(" Exception")],-1),A=a("p",null,"流水线中最深的指令引起的异常, 优先级最高 e.g 访存阶段地址越界异常优先级高于取指阶段地址越界异常优先级",-1),N=a("h3",{id:"efficiency"},[a("a",{class:"header-anchor",href:"#efficiency","aria-hidden":"true"},"#"),t(" Efficiency")],-1),P=a("p",null,"CPI = 1.0 + lp + mp + rp:",-1),D=a("ul",null,[a("li",null,"lp: load penalty(load/use hazard)"),a("li",null,"mp: mispredicted branch penalty"),a("li",null,"rp: return penalty")],-1),M=a("h2",{id:"optimization"},[a("a",{class:"header-anchor",href:"#optimization","aria-hidden":"true"},"#"),t(" Optimization")],-1),z=a("h3",{id:"principles"},[a("a",{class:"header-anchor",href:"#principles","aria-hidden":"true"},"#"),t(" Principles")],-1),O=a("ul",null,[a("li",null,"合适的算法和数据结构"),a("li",null,"编写编译器能够有效优化的代码 e.g 寄存器别名,存储器别名,函数的副作用 导致编译器无法(不敢)合并/删除冗余代码"),a("li",null,"提高代码的并行性"),a("li",null,"消除不必要的访存 e.g 多次访存(可用中间量优化), 多次函数调用(可用宏/内联函数优化)")],-1),T=a("h3",{id:"tips"},[a("a",{class:"header-anchor",href:"#tips","aria-hidden":"true"},"#"),t(" Tips")],-1),B=a("h4",{id:"replacement"},[a("a",{class:"header-anchor",href:"#replacement","aria-hidden":"true"},"#"),t(" Replacement")],-1),U=a("ul",null,[a("li",null,"用多条 Shift/Add/Sub 指令, 代替 Mul/Div")],-1),G=a("h4",{id:"branch"},[a("a",{class:"header-anchor",href:"#branch","aria-hidden":"true"},"#"),t(" Branch")],-1),H=a("ul",null,[a("li",null,"利用条件表达式代替条件分支语句: 降低预测错误惩罚")],-1),R=a("h4",{id:"code-motion"},[a("a",{class:"header-anchor",href:"#code-motion","aria-hidden":"true"},"#"),t(" Code Motion")],-1),j=a("ul",null,[a("li",null,"将不变测试条件/常变量的计算从循环中移出"),a("li",null,"将多次访存利用中间自动/寄存器变量改写成一次访存")],-1),F=a("h4",{id:"unrolling-duff-s-device"},[a("a",{class:"header-anchor",href:"#unrolling-duff-s-device","aria-hidden":"true"},"#"),t(" Unrolling (Duff's Device)")],-1),W=a("p",null,"循环展开: 增大循环的步长 - Duff's Device 以 7 为步长:",-1),X=a("ul",null,[a("li",null,"提升循环的运行效率"),a("li",null,"一次循环内: 可先将所有数据先读出来(Memory State),将进行计算(Execute State), 从而消除 Load/Use 冒险而产生的 Bubble")],-1),K=a("h2",{id:"异常控制流"},[a("a",{class:"header-anchor",href:"#异常控制流","aria-hidden":"true"},"#"),t(" 异常控制流")],-1),J=a("p",null,"理解异常控制流,有助于理解以下概念:",-1),V=a("ul",null,[a("li",null,"陷阱(trap)/系统调用(system call)"),a("li",null,"系统级 I/O"),a("li",null,"线程/进程(concurrency)"),a("li",null,"虚拟存储器"),a("li",null,"软件异常")],-1),Z=a("h3",{id:"异常"},[a("a",{class:"header-anchor",href:"#异常","aria-hidden":"true"},"#"),t(" 异常")],-1),q=a("h4",{id:"分类"},[a("a",{class:"header-anchor",href:"#分类","aria-hidden":"true"},"#"),t(" 分类")],-1),Q=a("table",null,[a("thead",null,[a("tr",null,[a("th",{style:{"text-align":"left"}},"类别"),a("th",{style:{"text-align":"left"}},"原因"),a("th",{style:{"text-align":"left"}},"异步/同步"),a("th",{style:{"text-align":"left"}},"返回行为"),a("th",{style:{"text-align":"left"}},"例子")])]),a("tbody",null,[a("tr",null,[a("td",{style:{"text-align":"left"}},"interrupt"),a("td",{style:{"text-align":"left"}},"输入/输出外部中断"),a("td",{style:{"text-align":"left"}},"async"),a("td",{style:{"text-align":"left"}},"next(concurrency)"),a("td",{style:{"text-align":"left"}},"磁盘")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"trap"),a("td",{style:{"text-align":"left"}},"主动异常/系统调用"),a("td",{style:{"text-align":"left"}},"sync"),a("td",{style:{"text-align":"left"}},"next"),a("td",{style:{"text-align":"left"}},"write/intN")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"fault"),a("td",{style:{"text-align":"left"}},"潜在可恢复的错误"),a("td",{style:{"text-align":"left"}},"sync"),a("td",{style:{"text-align":"left"}},"current/abort"),a("td",{style:{"text-align":"left"}},"seg/float exp")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"abort"),a("td",{style:{"text-align":"left"}},"不可恢复的错误"),a("td",{style:{"text-align":"left"}},"sync"),a("td",{style:{"text-align":"left"}},"abort(not return)"),a("td",{style:{"text-align":"left"}},"硬件错误")])])],-1),Y=a("h4",{id:"异常处理程序"},[a("a",{class:"header-anchor",href:"#异常处理程序","aria-hidden":"true"},"#"),t(" 异常处理程序")],-1),$=a("p",null,"异常处理程序主要分为 3 类:",-1),nn=a("ul",null,[a("li",null,"控制权返回给 Instruction_current"),a("li",null,"控制权返回给 Instruction_next"),a("li",null,"abort/exit")],-1),sn=a("h3",{id:"进程"},[a("a",{class:"header-anchor",href:"#进程","aria-hidden":"true"},"#"),t(" 进程")],-1),an=a("ul",null,[a("li",null,"一个独立的逻辑控制流(并行执行)"),a("li",null,"一个私有的地址空间(缓存与虚拟存储器)")],-1),tn=a("h4",{id:"上下文"},[a("a",{class:"header-anchor",href:"#上下文","aria-hidden":"true"},"#"),t(" 上下文")],-1),en=a("ul",null,[a("li",null,"代码/数据,堆/栈,通用寄存器,程序计数器,环境变量,文件描述符集合"),a("li",null,"上下文切换:用户模式与内核模式的切换"),a("li",null,"高速缓存污染(pollution): 每次切换后,总是会发生 cold cache miss")],-1),ln=a("h4",{id:"进程控制"},[a("a",{class:"header-anchor",href:"#进程控制","aria-hidden":"true"},"#"),t(" 进程控制")],-1),on=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"include"),t(),a("span",{class:"token string"},"")]),t("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"include"),t(),a("span",{class:"token string"},"")]),t("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"include"),t(),a("span",{class:"token string"},"")]),t("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"include"),t(),a("span",{class:"token string"},"")]),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),cn=a("h5",{id:"创建和终止进程"},[a("a",{class:"header-anchor",href:"#创建和终止进程","aria-hidden":"true"},"#"),t(" 创建和终止进程")],-1),pn=a("ul",null,[a("li",null,"父进程与子进程获得 2 份独立的私有空间与 2 份独立的上下文, 不同的 PID(process id)"),a("li",null,"由于指针(如打开的文件描述符),有可能互相影响,但大体上互不影响")],-1),un=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/*\n * output: parent: x=0\n * output: child: x=2\n * 独立上下文代表拥有独立的通用寄存器与栈,代表拥有拷贝的自动变量(局部变量),互不影响地进行修改\n */"),t("\n"),a("span",{class:"token keyword"},"int"),t(),a("span",{class:"token function"},"main"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token class-name"},"pid_t"),t(" pid"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"int"),t(" x "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("\n\n pid "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"fork"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("pid "),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t(),a("span",{class:"token comment"},"// child"),t("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"child: x=%d\\n"'),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token operator"},"++"),t("x"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"exit"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// parent"),t("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"parent: x=%d\\n"'),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token operator"},"--"),t("x"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"exit"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br")])],-1),rn=a("h5",{id:"回收子进程"},[a("a",{class:"header-anchor",href:"#回收子进程","aria-hidden":"true"},"#"),t(" 回收子进程")],-1),kn=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),t(),a("span",{class:"token macro-name"},"N"),t(),a("span",{class:"token expression"},[a("span",{class:"token number"},"2")])]),t("\n\n"),a("span",{class:"token keyword"},"int"),t(),a("span",{class:"token function"},"main"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"int"),t(" status"),a("span",{class:"token punctuation"},","),t(" i"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token class-name"},"pid_t"),t(" pid"),a("span",{class:"token punctuation"},"["),t("N"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),t(" ret_pid"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),t("i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(" N"),a("span",{class:"token punctuation"},";"),t(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),t("pid"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"fork"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t(),a("span",{class:"token comment"},"// child"),t("\n "),a("span",{class:"token function"},"exit"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"100"),a("span",{class:"token operator"},"+"),t("i"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// parent reaps(回收) N children in order"),t("\n i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"while"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),t("ret_pid "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"waitpid"),a("span",{class:"token punctuation"},"("),t("pid"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token operator"},"&"),t("status"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},">"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"WIFEXITED"),a("span",{class:"token punctuation"},"("),t("statue"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"child: %d terminated normally with exit status=%d\\n"'),a("span",{class:"token punctuation"},","),t("\n ret_pid"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token function"},"WEXITSTATUS"),a("span",{class:"token punctuation"},"("),t("status"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"child %d terminated abnormally\\n"'),a("span",{class:"token punctuation"},","),t(" ret_pid"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// only if there are no more children, it can exit normally"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("errno "),a("span",{class:"token operator"},"!="),t(" ECHILD"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"unix_error"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"waitpid error"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t(),a("span",{class:"token comment"},"// exit with error log"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token function"},"exit"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t(),a("span",{class:"token comment"},"// exit normally"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br")])],-1),bn=a("h3",{id:"信号"},[a("a",{class:"header-anchor",href:"#信号","aria-hidden":"true"},"#"),t(" 信号")],-1),dn=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"include"),t(),a("span",{class:"token string"},"")]),t("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"include"),t(),a("span",{class:"token string"},"")]),t("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"include"),t(),a("span",{class:"token string"},"")]),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),mn=a("ul",null,[a("li",null,"一个只发出而未被处理的信号为待处理信号"),a("li",null,[t("一种类型至多有一个待处理信号, 多余待处理信号"),a("strong",null,"不会进入处理队列"),t(",只是"),a("strong",null,"被简单丢弃")]),a("li",null,"不可以用信号对其他事件进行计数, 同一事件多次发生产生的信号有可能被简单丢弃")],-1),hn=a("h4",{id:"处理信号"},[a("a",{class:"header-anchor",href:"#处理信号","aria-hidden":"true"},"#"),t(" 处理信号")],-1),fn=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"handler"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" sig"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token class-name"},"pid_t"),t(" pid"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"while"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),t("pid "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"waitpid"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token constant"},"NULL"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},">"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(" "),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"Handler reaped child %d\\n"'),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},")"),t("pid"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("errno "),a("span",{class:"token operator"},"!="),t(" ECHILD"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"unix_error"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"waitpid error"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"sleep"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token keyword"},"int"),t(),a("span",{class:"token function"},"main"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"int"),t(" i"),a("span",{class:"token punctuation"},","),t(" n"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"char"),t(" buf"),a("span",{class:"token punctuation"},"["),t("MAX_BUF"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token class-name"},"pid_t"),t(" pid"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"signal"),a("span",{class:"token punctuation"},"("),t("SIGCHLD"),a("span",{class:"token punctuation"},","),t(" handler"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"=="),t(" SIG_ERR"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"unix_error"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"signal error"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),t("i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},";"),t(" I"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n pid "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"fork"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("pid "),a("span",{class:"token operator"},"=="),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"Hello from child %d\\n"'),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},")"),a("span",{class:"token function"},"getpid"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"sleep"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"exit"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// manually restart the READ call"),t("\n "),a("span",{class:"token keyword"},"while"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),t("n "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"read"),a("span",{class:"token punctuation"},"("),t("STDIN_FILENO"),a("span",{class:"token punctuation"},","),t(" buf"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"sizeof"),a("span",{class:"token punctuation"},"("),t("buf"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("errno "),a("span",{class:"token operator"},"!="),t(" EINTR"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"unix_error"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"read error"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"Parent processing input\\n"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"while"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token function"},"exit"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br")])],-1),gn=a("h4",{id:"阻塞信号"},[a("a",{class:"header-anchor",href:"#阻塞信号","aria-hidden":"true"},"#"),t(" 阻塞信号")],-1),yn=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// how: SIG_BLOCK, SIG_UNBLOCK, SIG_SETMASK, 是否阻塞set中的信号合集"),t("\n"),a("span",{class:"token keyword"},"int"),t(),a("span",{class:"token function"},"sigprocmask"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" how"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"const"),t(),a("span",{class:"token class-name"},"sigset_t"),t(),a("span",{class:"token operator"},"*"),t("set"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token class-name"},"sigset_t"),t(),a("span",{class:"token operator"},"*"),t("old_set"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token keyword"},"int"),t(),a("span",{class:"token function"},"sigemptyset"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"sigset_t"),t(),a("span",{class:"token operator"},"*"),t("set"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"int"),t(),a("span",{class:"token function"},"sigfillset"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"sigset_t"),t(),a("span",{class:"token operator"},"*"),t("set"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"int"),t(),a("span",{class:"token function"},"sigaddset"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"sigset_t"),t(),a("span",{class:"token operator"},"*"),t("set"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),t(" sig_num"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"int"),t(),a("span",{class:"token function"},"sigdelset"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"sigset_t"),t(),a("span",{class:"token operator"},"*"),t("set"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"int"),t(" sig_num"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"int"),t(),a("span",{class:"token function"},"sigismember"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"const"),t(),a("span",{class:"token class-name"},"sigset_t"),t(),a("span",{class:"token operator"},"*"),t("set, "),a("span",{class:"token keyword"},"int"),t(" sig_num"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),wn=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"handler"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" sig"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token class-name"},"pid_t"),t(" pid"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"while"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),t("pid "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"waitpid"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token constant"},"NULL"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},">"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"delete_job"),a("span",{class:"token punctuation"},"("),t("pid"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("errno "),a("span",{class:"token operator"},"!="),t(" ECHILD"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"unix_error"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"waitpid error"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token comment"},"// 保证父进程先执行 add_job, 再执行 delete_job"),t("\n"),a("span",{class:"token keyword"},"int"),t(),a("span",{class:"token function"},"main"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" argc"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"char"),t(),a("span",{class:"token operator"},"*"),a("span",{class:"token operator"},"*"),t("argv"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"int"),t(" pid"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token class-name"},"sigset_t"),t(" mask"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token function"},"signal"),a("span",{class:"token punctuation"},"("),t("SIGCHLD"),a("span",{class:"token punctuation"},","),t(" handler"),a("span",{class:"token punctuation"},";"),a("span",{class:"token punctuation"},")"),t("\n "),a("span",{class:"token function"},"init_job"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"while"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"sigemptyset"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"&"),t("mask"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"sigaddset"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"&"),t("mask"),a("span",{class:"token punctuation"},","),t(" SIGCHLD"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"sigprocmask"),a("span",{class:"token punctuation"},"("),t("SIG_BLOCK"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token operator"},"&"),t("mask"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token constant"},"NULL"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t(),a("span",{class:"token comment"},"// block SIGCHLD"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),t("pid "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"fork"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// unblock SIGCHLD in child, make it can transfer signal"),t("\n "),a("span",{class:"token function"},"sigprocmask"),a("span",{class:"token punctuation"},"("),t("SIG_UNBLOCK"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token operator"},"&"),t("mask"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token constant"},"NULL"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"execve"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"/bin/date"'),a("span",{class:"token punctuation"},","),t(" argv"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token constant"},"NULL"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// parent process"),t("\n "),a("span",{class:"token function"},"add_job"),a("span",{class:"token punctuation"},"("),t("pid"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token comment"},"// after add_job, unblock SIGCHLD, make it can handle signal"),t("\n "),a("span",{class:"token function"},"sigprocmask"),a("span",{class:"token punctuation"},"("),t("SIG_UNBLOCK"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token operator"},"&"),t("mask"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token constant"},"NULL"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br")])],-1),_n=a("h3",{id:"非本地跳转"},[a("a",{class:"header-anchor",href:"#非本地跳转","aria-hidden":"true"},"#"),t(" 非本地跳转")],-1),vn=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"include"),t(),a("span",{class:"token string"},"")]),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),xn=a("ul",null,[a("li",null,"setjmp - catch: 返回多次"),a("li",null,"longjmp - throw: 不返回")],-1),Sn=a("h2",{id:"系统级-i-o"},[a("a",{class:"header-anchor",href:"#系统级-i-o","aria-hidden":"true"},"#"),t(" 系统级 I/O")],-1),In=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// robust I/O"),t("\n"),a("span",{class:"token class-name"},"ssize_t"),t(),a("span",{class:"token function"},"rio_read_n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" fd"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token operator"},"*"),t("usr_buf"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token class-name"},"size_t"),t(" n"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token class-name"},"size_t"),t(" n_left "),a("span",{class:"token operator"},"="),t(" n"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token class-name"},"ssize_t"),t(" n_read"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"char"),t(),a("span",{class:"token operator"},"*"),t("buf_p "),a("span",{class:"token operator"},"="),t(" usr_buf"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"while"),t(),a("span",{class:"token punctuation"},"("),t("n_left "),a("span",{class:"token operator"},">"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),t("n_read "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"read"),a("span",{class:"token punctuation"},"("),t("fd"),a("span",{class:"token punctuation"},","),t(" buf_p"),a("span",{class:"token punctuation"},","),t(" n_left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("errno "),a("span",{class:"token operator"},"=="),t(" EINTR"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n n_read "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(),a("span",{class:"token comment"},"// interrupted by signal_handler, re-call read()"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("n_read "),a("span",{class:"token operator"},"=="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"break"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n n_left "),a("span",{class:"token operator"},"-="),t(" n_read"),a("span",{class:"token punctuation"},";"),t("\n buf_p "),a("span",{class:"token operator"},"+="),t(" n_read"),a("span",{class:"token punctuation"},";"),t(),a("span",{class:"token comment"},"// remove data from buf_p"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token punctuation"},"("),t("n "),a("span",{class:"token operator"},"-"),t(" left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n\n"),a("span",{class:"token class-name"},"ssize_t"),t(),a("span",{class:"token function"},"rio_write_n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" fd"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token operator"},"*"),t("usr_buf"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token class-name"},"size_t"),t(" n"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token class-name"},"size_t"),t(" n_left "),a("span",{class:"token operator"},"="),t(" n"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token class-name"},"ssize_t"),t(" n_written"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"char"),t(),a("span",{class:"token operator"},"*"),t("buf_p "),a("span",{class:"token operator"},"="),t(" usr_buf"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"while"),t(),a("span",{class:"token punctuation"},"("),t("n_left "),a("span",{class:"token operator"},">"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),t("n_written "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"read"),a("span",{class:"token punctuation"},"("),t("fd"),a("span",{class:"token punctuation"},","),t(" buf_p"),a("span",{class:"token punctuation"},","),t(" n_left"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("errno "),a("span",{class:"token operator"},"=="),t(" EINTR"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n n_written "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(),a("span",{class:"token comment"},"// interrupted by signal_handler, re-call read()"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n n_left "),a("span",{class:"token operator"},"-="),t(" n_written"),a("span",{class:"token punctuation"},";"),t("\n buf_p "),a("span",{class:"token operator"},"+="),t(" n_written"),a("span",{class:"token punctuation"},";"),t(),a("span",{class:"token comment"},"// remove data from buf_p"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" n"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br")])],-1),Ln=a("h3",{id:"socket-i-o"},[a("a",{class:"header-anchor",href:"#socket-i-o","aria-hidden":"true"},"#"),t(" socket I/O")],-1),Cn=a("h4",{id:"限制"},[a("a",{class:"header-anchor",href:"#限制","aria-hidden":"true"},"#"),t(" 限制")],-1),En=a("p",null,"输出函数+输入函数: 中间必须插入 fflush, fseek, fsetpos, rewind 输入函数+输出函数: 中间必须插入 fseek, fsetpos, rewind",-1),An=a("h4",{id:"i-o-函数的选择"},[a("a",{class:"header-anchor",href:"#i-o-函数的选择","aria-hidden":"true"},"#"),t(" I/O 函数的选择")],-1),Nn=a("ul",null,[a("li",null,"sprintf+rio_written: 格式化输出至套接口"),a("li",null,"rio_readlineb + sscanf: 格式化输入")],-1),Pn=a("h2",{id:"网络"},[a("a",{class:"header-anchor",href:"#网络","aria-hidden":"true"},"#"),t(" 网络")],-1),Dn=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"include"),t(),a("span",{class:"token string"},"")]),t("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"include"),t(),a("span",{class:"token string"},"")]),t("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"include"),t(),a("span",{class:"token string"},"")]),t("\n\n"),a("span",{class:"token keyword"},"int"),t(),a("span",{class:"token function"},"main"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" argc"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"char"),t(),a("span",{class:"token operator"},"*"),t("argv"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"char"),t(),a("span",{class:"token operator"},"*"),a("span",{class:"token operator"},"*"),t("pp"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"struct"),t(),a("span",{class:"token class-name"},"in_addr"),t(" addr"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"struct"),t(),a("span",{class:"token class-name"},"hostent"),t(),a("span",{class:"token operator"},"*"),t("host_p"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("argc "),a("span",{class:"token operator"},"!="),t(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"fprintf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"stderr"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},'"usage: %s \\n"'),a("span",{class:"token punctuation"},","),t(" argv"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"exit"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"inet_aton"),a("span",{class:"token punctuation"},"("),t("argv"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token operator"},"&"),t("addr"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"!="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n host_p "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"gethostbyaddr"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"const"),t(),a("span",{class:"token keyword"},"char"),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"&"),t("addr"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"sizeof"),a("span",{class:"token punctuation"},"("),t("addr"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),t(" AF_INET"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n host_p "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"gethostbyname"),a("span",{class:"token punctuation"},"("),t("argv"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"official hostname: %s\\n:"'),a("span",{class:"token punctuation"},","),t(" host_p"),a("span",{class:"token operator"},"->"),t("h_name"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),t("pp "),a("span",{class:"token operator"},"="),t(" host_p"),a("span",{class:"token operator"},"->"),t("h_aliases"),a("span",{class:"token punctuation"},";"),t(),a("span",{class:"token operator"},"*"),t("pp "),a("span",{class:"token operator"},"!="),t(),a("span",{class:"token constant"},"NULL"),a("span",{class:"token punctuation"},";"),t(" pp"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"alias: %s\\n"'),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token operator"},"*"),t("pp"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),t("pp "),a("span",{class:"token operator"},"="),t(" host_p"),a("span",{class:"token operator"},"->"),t("h_addr_list"),a("span",{class:"token punctuation"},";"),t(),a("span",{class:"token operator"},"*"),t("pp "),a("span",{class:"token operator"},"!="),t(),a("span",{class:"token constant"},"NULL"),a("span",{class:"token punctuation"},";"),t(" pp"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n addr"),a("span",{class:"token punctuation"},"."),t("s_addr "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"struct"),t(),a("span",{class:"token class-name"},"in_addr"),t(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"*"),t("pp"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"->"),t("s_addr"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"address: %s\\n"'),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token function"},"inet_ntoa"),a("span",{class:"token punctuation"},"("),t("addr"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token function"},"exit"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br")])],-1),Mn=a("h2",{id:"并发"},[a("a",{class:"header-anchor",href:"#并发","aria-hidden":"true"},"#"),t(" 并发")],-1),zn=a("h3",{id:"锁"},[a("a",{class:"header-anchor",href:"#锁","aria-hidden":"true"},"#"),t(" 锁")],-1),On=a("p",null,"防止死锁: 每对互斥锁(s, t), 每个线程顺序请求锁, 逆序释放锁",-1),Tn=a("h2",{id:"调试-测试"},[a("a",{class:"header-anchor",href:"#调试-测试","aria-hidden":"true"},"#"),t(" 调试/测试")],-1),Bn=a("h3",{id:"日志"},[a("a",{class:"header-anchor",href:"#日志","aria-hidden":"true"},"#"),t(" 日志")],-1),Un=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"unix_error"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"char"),t(),a("span",{class:"token operator"},"*"),t("msg"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"fprintf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"stderr"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},'"%s: %s\\n"'),a("span",{class:"token punctuation"},","),t(" msg"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token function"},"strerror"),a("span",{class:"token punctuation"},"("),t("errno"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"exit"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"posix_error"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),t(" code"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"char"),t(),a("span",{class:"token operator"},"*"),t("msg"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"fprintf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"stderr"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},'"%s: %s\\n"'),a("span",{class:"token punctuation"},","),t(" msg"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token function"},"strerror"),a("span",{class:"token punctuation"},"("),t("code"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"exit"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"dns_error"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"char"),t(),a("span",{class:"token operator"},"*"),t("msg"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"fprintf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"stderr"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},'"%s: DNS error %d\\n"'),a("span",{class:"token punctuation"},","),t(" msg"),a("span",{class:"token punctuation"},","),t(" h_errno"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"exit"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token keyword"},"void"),t(),a("span",{class:"token function"},"app_error"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"char"),t(),a("span",{class:"token operator"},"*"),t("msg"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"fprintf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"stderr"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},'"%s\\n"'),a("span",{class:"token punctuation"},","),t(" msg"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token function"},"exit"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br")])],-1);l.render=function(a,t,e,l,Gn,Hn){return n(),s("div",null,[o,c,p,u,r,i,k,b,d,m,h,f,g,y,w,_,v,x,S,I,L,C,E,A,N,P,D,M,z,O,T,B,U,G,H,R,j,F,W,X,K,J,V,Z,q,Q,Y,$,nn,sn,an,tn,en,ln,on,cn,pn,un,rn,kn,bn,dn,mn,hn,fn,gn,yn,wn,_n,vn,xn,Sn,In,Ln,Cn,En,An,Nn,Pn,Dn,Mn,zn,On,Tn,Bn,Un])};export default l;export{e as __pageData}; diff --git a/assets/computerScience_operatingSystems_operatingSystemsBasicNotes.md.5966c145.js b/assets/computerScience_operatingSystems_operatingSystemsBasicNotes.md.5966c145.js new file mode 100644 index 00000000000..4ca30070d7b --- /dev/null +++ b/assets/computerScience_operatingSystems_operatingSystemsBasicNotes.md.5966c145.js @@ -0,0 +1 @@ +import{o as n,c as a,a as s}from"./app.6dd2a1b7.js";const e='{"title":"Operating System Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"OS Definition","slug":"os-definition"},{"level":2,"title":"GCC 内联汇编","slug":"gcc-内联汇编"},{"level":2,"title":"基本概念","slug":"基本概念"},{"level":3,"title":"操作系统的特性","slug":"操作系统的特性"},{"level":3,"title":"操作系统的资源管理功能","slug":"操作系统的资源管理功能"},{"level":3,"title":"操作系统的演变","slug":"操作系统的演变"},{"level":3,"title":"操作系统虚拟机","slug":"操作系统虚拟机"},{"level":3,"title":"操作系统的组织结构","slug":"操作系统的组织结构"},{"level":3,"title":"并发","slug":"并发"},{"level":2,"title":"启动","slug":"启动"},{"level":3,"title":"BIOS","slug":"bios"},{"level":3,"title":"启动顺序","slug":"启动顺序"},{"level":2,"title":"物理内存管理","slug":"物理内存管理"},{"level":3,"title":"Boot Loader 探测机器内存分布","slug":"boot-loader-探测机器内存分布"},{"level":3,"title":"Boot Loader 基本概念","slug":"boot-loader-基本概念"},{"level":3,"title":"连续内存分配","slug":"连续内存分配"},{"level":3,"title":"非连续内存分配","slug":"非连续内存分配"},{"level":3,"title":"内存的特权级","slug":"内存的特权级"},{"level":2,"title":"虚拟内存管理","slug":"虚拟内存管理"},{"level":3,"title":"Page Fault","slug":"page-fault"},{"level":3,"title":"覆盖与交换","slug":"覆盖与交换"},{"level":3,"title":"虚拟页式存储管理","slug":"虚拟页式存储管理"},{"level":2,"title":"中断","slug":"中断"},{"level":3,"title":"中断进入","slug":"中断进入"},{"level":3,"title":"中断实现","slug":"中断实现"},{"level":3,"title":"系统调用","slug":"系统调用"},{"level":2,"title":"进程","slug":"进程"},{"level":3,"title":"进程特权级","slug":"进程特权级"},{"level":3,"title":"进程状态与生命周期","slug":"进程状态与生命周期"},{"level":3,"title":"进程通信","slug":"进程通信"},{"level":3,"title":"线程","slug":"线程"},{"level":3,"title":"内核线程与用户进程","slug":"内核线程与用户进程"},{"level":3,"title":"Process 实现","slug":"process-实现"},{"level":2,"title":"处理机调度","slug":"处理机调度"},{"level":3,"title":"调度时机","slug":"调度时机"},{"level":3,"title":"调度策略","slug":"调度策略"},{"level":2,"title":"同步互斥","slug":"同步互斥"},{"level":3,"title":"临界区的访问原则","slug":"临界区的访问原则"},{"level":3,"title":"基于软件方法的同步互斥","slug":"基于软件方法的同步互斥"},{"level":3,"title":"高级抽象的同步互斥","slug":"高级抽象的同步互斥"},{"level":3,"title":"死锁","slug":"死锁"},{"level":3,"title":"Mutex 实现","slug":"mutex-实现"},{"level":2,"title":"文件系统","slug":"文件系统"},{"level":3,"title":"文件组成","slug":"文件组成"},{"level":3,"title":"文件系统基本数据结构","slug":"文件系统基本数据结构"},{"level":3,"title":"文件分配","slug":"文件分配"},{"level":3,"title":"空闲空间管理","slug":"空闲空间管理"},{"level":3,"title":"冗余磁盘阵列","slug":"冗余磁盘阵列"},{"level":3,"title":"FS 实现","slug":"fs-实现"},{"level":3,"title":"ELF File Format","slug":"elf-file-format"},{"level":2,"title":"设备管理详解","slug":"设备管理详解"},{"level":3,"title":"CGA EGA and ChromaText Video Buffer","slug":"cga-ega-and-chromatext-video-buffer"},{"level":3,"title":"Input and Output","slug":"input-and-output"},{"level":2,"title":"实践","slug":"实践"},{"level":3,"title":"工具","slug":"工具"},{"level":2,"title":"Memory Management Tools","slug":"memory-management-tools"},{"level":3,"title":"perf","slug":"perf"},{"level":3,"title":"trace","slug":"trace"},{"level":3,"title":"vmstat","slug":"vmstat"},{"level":3,"title":"pmap","slug":"pmap"},{"level":3,"title":"Memory Hot Plug","slug":"memory-hot-plug"},{"level":3,"title":"TCMalloc","slug":"tcmalloc"},{"level":3,"title":"Oprofile","slug":"oprofile"}],"relativePath":"computerScience/operatingSystems/operatingSystemsBasicNotes.md","lastUpdated":1627194884000}',p={},t=s('

    Operating System Basic Notes

    OS Definition

    操作系统是一个大型的程序系统, 它负责(处理机管理, 存储管理, 设备管理, 文件系统):

    • 计算机系统软、硬件资源的分配和使用
    • 控制和协调并发活动
    • 提供用户接口, 使用户获得良好的工作环境

    GCC 内联汇编

    asm ( assembler template // assembly language\n  :=output operands // 约定输出\n  :input operands // 约定输入\n  :clobbers // 约定插入\n);\n
    1
    2
    3
    4
    5

    constraints:

    • m/v/o = memory
    • r = register
    • Q = ea/b/c/dx
    • a = eax
    • b = ebx
    • c = ecx
    • d = edx
    • D = edi
    • S = esi
    • 0/n = first/nth constraints

    基本概念

    操作系统的特性

    • 并发性 : 能处理多个同时性活动的能力
    • 共享性 : 多个计算任务对系统资源的共同享用
    • 不确定性: 操作系统能处理随机发生的多个事件 - 程序运行次序的不确定性, 程序运行时间的不确定性

    操作系统的资源管理功能

    处理器调度

    • 确定进程调度策略
    • 给出进程调度算法
    • 进行处理机的分派

    存储器管理

    • 存储分配与存储无关性

    为用户提供逻辑地址, 解决主存分配问题

    • 存储保护

    实现系统程序与用户程序之间的隔离, 实现不同用户程序之间的隔离

    • 存储扩充

    虚拟内存管理: 主存+磁盘, 为每个进程管理一个虚拟内存映射链表

    设备管理

    • 设备无关性

    用户向系统申请和使用的设备无关实际操作的设备, 操作系统为用户提供统一的逻辑设备(名)

    • 设备分配(独享分配/共享分配/虚拟分配)
    • 设备的传输控制(设备启动处理, 设备中断处理, 设备结束处理)

    组织设备完成 I/O 操作, 并正确处理中断

    文件资源管理

    为用户提供一种简便、统一的存取和管理信息的方法, 解决信息的共享/数据的存取控制/数据的保密等问题:

    • 实现用户的信息组织
    • 提供存取方法
    • 实现文件共享
    • 保证文件安全
    • 保证文件完整性
    • 完成磁盘空间分配

    操作系统的演变

    • 单用户系统(45-55) -> 批处理系统(55-65) -> 多道系统(65-80) -> 分时系统(70-) -> 分布式系统
    • 手工系统 -人机矛盾-> 联机批处理系统 -CPU I/O 矛盾 -> 脱机批处理系统 -响应能力-> 执行系统(中断/通道) -并行-> 多道批处理系统(粗粒度) -> 分时系统(细粒度) -> 实时系统 -> 个人/网络/分布式系统

    批处理系统

    作业成批送入计算机, 然后由作业调度程序自动选择作业, 在系统内(多道)运行

    • 系统吞吐率高: 脱机/多道运行
    • 作业周转时间长, 用户使用不方便, 缺少交互性

    分时系统

    采用时间片(time slice)轮转(round robin)的方法, 使计算机同时为多个终端用户服务, 保证对每个用户都有足够快的响应时间, 并提供交互会话功能

    • 并行性
    • 独占性
    • 交互性

    单处理器系统: 处理器与设备/处理器与通道/通道与通道/设备与设备可以同时刻并行(真正意义上的同时进行)

    实时系统

    实时系统对外部输入的信息, 能够在规定时间内处理完毕并作出反应(实时控制/实时信息处理) e.g 嵌入式操作系统

    • 可靠性
    • 安全性
    • 及时响应

    操作系统虚拟机

    • 在裸机上配置了操作系统后便构成了操作系统虚拟机
    • 裸机的指令系统: 机器指令; 操作系统虚拟机的指令系统: 系统调用

    用户接口

    • 操作/命令接口(操作命令): 作业控制语言/键盘命令(CLI)/图形化用户界面(GUI)
    • 程序接口(系统功能调用): 在用户程序中可以直接使用系统功能调用(system call)请求操作系统提供的服务

    操作系统的组织结构

    • 一体化结构
    • 模块化结构
    • 可扩展内核(微内核)结构
    • 层次化结构

    并发

    Concurrent

    程序并发的特点

    • 程序执行的间断性
    • 相互通信的可能性
    • 资源分配的动态性

    启动

    BIOS

    • 基本输入输出程序
    • 系统设置信息
    • 开机后自检程序
    • 系统自启动程序

    启动顺序

    寄存器

    • CF: 初值 F000H
    • EIP: 初值 FFF0H

    (FFF)F0000H+FFF0H = FFFFFFF0H, BIOS 的 EPROM(Erasable Programmable Read Only Memory) 处 加电后第一条指令一般是 ljmp(实模式下, 内存 !MB), 跳转地址为 CF<<4+EIP, 跳转至 BIOS 例行程序起始点.

    BIOS Config

    BIOS 根据设置(硬盘/U 盘/网络启动), 加载存储设备的主引导扇区(Master Boot Record)(第一个扇区)的 512 字节至内存 0x7c00 处, 开始执行第一条指令(Boot Loader)

    Boot Loader

    实模式与保护模式带来的问题:

    • 在实模式的寻址模式中, 令物理地址为 16 位段寄存器左移 4 位加 16 位逻辑地址的偏移所得的 20 位地址
    • 若要访问 1MB 之后的内存, 则必须开启 A20 Line 开关(关闭 wrap around), 将 32 位地址总线打开, 并进入保护模式(Protect Mode)
    • 在实模式中, 0~4KB 为中断向量表保留, 640KB ~ 1MB 为显存与 BIOS 保留, 实际可用的内存只有 636KB
    • 考虑到日后内核镜像的体积有超过 1MB 的可能, 所以将其装载到物理地址 1MB(0x100000) 之后连续的一块内存中更好.
    • 若要装载内核到物理地址 1MB 之后(实模式下无法访问), 可在实模式中暂时将其装载到一个临时位置, 待进入保护模式之后再移动至合适位置

    解决方案:

    • 将内核镜像装入内存临时地址
    • 开启保护模式
    • 移动内核镜像至 1MB 之后合适位置
    • 跳转至内核入口(jmp addr 用以修改 cs:eip)
    标志

    lab1/tools/sign.c:

    • 有效字节小于 510 bytes
    • 结尾为 0x55aa
    • 总计字节小于 512 bytes
    基本功能
    • 切换到保护模式, 启动段机制
    • 通过 8042 键盘控制器的端口, 开启 A20, 关闭 memory wrap around, 获取足够内存空间
    ; 键盘控制器的命令\n; 0xD0 Read Output Port\n; 0xD1 Write Output Port\n; 0xDD Enable A20 Address Line\n; 0xDF Disable A20 Address Line\n; 0x60 - 数据端口, 0x64 - 命令端口\ncall  empty_8042\nmov   al,0xd1\nout   0x64,al\ncall  empty_8042\nmov   al,0xdf\nout   0x60,al\ncall  empty_8042\n\nempty_8042:\n    dw    00ebh, 00ebh\n    in    al,64h\n    test  al,2\n    jnz   empty_8042\n    ret\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    • 置 cr0 保护模式标志位(bit0) 为 1

    • 加载全局描述符表

    • 设置各个通用寄存器与段寄存器

    • 从硬盘上加载 某种(kernel in ELF) 格式的 os kernel(在硬盘中紧邻 MBR) 至内存的固定区域

    • 跳转到 os kernel 的入口点(entry point), 转移控制权至 os

    保护模式与段机制
    • CS -> 全局描述符表(其起始地址与表大小位于 gdt 寄存器中)某项(每项存有 base/limit 等信息) -> 局部描述符表 -> 段选择子(段的基本信息) -> 基址+EIP -> 线性地址 ---页机制---> 物理地址
    • 将 cr0 寄存器 bit0 置为 1, 表示进入了保护模式, 段机制开始起作用

    物理内存管理

    Boot Loader 探测机器内存分布

    为内存管理模块提供基础: 在进入实模式前, 调用 int 15h(88h, e801h, e820h), 借助 BIOS 中断获取内存信息

    Boot Loader 基本概念

    Boot Loader 基本目标

    • 抽象: 逻辑地址空间(线性物理地址映射)
    • 保护: 独立地址空间(进程间互不影响)
    • 共享: 访问相同内存(内核空间与共享库)
    • 虚拟化: 独占内存空间假象

    基本管理方式

    • 重定位(relocation)
    • 分段(segmentation): 代码段/数据段
    • 分页(paging)
    • 虚拟存储(virtual memory): 内存视作硬盘的缓存, 硬盘视作虚拟内存

    地址生成

    地址生成时机
    • 编译时
    • 链接时
    • 加载时
    • 执行时(相对寻址)

    地址映射

    软硬件结合:

    逻辑地址 ---> 物理地址

    • 硬件(CPU/MMU)完成映射地址
    • 操作系统建立映射规则(页表)

    地址检查

    软硬件结合:

    • 操作系统设置的段机制和段长度
    • 硬件(CPU/MMU)根据段信息进行地址检查(内存访问是否异常)

    连续内存分配

    • malloc
    • free

    内存碎片

    • 外部碎片: 已分配单元间无法利用空闲单元(请求内存单元过大)
    • 内部碎片: 已分配单元内空闲单元

    动态分配策略

    • Fist-fit(最先匹配): 使用第一个可利用空闲块 - 容易产生外部碎片, 分配大块效率低
    • Best-fit(最佳匹配): 使用利用度最高的空闲块 - 外部碎片过小, 释放时需重新排列空闲块链表(升序)
    • Worst-fit(最差匹配): 使用利用度最差的空闲块 - 分配中块效率高, 释放时需重新排列空闲块链表(降序)

    碎片整理策略

    ucore 实现

    • 连续存放 n 个 page 结构, 形式表示内存页, 并在连续内存块的首页(header page)保存此连续块的连续页数目
    • 维护一个链表, 链表每项为大块连续内存块的起始页(header page address) 和 连续页数目, 管理分散的连续内存块
    紧凑

    Compaction, 将不同进程占用内存单元移至较为集中的地方:

    • 只可移动 可动态重定位程序
    • 只可移动 等待状态进程
    分区对换

    Swapping In and Swapping Out:

    将等待状态进程的分区对换至外存,以增大可用内存单元

    e.g Linux Swap 分区: 安装系统时一般切割大小为内存大小的 50%~100% 的外存作为 Swap 分区

    Malloc 实现策略

    启发式编程

    Heuristic Programming:

    • 建立已分配 void 指针表,free 函数执行时,只回收表中存在的指针;不存在则报错
    • 对 heap 进行分区 - 小/中/大块内存请求,分别从不同区域(8/16/32 最小单位区)分配
    • 记录当前堆块的信息,如长度,空闲状态
    • 记录周围环境信息,如保留上/下一堆块的指针或记录上/下堆块空闲状态
    伙伴系统

    Buddy System:

    • 可分配内存单元总大小为 2^n
    • 总是将大小 小于请求大小的2 倍且为2 的幂次方 的某块内存单元分配出去(大小为 2^(i-1))
    合并空闲块
    • 空闲块相邻
    • 空闲块等大
    • 低地址空闲块的 起始地址 必须为 空闲块大小 的 2 的幂次方倍(2 倍以上)

    非连续内存分配

    • 支持一个程序使用非连续的物理地址空间
    • 支持共享代码与数据
    • 支持动态加载与动态链接

    段式存储管理

    将逻辑地址划分, 低位表示段内偏移, 高位(取摸)表示段号(类比缓存中的内存地址)

    GDT
    typedef struct gdt_ptr {\n    uint16_t gdt_limit;     // gdt_length - 1\n    uint32_t gdt_base;\n} __attribute__((packed)) gdt_ptr_t;\n
    1
    2
    3
    4
    • 用 16 位来表示表的长度(2 ^ 16 = 65532 bytes), 除以每一个描述符的 8 字节, 最多能创建 8192 个描述符

    页式存储管理

    开启页机制:

    • init page directory(首址位于 cr3 寄存器), page table
    • update GDT
    • update ds,es,ss
    • update cs with jmp instruction
    • cr0 寄存器 bit31(most bit) 置 1
    虚拟地址

    TLB (Translation Lookaside Buffer in CPU/PM)

    • Virtual Address = 2^(bits of virtual page offset) * virtual page number + virtual page offset
    • VPN(virtual page number point to PPN) - VPO(virtual page offset = PPO)
    • 根据 VPN 在页表中找到对应表项(VPN 表示项号), 每项保存着 PPN
    • TLBT(tag) - TLBI(index) - VPO
    • 因为内存局部性原理, TLB 一般只需要很小(比如 64 项)即可达到不错的效果
    物理地址

    C(cache) PPO = VPO

    • Page Frame(帧): 高位为帧号, 低位为偏移
    • Physical Address = 2^(bits of physical page offset) * physical page number/page frame number + physical page offset
    • PPN(physical page number) - PPO(physical page offset = VPO)
    • CT(tag) - CI(index) - CO(offset)
    页表
    • 页表由操作系统建立, 硬件(CPU/MMU)根据页表信息将虚拟地址映射为物理地址
    页表结构
    • FN/PPN
    • 标志位: resident bit(存在位)/dirty bit(修改位)/reference(clock) bit(引用位)
    性能问题
    • 两次访存: 第一次获取页表项, 第二次访问实际数据
    • 页表占据大量内存单元
    TLB

    Translation Lookaside Buffer:

    缓存页表项 - key: VPN, value: PPN  不用访问页表

    多级页表
    • 切割页表: 建立子页表
    • Page Directory -> Page Table -> Physical Address
    • 将线性地址分成三部分 Directory+Table+Offset: cr3+Dir 取出 page table base, ptb+Tab 取出 physical address base, pab+offset = pa

    CR3 寄存器: 保存一级页表的基址

    • 父页表表项保存子页表起始地址, 逻辑地址某部分保存偏移地址(子表项号)
    • 存在位为 0 时, 不用保存子表, 节省内存单元
    反置页表
    • PPN 作为页表索引, 页表项保存 VPN(或者 Hash(VPN|PID))
    • 将 VPN 映射为 PPN 时, 需遍历整个页表(但此页表只占用少量内存单元)

    段页式存储管理

    在页式存储管理基础上, 引入段式存储管理

    <--- vsn --- vpn --- vpo ---> 映射为 <--- ppn --- ppo --->

    sn: segment number, pn:page number, po: page offset

    若以 4K(limit) 为 1 个页表大小, 则下级页表首址为 段/页表中某项的值 << 12(2^12 = 4K)

    • 以 vsn 为索引在进程段表中找到段表项, 获取段(页表)基址与段大小信息(item_value/limit): base = item_value << log2(limit)
    • 以 vpn 为索引在进程页表(页表基址 = base 中找到页表项, 获取 ppn
    • ppn << log2(limit) + vpo(ppo) 为实际物理地址

    内存的特权级

    0: 最高特权级, 3: 最低特权级

    特权级检查

    • CPL/RPL: 访问者特权级
    • DRL: 段描述符/门描述符(中断/陷阱门)中保存的特权级, 表示被访问段/中断服务/陷阱的特权级
    • CPL/RPL <= DRL e.g 0 < 3

    特权级切换

    Ring 0 to Ring 3
    • interrupt/trap: push SS(RPL=3) -> ESP -> EFLAGS -> CS(RPL=3) -> EIP -> Error Code
    • iret: pop above variables, move to ring 3
    Ring 3 to Ring 0

    特权级提升:

    • interrupt/trap: stack switch
    • push EFLAGS -> CS(RPL=0) -> EIP -> Error Code
    • iret: pop above variables, move to ring 0

    TSS

    Task State Segment:

    保存不同特权级的堆栈信息(SS/ESP)

    全局描述符表中保存一个 TSS Descriptor(TSS base + TSS limit): allocate TSS memory -> init TSS -> fill TSS descriptor in GDT -> set TSS selector(task register)

    虚拟内存管理

    虚拟内存 = 物理内存 + 外存

    Page Fault

    • 虚拟地址越界: 访问不存在的虚拟地址
    • 对只读地址进行写操作
    • 访问未映射虚拟页(swap in/out)
    • CPU 将产生异常的的线性地址(linear address) 存储在 CR2 寄存器中, 将 errorCode(bit2-访问权限异常,bit1-写异常,bit0-物理页不存在)压入中断栈

    CR0: 处理器模式(实/保护/分段/分页模式); CR2: Page Fault Linear Address; CR3: Page-Directory Base Address Register

    覆盖与交换

    覆盖技术

    Overlay:

    将程序中相互独立的模块分成一组, 为每组按最大模块分配内存单元

    交换技术

    Swap:

    将挂起进程的整个地址空间换出至外存(swap out), 将需用进程的整个地址空间换入至内存(swap in), 进程交替运行

    虚拟页式存储管理

    • 只将运行进程所必需页面装入内存, 其余页面至于外存
    • 进程发生缺页异常时, 将所要求缺页装入内存: 选择目标物理页面 -> 无未占用物理页面, 则换出闲置物理页面(访问位) -> 装入物理内存,更新页表项 (换入逻辑地址与换出逻辑地址对应的页表项的驻留位/修改位/访问位/锁定位以及物理页号 ppn)
    • 监控已经装入内存的页面, 及时将不需要页面换出至外存

    标志位

    • 驻留位: 此逻辑地址对应的页面在内存中
    • 修改位: 此页面是否被修改过, 判定此页面换出时策略(写回外存/直接丢弃)
    • 访问位: 此页面是否被读/写过, 判定此页面是否需要换出至外存
    • 锁定位: 此页面不会被换出

    页面置换算法

    当出现缺页异常且物理内存已满时, 需要以页面置换算法为指导, 换出闲置物理页面, 换入所要求缺页, 并更新页表项:

    • 尽可能减少物理页面的换入换出次数
    • 只可交换映射到用户空间的物理页
    • 当页表项中 PTE_P 为 0 时, 对应高位地址表示扇区地址(而不是物理位移)
    • 换入时机: Page Fault 缺页; 换出时机: 积极/消极换出策略
    局部置换算法

    换入进程 A 的某个页面时, 只可换出进程 A 的某个页面: 为进程分配固定数目的页面

    最远未用算法

    Least Recently Used (LRU) Algorithm:

    • 利用链表等线性结构维护页面访问时间, 队首为最近一次访问页面(每次访问一个页面后, 把它从线性结构中间抽出至队首), 队尾为最远一次访问页面
    时钟算法

    Clock Algorithm:

    • 利用循环链表维护页面(指针指向最先换入内存的页面), 页表项访问位维护访问记录(访问后将访问位置 1)
    • 缺页时, 从指针处开始查找页面进行置换: 若访问位为 0, 则进行置换; 若访问位为 1, 则将此页面访问位置 0, 继续查找未访问页面
    • 改进: 增加修改位
    指针扫描前指针扫描后
    访问位 修改位访问位 修改位
    0 0置换
    0 10 0
    1 00 0
    1 10 1
    最不常用算法

    Least Frequently Used (LFU) Algorithm:

    • 利用链表等线性结构维护页面访问时间, 队首为最多访问次数页面(每次访问一个页面后, 访问次数+1, 并排序), 队尾为最少访问次数页面
    全局置换算法
    • 换入进程 A 的某个页面时, 可换出其他进程的某个页面: 为进程分配可变数目的页面
    • 关键: 确定为不同进程分配的页面数目
    • 抖动(thrashing): 进程过多, 导致大部分进程的常驻集<工作集, 缺页率较高
    工作集算法
    • 工作集(随时间动态变化集): 一个进程当前正在使用的逻辑页面集合, WorkingSet(currentTime, workingSetWindow(访问时间窗口)) (cT - wSW, cT + wSW)
    • 根据工作集大小(逻辑页面集合), 为该进程分配常驻集(合适数目的物理页面集合): 若常驻集 > 工作集, 则缺页率较低
    • 再额外维护一个类希 LRU 算法中的访存链表, 记录近期访问过的物理页面, 将其也加入常驻集
    缺页率算法

    当缺页频繁时, 缺页时将缺页的页面加入常驻集; 当缺页不频繁时, 缺页时将不属于工作集的页面移出常驻集

    实现

    • 为每个进程分配一个 vma 块, 模拟一个完整的物理内存
    • vmas 按起始地址从小至大形成一个双向链表, 且地址空间没有任何交集
    #define VM_READ  0x00000001\n#define VM_WRITE 0x00000002\n#define VM_EXEC  0x00000004\n#define VM_USER  (VM_READ | VM_WRITE | VM_EXEC)\n\ntypedef struct __mm {\n    list_entry_t mmap_list; // header of vmas' list\n    vma *mmap_cache;        // current accessed vma(used for speed purpose)\n    pde_t *pgdir;           // PDT for vmas\n    int map_count;          // count of vmas\n    void *sm_priv;          // private data for swap manager\n} mm;\n\ntypedef struct __vma {\n    struct mm *vm_mm;       // all vmas use the same PDT(page directory table)\n    uintptr_t vm_start;     // start address of vma (align to PGSIZE)\n    uintptr_t vm_end;       // end address of vma   (align to PGSIZE)\n    uint32_t vm_flags;      // flags of vma\n    list_entry_t vma_list;  // doubly linked list: sort all vmas by start address\n} vma;\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    中断

    Interrupt Service Routine/Interrupt Quest:

    • NMI 中断(Non Maskable Interrupt) 与 INTR 中断(可屏蔽中断)
    • x86PC 中断控制芯片: 8259A PIC

    中断进入

    保护现场

    • push PSW(Program State Word): (cs:eip + eflags)
    • push PC(Program Counter)
    • 中断向量表(将中断向量表对应的中断的 PSW(高 2 字节) 与 PC(低 2 字节) 先后替换原 PSW 与 PC)
    • 系统堆栈
    • 中断屏蔽码: n 位 2 进制数(n 为中断总数), 允许响应 n 号中断则该位置 1

    程序状态字:

    • 当前执行指令(eip)
    • 当前指令执行情况
    • 处理机所处状态
    • 中断屏蔽码(程序在执行时应屏蔽的中断)
    • 寻址方法/编址/保护键
    • 响应中断的内容

    中断实现

    概述

    • 硬件发生了某个事件后告诉中断控制器(PIC), 中断控制器汇报给 CPU
    • CPU 从中断控制器处获取中断号, 根据中断号调用对应中断服务例程
    • 处理完成后重新回到之前的执行流程

    Interrupt 实现

    • 发生中断, PIC 报告中断号给 CPU
    • CPU 调用对应处理程序 irsr_x/irq_x
    • irsr_x/irq_x 负责压入相关信息(中断号/错误码), 然后跳转至统一处理函数 common_stub
    • common_stub: 压栈 -> 调用 fault_handler/req_handler -> 出栈
    • 进入 handler 后, 再根据中断号/错误码(结构体)以及栈帧信息(结构体), 进行实际处理(真正处理逻辑)
    • 在进入 handler 之前, 都是通过汇编代码进行最简单的处理(压入相关信息), 将实际中断处理逻辑放在 C 语言中, 再辅以内联汇编, 可大大地提升中断处理程序的编写效率以及中断处理程序的处理能力

    系统调用

    • 保护系统安全, 提升可靠性与安全性
    • 调用: 用户态, 执行: 管态/内核态

    进程

    资源分配单位:

    • 独立性: 无副作用(确定性), 可重现
    • 并发性(宏观并行, 微观串行): 提升效率, 共享资源, 高度模块化

    进程特权级

    • 处理机的态/处理机的特权级: 根据对资源和机器指令的使用权限, 将处理执行时的工作状态区分为不同的状态
    • 管理(supervisor mode)/系统态: 使用全部机器指令(包括特权指令), 可使用所有资源, 允许访问整个内存区, 运行系统程序
    • 用户态: 禁止使用特权指令(I/O 设备指令, 直接修改特殊寄存器指令, 改变机器状态指令), 不可直接取用资源与改变机器状态, 只可访问自己的存储区域, 运行用户程序
    • 用户态切换至管态: 错误/异常状态(除 0/缺页), 外部中断(I/O), 系统调用, 这一过程是由硬件完成

    进程状态与生命周期

    创建, 就绪(ready), 运行(running), 等待(wait/sleeping), 挂起(suspend: 进程由内存换出至外存), 结束(抢占, 唤醒): 进程优先级与剩余内存单元在一定程度上会影响进程状态

    • 进程首先在 cpu 初始化或者 sys_fork 的时候被创建,当为该进程分配了一个进程控制块之后,该进程进入 uninit 态
    • 当进程完全完成初始化之后,该进程转为 runnable 态
    • 当到达调度点时,由调度器 sched_class 根据运行队列 rq 的内容来判断一个进程是否应该被运行, 即把处于 runnable 态的进程转换成 running 状态,从而占用 CPU 执行
    • running 态的进程通过 wait 等系统调用被阻塞,进入 sleeping 态
    • sleeping 态的进程被 wake up 变成 runnable 态的进程
    • running 态的进程主动 exit 变成 zombie 态, 然后由其父进程完成对其资源的最后释放,子进程的进程控制块成为 unused
    • 所有从 runnable 态变成其他状态的进程都要出运行队列(dequeue), 反之,被放入某个运行队列中(enqueue)

    进程控制块

    Process Control Block:

    通过组织管理 PCB(链表/索引表) 来组织管理进程; 在进程创建/终止的同时, 生成/回收改进程的 PCB:

    • 进程信息: 名字/pid/uid
    • 链表信息: 父进程指针/所属队列指针(就绪队列/IO 等待队列/挂起队列)
    • CPU 调度/运行时信息: eflags/cr3/状态
    • 内存资源信息: 堆指针/栈指针/虚拟内存页面指针
    • 上下文信息(用于进程/上下文切换时保存/恢复上下文): trap frame/context(register files)

    进程通信

    • 直接通信: send(proc, msg), receive(proc, msg) shmctl() shm*
    • 间接通信: send(msg_que, msg), receive(msg_que, msg) msgctl() msg*

    线程

    CPU 调度单位:

    • 进程缺陷: 共享数据不便, 系统开销大
    • 线程共享段表/共享库/数据/代码/环境变量/文件描述符集合/地址空间, 但拥有独立的堆/栈/通用寄存器
    • 线程控制块(Thread Control Block)
    • 用户线程与内核线程: 多为 1 对 1

    IDLE Process

    0 号内核线程:

    • 工作就是不停地查询,直至有其他内核线程处于就绪状态, 令调度器执行那个内核线程
    • IDLE 内核线程是在操作系统没有其他内核线程可执行的情况下才会被调用
    • 在所有进程中,只有 IDLE (内核创建的第一个内核线程) 没有父进程

    内核线程与用户进程

    • 内核线程只运行在内核态
    • 用户进程会交替运行在用户态和内核态(系统调用/外设中断/异常中断)
    • 所有内核线程直接使用共同的内核内存空间, 拥有相同的内核虚拟地址空间(包括物理地址空间)
    • 每个用户进程拥有单独的用户内存空间(虚拟内存单元)

    Process 实现

    Process Context

    执行现场/执行上下文:

    • 设置好执行现场后, 一旦调度器选择了 initproc 执行, 就需要根据 initproc->context 中保存的执行现场来恢复 initproc 的执行
    • 通过 proc_run 和进一步的 switch_to 函数完成两个执行现场的切换,具体流程如下:
      • 让 current 指向 next 内核线程 initproc
      • 设置任务状态段 ts 中特权态 0 下的栈顶指针 esp0 为 next 内核线程 initproc 的内核栈的栈顶, 即 next->kstack + KSTACKSIZE
      • 设置 CR3 寄存器的值为 next 内核线程 initproc 的页目录表起始地址 next->cr3
      • 由 switch_to 函数完成具体的两个线程的执行现场切换, 即切换各个寄存器

    Process Fork Function

    • 分配并初始化进程控制块(alloc_proc 函数)
    • 分配并初始化内核栈(setup_stack 函数)
    • 根据 clone_flag 标志复制或共享进程内存管理结构(copy_mm 函数)
    • 设置进程在内核(或用户态)正常运行和调度所需的中断帧和执行上下文(copy_thread 函数)
    • 把设置好的进程控制块放入 hash_list 和 proc_list 两个全局进程链表中
    • 把进程状态设置为“就绪”态
    • 设置返回码为子进程的 id 号

    fork() 的主要行为:

    • 申请 pid 与进程结构
    • 设置 ppid 为父进程的 pid
    • 复制用户相关的字段, 如 p_pgrp/p_gid/p_ruid/p_euid/p_rgid/p_egid
    • 复制调度相关的字段, 如 p_cpu/p_nice/p_pri
    • 复制父进程的文件描述符 (p_ofile), 并增加引用计数
    • 复制父进程的信号处理例程 (p_sigact)
    • 通过 vm_clone(), 复制父进程的地址空间(p_vm)
    • 复制父进程的寄存器状态 (p_context)
    • 复制父进程的中断上下文, 并设置 tf->eax 为 0, 使 fork()在子进程中返回 0。

    Execution function

    exec() 的主要行为:

    • 读取文件的第一个块, 检查 Magic Number 是否正确
    • 保存参数(argv)到临时分配的几个物理页, 其中的每个字符串单独一页
    • 清空旧的进程地址空间(vm_clear()), 并结合可执行文件的 header, 初始化新的进程地址空间(vm_renew())
    • 将 argv 与 argc 压入新地址空间中的栈
    • 释放临时存放参数的几个物理页
    • 关闭带有 FD_CLOEXEC 标识的文件描述符
    • 清理信号处理例程
    • 通过_retu()返回用户态

    处理机调度

    Schedule:

    • 从就绪队列中挑选下一个占用 CPU 的进程(挑选进程的内核函数)
    • 从多个可用 CPU 中挑选使用 CPU 资源

    调度时机

    • 进程停止运行, 进入等待/挂起/终止状态
    • 进程的中断请求完成时, 由等待状态进入就绪状态, 准备抢占 CPU 资源(准备从内核态返回用户态)

    六大调度时机

    • proc.c::do_exit 用户线程执行结束,主动放弃 CPU 控制权
    • proc.c::do_wait 用户线程等待子进程结束,主动放弃 CPU 控制权
    • proc.c::init_main
      • initproc 内核线程等待所有用户进程结束,如果没有结束,就主动放弃 CPU 控制权
      • initproc 内核线程在所有用户进程结束后,让 kswapd 内核线程执行 10 次,用于回收空闲内存资源
    • proc.c::cpu_idle idleproc 内核线程的工作就是等待有处于就绪态的进程或线程,如果有就调用 schedule 函数
    • sync.h::lock 在获取锁的过程中,如果无法得到锁,则主动放弃 CPU 控制权
    • trap.c::trap 如果在当前进程在用户态被打断,且当前进程控制块的成员变量 need_resched 设置为 1,则当前线程会放弃 CPU 控制权

    调度策略

    算法目标

    • CPU 有效使用率
    • 吞吐量 (高带宽): 单位时间内完成进程数量
    • 等待时间 (低延迟): 进程在就绪队列等待总时间
    • 周转时间 (低延迟): 进程从初始化到结束总时间
    • 响应时间 (低延迟): 从提交请求到产生响应总时间

    先来先服务算法

    First Come First Served (FCFS):

    • 依次执行就绪队列中的各进程(先进入就绪队列先执行)
    • CPU 利用率较低

    短进程优先算法

    Shortest Process Next/Shortest Remaining Time:

    • 优先执行周转耗时/剩余耗时最短的进程
    • 若短进程过多, 则导致长进程一直无法执行

    最高响应比优先算法

    Highest Response Ratio Next:

    • R = (waitTime + serviceTime) / serviceTime: 已等待时间越长, 优先级上升
    • 修正短进程优先算法的缺点

    时间片轮转算法

    Round Robin:

    • 在 FCFS 基础上, 设定一个基本时间单元, 每经过一个时间单元, 轮转至下一个先到进程(并进行循环轮转)
    • 额外的上下文切换
    • 时间片合适大小: 10 ms

    多级队列调度算法

    MQ:

    • 将就绪队列分成多个独立子队列, 每个队列可采取不同调度算法
    • 前台交互队列使用时间片轮转算法, 后台 IO 队列使用先来先服务算法
    • 队列间使用时间片轮转算法

    多级反馈队列算法

    MLFQ:

    • 优先级高的子队列时间片小, 优先级低的子队列时间片大
    • CPU 密集型进程(耗时高)优先级下降很快
    • IO 密集型进程(耗时低)停留在高优先级

    同步互斥

    • 互斥 (Mutual Exclusion)
    • 死锁 (Deadlock)
    • 饥饿 (Starvation)

    临界区的访问原则

    • 空闲则入
    • 忙则等待
    • 有限等待

    基于软件方法的同步互斥

    int turn; // 表示谁该进入临界区\nbool flag[]; // 表示进程是否准备好进入临界区\n
    1
    2
    // 对于 2 个线程的情况\n// Peterson Algorithm\n// 线程 i\nflag[i] = true;\nturn = j; // 后设置 turn 标志的进程不可进入临界区, 会在 while 循环进行等待\nwhile (flag[j] && turn == j) ;\n\n...// critical section\n\nflag[i] = false;\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // Dekkers Algorithm\n// 线程 i\nturn = 0;\nflag[] = {false};\n\ndo {\n  flag[i] = true;\n  while (flag[j] == true) {\n    if (turn != i) {\n      flag[i] = false;\n      while (turn != i) ;\n      flag[i] = true;\n    }\n  }\n\n  // critical section\n\n  turn = j;\n  flag[i] = false;\n} while (true);\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    高级抽象的同步互斥

    利用原子操作实现互斥数据结构

    Lock and Semaphore

    struct lock/semaphore {\n  bool locked/sem = n; // n: 并发数/可用资源数\n  wait_queue q;\n\n  void acquire/prolaag() {\n    locked/sem--;\n    if (locked/sem < 0) sleep_and_enqueue(this_thread);\n  };\n\n  void release/verhoog() {\n    locked/sem++;\n    if (locked/sem <= 0) wakeup_and_dequeue(other_thread);\n  };\n};\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    Monitor

    • 与 semaphore 相反, 初始 0, wait(++ && sleep), signal(-- && wakeup)
    • 管程内可以中断执行, 并 notify 其他等待线程

    死锁

    非抢占持有互斥循环等待

    Mutex 实现

    Prolaag and Verhoog

    Prolaag Semaphore
    • 关中断
    • 判断当前信号量的 value 是否大于 0
    • 如果是>0,则表明可以获得信号量,故让 value 减一,并打开中断返回
    • 如果不是>0,则表明无法获得信号量,故需要将当前的进程加入到等待队列中,并打开中断,然后运行调度器选择另外一个进程执行
    • 如果被 V 操作唤醒,则把自身关联的 wait 从等待队列中删除(此过程需要先关中断,完成后开中断)
    Verhoog Semaphore
    • 关中断
    • 如果信号量对应的 wait queue 中没有进程在等待,直接把信号量的 value 加一,然后开中断返回
    • 如果有进程在等待且进程等待的原因是 semaphore 设置的, 则调用 wakeup_wait 函数将 wait queue 中等待的第一个 wait 删除, 且把此 wait 关联的进程唤醒, 最后开中断返回

    管程

    管程由四部分组成:

    • 管程内部的共享变量(mutex): 一个二值信号量,是实现每次只允许一个进程进入管程的关键元素,确保了互斥访问性质
    • 管程内部的条件变量: 通过执行 wait_cv,会使得等待某个条件 C 为真的进程能够离开管程并睡眠,且让其他进程进入管程继续执行; 而进入管程的某进程设置条件 C 为真并执行 signal_cv 时,能够让等待某个条件 C 为真的睡眠进程被唤醒,从而继续进入管程中执行
    • 管程内部并发执行的进程
    • 对局部于管程内部的共享数据设置初始值的语句
    • 成员变量信号量 next: 配合进程对条件变量 cv 的操作而设置的, 由于发出 signal_cv 的进程 A 会唤醒睡眠进程 B, 进程 B 执行会导致进程 A 睡眠,直到进程 B 离开管程,进程 A 才能继续执行,这个同步过程是通过信号量 next 完成
    • 整形变量 next_count: 表示由于发出 signal_cv 而睡眠的进程个数
    typedef struct monitor{\n    // the mutex lock for going into the routines in monitor,\n    // should be initialized to 1\n    semaphore_t mutex;\n    // the next semaphore is used to down the signaling proc itself,\n    // and the other OR woke up\n    semaphore_t next;\n    int next_count;     // the number of of sleepy signaling\n    proc condvar_t *cv; // the conditional variable in monitor\n} monitor_t;\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Conditional Variable
    • wait_cv: 被一个进程调用, 以等待断言 Pc 被满足后该进程可恢复执行. 进程挂在该条件变量上等待时, 不被认为是占用了管程
    • signal_cv:被一个进程调用, 以指出断言 Pc 现在为真, 从而可以唤醒等待断言 Pc 被满足的进程继续执行
    • 信号量 sem: 用于让发出 wait_cv 操作的等待某个条件 C 为真的进程睡眠, 而让发出 signal_cv 操作的进程通过这个 sem 来唤醒睡眠的进程
    • count: 表示等在这个条件变量上的睡眠进程的个数
    • owner: 表示此条件变量的宿主是哪个管程

    typedef struct condvar{ // the sem semaphore is used to down the waiting proc, // and the signaling proc should up the waiting semaphore_t sem; proc int count; // the number of waiters on condvar monitor_t * owner; // the owner(monitor) of this conditional variable } condvar_t;

    文件系统

    File System:

    • 分配文件磁盘空间: 分配与管理
    • 管理文件集合: 定位, 命名, 文件系统结构
    • 数据可靠和安全: 持久化保存, 防止数据丢失(系统崩溃时)
    • 基本操作单位: 数据块
    • 文件访问模式: 顺序访问/随机访问/索引访问
    • 文件系统种类: 磁盘/数据库/日志/网络/分布式/虚拟文件系统

    文件组成

    • 文件头: 文件属性(名称/类型/大小/权限/路径/创建者/创建时间/最近修改时间)
    • 文件头: 文件存储位置与顺序
    • 文件体: 实际字节序列

    文件系统基本数据结构

    Super Block -> Directory Entry -> vnode/inode

    文件卷控制块

    Super Block:

    • 每个文件系统只有一个控制块
    • 描述该文件系统全局信息: 数据块(大小等信息), 空余块信息, 文件指针/引用计数

    目录项

    Directory Entry:

    • 目录是一类特殊的文件: 其内容为文件索引表(文件名/文件指针), 内部采取哈希表存储
    • 目录与文件构成树状结构
    • 每个目录项属于一个目录, 一个目录可有多个目录项
    • 保存目录相关信息: 指向文件控制块, 父目录/子目录信息

    文件控制块

    vnode/inode:

    • 每个文件有一个文件控制块
    • 保存该文件详细信息: 访问权限, 所属者/组, 文件大小, 数据块位置(索引)

    文件描述符

    操作系统在打开文件表中维护的打开文件状态与信息:

    • 文件指针: 最近一次读写位置
    • 文件打开计数(引用计数): 引用计数为 0 时, 回收相关资源
    • 文件磁盘位置
    • 访问权限

    打开文件表

    • 系统打开文件表: 保存文件描述符
    • 进程打开文件表: 指向系统打开文件表某项, 并附加额外信息

    文件分配

    • 分配方式: 连续分配, 琏式分配, 索引分配
    • 琏式索引分配: 琏式链接多个索引块
    • 多级索引分配: 索引分配 + 多级琏式索引块

    空闲空间管理

    • bit 位图, 链表, 琏式索引: 保存空闲数据块位置与顺序

    冗余磁盘阵列

    Redundant Array of Inexpensive Disks (RAID):

    • RAID-0: 磁盘条带化
    • RAID-1: 磁盘镜像(冗余拷贝), 提高可靠性
    • RAID-4: 带奇偶校验(校验和)的磁盘条带化, 提高可靠性
    • RAID-5: 带分布式奇偶校验的磁盘条带化, 减少校验和所在物理磁盘的读写压力
    • RAID-6: 每组条带块有两个冗余块, 可以检查到 2 个磁盘错误

    FS 实现

    FS Mount

    sfs_do_mount函数中:

    • 完成了加载位于硬盘上的 SFS 文件系统的超级块 superblock 和 freemap 的工作 l
    • 在内存中有了 SFS 文件系统的全局信息

    FS Index

    • 对于普通文件,索引值指向的 block 中保存的是文件中的数据
    • 对于目录,索引值指向的数据保存的是目录下所有的文件名以及对应的索引节点所在的索引块(磁盘块)所形成的数组

    FS Node

    内存 inode 包含了 SFS 的硬盘 inode 信息, 而且还增加了其他一些信息, 这属于是便于进行是判断否改写、互斥操作、回收和快速地定位等作用. 一个内存 inode 是在打开一个文件后才创建的, 如果关机则相关信息都会消失. 而硬盘 inode 的内容是保存在硬盘中的, 只是在进程需要时才被读入到内存中, 用于访问文件或目录的具体内容数据.

    struct inode {\n    union {\n        //包含不同文件系统特定inode信息的union成员变量\n        struct device __device_info; //设备文件系统内存inode信息\n        struct sfs_inode __sfs_inode_info; //SFS文件系统内存inode信息\n    } in_info;\n\n    enum {\n        inode_type_device_info = 0x1234,\n        inode_type_sfs_inode_info,\n    } in_type; //此inode所属文件系统类型\n\n    atomic_t ref_count; //此inode的引用计数\n    atomic_t open_count; //打开此inode对应文件的个数\n\n    struct fs *in_fs; //抽象的文件系统,包含访问文件系统的函数指针\n    const struct inode_ops *in_ops; //抽象的inode操作,包含访问inode的函数指针\n};\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    struct inode_ops {\n    unsigned long vop_magic;\n    int (*vop_open)(struct inode *node, uint32_t open_flags);\n    int (*vop_close)(struct inode *node);\n    int (*vop_read)(struct inode *node, struct iobuf *iob);\n    int (*vop_write)(struct inode *node, struct iobuf *iob);\n    int (*vop_getdirentry)(struct inode *node, struct iobuf *iob);\n    int (*vop_create)(\n        struct inode *node,\n        const char *name,\n        bool excl,\n        struct inode **node_store);\n    int (*vop_lookup)(struct inode *node, char *path, struct inode **node_store);\n\n    ……\n\n};\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

    Device

    利用 vfs_dev_t 数据结构, 就可以让文件系统通过一个链接 vfs_dev_t 结构的双向链表找到 device 对应的 inode 数据结构, 一个 inode 节点的成员变量 in_type 的值是 0x1234, 则此 inode 的成员变量 in_info 将成为一个 device 结构。 这样 inode 就和一个设备建立了联系,这个 inode 就是一个设备文件

    ELF File Format

    #include "common.h"\n#include <stdlib.h>\n#include <elf.h>\n\nchar *exec_file = NULL;\n\nstatic char *strtab = NULL;\nstatic Elf32_Sym *symtab = NULL;\nstatic int nr_symtab_entry;\n\nvoid load_elf_tables(int argc, char *argv[]) {\n  int ret;\n  Assert(argc == 2, "run NEMU with format 'nemu [program]'");\n  exec_file = argv[1];\n\n  FILE *fp = fopen(exec_file, "rb");\n  Assert(fp, "Can not open '%s'", exec_file);\n\n  uint8_t buf[sizeof(Elf32_Ehdr)];\n  ret = fread(buf, sizeof(Elf32_Ehdr), 1, fp);\n  assert(ret == 1);\n\n  /* The first several bytes contain the ELF header. */\n  Elf32_Ehdr *elf = (void *)buf;\n  char magic[] = {ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3};\n\n  /* Check ELF header */\n  assert(memcmp(elf->e_ident, magic, 4) == 0); // magic number\n  assert(elf->e_ident[EI_CLASS] == ELFCLASS32); // 32-bit architecture\n  assert(elf->e_ident[EI_DATA] == ELFDATA2LSB); // little-endian\n  assert(elf->e_ident[EI_VERSION] == EV_CURRENT); // current version\n  assert(elf->e_ident[EI_OSABI] == ELFOSABI_SYSV || // UNIX System V ABI\n      elf->e_ident[EI_OSABI] == ELFOSABI_LINUX); // UNIX - GNU\n  assert(elf->e_ident[EI_ABIVERSION] == 0); // should be 0\n  assert(elf->e_type == ET_EXEC); // executable file\n  assert(elf->e_machine == EM_386); // Intel 80386 architecture\n  assert(elf->e_version == EV_CURRENT); // current version\n\n\n  /* Load symbol table and string table for future use */\n\n  /* Load section header table */\n  uint32_t sh_size = elf->e_shentsize * elf->e_shnum;\n  Elf32_Shdr *sh = malloc(sh_size);\n  fseek(fp, elf->e_shoff, SEEK_SET);\n  ret = fread(sh, sh_size, 1, fp);\n  assert(ret == 1);\n\n  /* Load section header string table */\n  char *section_header_string_table = malloc(sh[elf->e_shstrndx].sh_size);\n  fseek(fp, sh[elf->e_shstrndx].sh_offset, SEEK_SET);\n  ret = fread(section_header_string_table  sh[elf->e_shstrndx].sh_size, 1, fp);\n  assert(ret == 1);\n\n  int i;\n  for(i = 0; i < elf->e_shnum; i ++) {\n    if(sh[i].sh_type == SHT_SYMTAB &&\n        strcmp(section_header_string_table + sh[i].sh_name, ".symtab") == 0) {\n      /* Load symbol table from exec_file */\n      symtab = malloc(sh[i].sh_size);\n      fseek(fp, sh[i].sh_offset, SEEK_SET);\n      ret = fread(symtab, sh[i].sh_size, 1, fp);\n      assert(ret == 1);\n      nr_symtab_entry = sh[i].sh_size / sizeof(symtab[0]);\n    }\n    else if(sh[i].sh_type == SHT_STRTAB &&\n        strcmp(section_header_string_table + sh[i].sh_name, ".strtab") == 0) {\n      /* Load string table from exec_file */\n      strtab = malloc(sh[i].sh_size);\n      fseek(fp, sh[i].sh_offset, SEEK_SET);\n      ret = fread(strtab, sh[i].sh_size, 1, fp);\n      assert(ret == 1);\n    }\n  }\n\n  free(sh);\n  free(section_header_string_table ;\n\n  assert(strtab != NULL && symtab != NULL);\n\n  fclose(fp);\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82

    设备管理详解

    • CPU 一般都是通过寄存器的形式来访问外部设备
    • 外设的寄存器通常包括控制寄存器、状态寄存器与数据寄存器三类, 分别用于发送命令/读取状态/读写数据.

    CGA EGA and ChromaText Video Buffer

    在内存的低 1MB 中, 有许多地址被映射至外部设备, 其中就包含文字显示模块(显卡控制显示器):

    • 从 0xB8000 开始, 每 2 个字节表示屏幕上显示的一个字符(80 x 25)
    • 前一个字节为 字符 ASCII 码, 后一个字节为 字符颜色和属性的控制信息 (back_twinkle, back_r, back_g, back_b, front_light, front_r, front_g, front_b)

    Input and Output

    调用 io_delay() 函数: 对于一些老式总线的外部设备, 读写 I/O 端口的速度若过快就容易出现丢失数据的现象

    实践

    工具

    Bochs

    Installation
    wget\n\\ http://sourceforge.net/projects/bochs/files/bochs/2.5.1/bochs-2.5.1.tar.gz/download\n\\ -O bochs.tar.gz\ntar -xvfz bochs.tar.gz\ncd bochs-2.5.1\n./configure --enable-debugger --enable-debugger-gui --enable-disasm --with-x --with-term\nmake\nsudo cp ./bochs /usr/bin/bochs-dbg\n
    1
    2
    3
    4
    5
    6
    7
    8
    Config
    # BIOS与VGA镜像\nromimage: file=/usr/share/bochs/BIOS-bochs-latest\nvgaromimage: file=/usr/share/bochs/VGABIOS-lgpl-latest\n# 内存大小\nmegs: 128\n# 软盘镜像\nfloppya: 1_44=bin/kernel.images, status=inserted\n# 硬盘镜像\nata0-master: type=disk, path="bin/rootfs.images",\n\\ mode=flat, cylinders=2, heads=16, spt=63\n# 引导方式(软盘)\nboot: a\n# 日志输出\nlog: .bochsout\npanic: action=ask\nerror: action=report\ninfo: action=report\ndebug: action=ignore\n# 杂项\nvga_update_interval: 300000\nkeyboard_serial_delay: 250\nkeyboard_paste_delay: 100000\nmouse: enabled=0\nprivate_colormap: enabled=0\nfullscreen: enabled=0\nscreenmode: name="sample"\nkeyboard_mapping: enabled=0, map=\nkeyboard_type: at\n# 符号表(调试用)\ndebug_symbols: file=main.sym\n# 键盘类型\nkeyboard_type: at\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Run
    bochs -q -f .bochsrc\n
    1
    • b,vb,lb 分别为物理地址、虚拟地址、逻辑地址设置断点
    • c 持续执行,直到遇到断点或者错误
    • n 下一步执行
    • step 单步执行
    • r 显示当前寄存器的值
    • sreg 显示当前的段寄存器的值
    • info gdt, info idt, info tss, info tab 分别显示当前的 GDT、IDT、TSS、页表信息
    • print-stack 打印当前栈顶的值
    • help 显示帮助

    GNU ld

    ENTRY(kmain)\nSECTIONS {\n    __bios__ = 0xa0000; # 绑定BIOS保留内存的地址到__bios__\n    vgamem = 0xb8000; # 绑定vga缓冲区的地址到符号vgamem\n    .text 0x100000 : { # 内核二进制镜像中的.text段(Section),从0x100000开始\n        __kbegin__ = .; # 内核镜像的开始地址\n        __code__ = .;\n        bin/entry.o(.text) bin/main.o(.text) *(.text); # 将bin/entry.o中的.text段安排到内核镜像的最前方\n        . = ALIGN(4096); # .text段按4kb对齐\n    }\n    .data : {\n        __data__ = .;\n        *(.rodata);\n        *(.data);\n        . = ALIGN(4096);\n    }\n    .bss : {\n        __bss__ = .;\n        *(.bss);\n        . = ALIGN(4096);\n    }\n    __kend__ = .; # 内核镜像的结束地址\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

    Memory Management Tools

    perf

    trace

    vmstat

    check usage of virtual memory and swap region

    vmstat 2\n
    1

    pmap

    check detailed usage of memory

    pmap PID\n
    1

    Memory Hot Plug

    TCMalloc

    Google TCMalloc

    Oprofile

    ',390);p.render=function(s,e,p,l,o,i){return n(),a("div",null,[t])};export default p;export{e as __pageData}; diff --git a/assets/computerScience_operatingSystems_operatingSystemsBasicNotes.md.5966c145.lean.js b/assets/computerScience_operatingSystems_operatingSystemsBasicNotes.md.5966c145.lean.js new file mode 100644 index 00000000000..c99d5c93ba5 --- /dev/null +++ b/assets/computerScience_operatingSystems_operatingSystemsBasicNotes.md.5966c145.lean.js @@ -0,0 +1 @@ +import{o as n,c as a,a as s}from"./app.6dd2a1b7.js";const e='{"title":"Operating System Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"OS Definition","slug":"os-definition"},{"level":2,"title":"GCC 内联汇编","slug":"gcc-内联汇编"},{"level":2,"title":"基本概念","slug":"基本概念"},{"level":3,"title":"操作系统的特性","slug":"操作系统的特性"},{"level":3,"title":"操作系统的资源管理功能","slug":"操作系统的资源管理功能"},{"level":3,"title":"操作系统的演变","slug":"操作系统的演变"},{"level":3,"title":"操作系统虚拟机","slug":"操作系统虚拟机"},{"level":3,"title":"操作系统的组织结构","slug":"操作系统的组织结构"},{"level":3,"title":"并发","slug":"并发"},{"level":2,"title":"启动","slug":"启动"},{"level":3,"title":"BIOS","slug":"bios"},{"level":3,"title":"启动顺序","slug":"启动顺序"},{"level":2,"title":"物理内存管理","slug":"物理内存管理"},{"level":3,"title":"Boot Loader 探测机器内存分布","slug":"boot-loader-探测机器内存分布"},{"level":3,"title":"Boot Loader 基本概念","slug":"boot-loader-基本概念"},{"level":3,"title":"连续内存分配","slug":"连续内存分配"},{"level":3,"title":"非连续内存分配","slug":"非连续内存分配"},{"level":3,"title":"内存的特权级","slug":"内存的特权级"},{"level":2,"title":"虚拟内存管理","slug":"虚拟内存管理"},{"level":3,"title":"Page Fault","slug":"page-fault"},{"level":3,"title":"覆盖与交换","slug":"覆盖与交换"},{"level":3,"title":"虚拟页式存储管理","slug":"虚拟页式存储管理"},{"level":2,"title":"中断","slug":"中断"},{"level":3,"title":"中断进入","slug":"中断进入"},{"level":3,"title":"中断实现","slug":"中断实现"},{"level":3,"title":"系统调用","slug":"系统调用"},{"level":2,"title":"进程","slug":"进程"},{"level":3,"title":"进程特权级","slug":"进程特权级"},{"level":3,"title":"进程状态与生命周期","slug":"进程状态与生命周期"},{"level":3,"title":"进程通信","slug":"进程通信"},{"level":3,"title":"线程","slug":"线程"},{"level":3,"title":"内核线程与用户进程","slug":"内核线程与用户进程"},{"level":3,"title":"Process 实现","slug":"process-实现"},{"level":2,"title":"处理机调度","slug":"处理机调度"},{"level":3,"title":"调度时机","slug":"调度时机"},{"level":3,"title":"调度策略","slug":"调度策略"},{"level":2,"title":"同步互斥","slug":"同步互斥"},{"level":3,"title":"临界区的访问原则","slug":"临界区的访问原则"},{"level":3,"title":"基于软件方法的同步互斥","slug":"基于软件方法的同步互斥"},{"level":3,"title":"高级抽象的同步互斥","slug":"高级抽象的同步互斥"},{"level":3,"title":"死锁","slug":"死锁"},{"level":3,"title":"Mutex 实现","slug":"mutex-实现"},{"level":2,"title":"文件系统","slug":"文件系统"},{"level":3,"title":"文件组成","slug":"文件组成"},{"level":3,"title":"文件系统基本数据结构","slug":"文件系统基本数据结构"},{"level":3,"title":"文件分配","slug":"文件分配"},{"level":3,"title":"空闲空间管理","slug":"空闲空间管理"},{"level":3,"title":"冗余磁盘阵列","slug":"冗余磁盘阵列"},{"level":3,"title":"FS 实现","slug":"fs-实现"},{"level":3,"title":"ELF File Format","slug":"elf-file-format"},{"level":2,"title":"设备管理详解","slug":"设备管理详解"},{"level":3,"title":"CGA EGA and ChromaText Video Buffer","slug":"cga-ega-and-chromatext-video-buffer"},{"level":3,"title":"Input and Output","slug":"input-and-output"},{"level":2,"title":"实践","slug":"实践"},{"level":3,"title":"工具","slug":"工具"},{"level":2,"title":"Memory Management Tools","slug":"memory-management-tools"},{"level":3,"title":"perf","slug":"perf"},{"level":3,"title":"trace","slug":"trace"},{"level":3,"title":"vmstat","slug":"vmstat"},{"level":3,"title":"pmap","slug":"pmap"},{"level":3,"title":"Memory Hot Plug","slug":"memory-hot-plug"},{"level":3,"title":"TCMalloc","slug":"tcmalloc"},{"level":3,"title":"Oprofile","slug":"oprofile"}],"relativePath":"computerScience/operatingSystems/operatingSystemsBasicNotes.md","lastUpdated":1627194884000}',p={},t=s('',390);p.render=function(s,e,p,l,o,i){return n(),a("div",null,[t])};export default p;export{e as __pageData}; diff --git a/assets/computerScience_virtualization_virtBasicNotes.md.f20c0b3e.js b/assets/computerScience_virtualization_virtBasicNotes.md.f20c0b3e.js new file mode 100644 index 00000000000..8aca551ad84 --- /dev/null +++ b/assets/computerScience_virtualization_virtBasicNotes.md.f20c0b3e.js @@ -0,0 +1 @@ +import{o as a,c as n,a as s}from"./app.6dd2a1b7.js";const e='{"title":"Virtualization Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"How to read paper","slug":"how-to-read-paper"},{"level":2,"title":"LXC","slug":"lxc"},{"level":3,"title":"Linux Namespaces","slug":"linux-namespaces"},{"level":3,"title":"chroot","slug":"chroot"},{"level":3,"title":"Control Groups","slug":"control-groups"},{"level":2,"title":"In-Memory Computing Thesis Notes","slug":"in-memory-computing-thesis-notes"},{"level":3,"title":"单节点内存计算","slug":"单节点内存计算"},{"level":3,"title":"分布式内存计算","slug":"分布式内存计算"},{"level":3,"title":"混合内存计算","slug":"混合内存计算"},{"level":2,"title":"Hadoop Thesis Notes","slug":"hadoop-thesis-notes"},{"level":3,"title":"Google File System","slug":"google-file-system"},{"level":3,"title":"Map Reduce","slug":"map-reduce"},{"level":3,"title":"Google Big Table","slug":"google-big-table"},{"level":2,"title":"Unikernel","slug":"unikernel"},{"level":3,"title":"Unikernels","slug":"unikernels"},{"level":3,"title":"libOS","slug":"libos"},{"level":3,"title":"OPAM","slug":"opam"},{"level":3,"title":"MirageOS","slug":"mirageos"},{"level":2,"title":"Xen Soft Device","slug":"xen-soft-device"},{"level":3,"title":"Device Access in Xen","slug":"device-access-in-xen"},{"level":2,"title":"Memory Management","slug":"memory-management"},{"level":3,"title":"Direct Segment","slug":"direct-segment"},{"level":3,"title":"Redundant Memory Mappings (RMM)","slug":"redundant-memory-mappings-rmm"}],"relativePath":"computerScience/virtualization/virtBasicNotes.md","lastUpdated":1627194884000}',t={},i=s('

    Virtualization Basic Notes

    How to read paper

    • abstract, introduction, related works, conclusion
    • reference
    • paper refers it (by Google Scholar)

    LXC

    Linux Namespaces

    LXC 所实现的隔离性主要是来自内核的命名空间

    • PID Namespace: 隔离进程
    • Network Namespace: 隔离网络
    • IPC Namespace: 隔离消息
    • Mount Namespace: 隔离文件系统
    • UTS Namespace: 隔离 hostname
    • Users Namespace
    package main\n\nimport (\n    "log"\n    "os"\n    "os/exec"\n    "syscall"\n)\n\nfunc main() {\n    switch os.Args[1] {\n    case "run":\n        run()\n    case "child":\n        child()\n    default:\n        log.Fatal("Invalid command")\n    }\n}\n\nfunc run() {\n    cmd := exec.Command("/proc/self/exe", append([]string{"child"}, os.Args[2:]...)...)\n    cmd.Stdin = os.Stdin\n    cmd.Stdout = os.Stdout\n    cmd.Stderr = os.Stderr\n    cmd.SysProcAttr = &syscall.SysProcAttr {\n        CloneFlags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWPID\n          | syscall.CLONE_NEWNS | syscall.CLONE_NEWUSER,\n        Credential: &syscall.Credential{Uid: 0, Gid: 0},\n        UidMappings: []syscall.SysProcIDMap{\n            {ContainerID: 0, HostID: os.Getuid(), Size: 1},\n        },\n        GidMappings: []syscall.SysProcIDMap{\n            {ContainerID: 0, HostID: os.Getgid(), Size: 1},\n        },\n    }\n\n    must(cmd.Run())\n}\n\nfunc child() {\n    log.Printf("running %v as PID %d\\n", os.Args[2:], os.Getpid())\n\n    // cg()\n\n    cmd := exec.Command(os.Args[2], os.Args[3:]...)\n    cmd.Stdin = os.Stdin\n    cmd.Stdout = os.Stdout\n    cmd.Stderr = os.Stderr\n\n    must(syscall.Sethostname([]byte("mocker")))\n    must(syscall.Chroot("/home/sabertazimi/rootfs"))\n    must(syscall.Chdir("/"))\n    must(syscall.Mount("proc", "proc", "proc", 0, ""))\n    must(cmd.Run())\n    must(syscall.Unmount("proc", 0))\n}\n\nfunc must(err error) {\n    if err != nil {\n        log.Fatal(err)\n    }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63

    chroot

    must(syscall.Chroot("/home/sabertazimi/rootfs"))\nmust(syscall.Chdir("/"))\nmust(syscall.Mount("proc", "proc", "proc", 0, ""))\n
    1
    2
    3

    Control Groups

    cgroups, resources limitation: CPU, Memory, Disk I/O, Process numbers, Network, Device.

    func cg() {\n    cgroups := "/sys/fs/cgroup/"\n    pids := filepath.Join(cgroups, "pids")\n    os.Mkdir(filepath.Join(pids, "sabertazimi"), 0755)\n    must(ioutil.WriteFile(filepath.Join(pids, "sabertazimi/pids.max"),\n      []byte("20"), 0700))\n    must(ioutil.WriteFile(filepath.Join(pids, "sabertazimi/notify_on_release"),\n      []byte("1"), 0700))\n    must(ioutil.WriteFile(filepath.Join(pids, "sabertazimi/cgroup.procs"),\n      []byte(strconv.Itoa(os.Getpid())), 0700))\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    大数据处理典型问题:

    • 数据一致性问题
    • 数据容错与恢复问题
    • 节点通信问题
    • 能耗问题

    In-Memory Computing Thesis Notes

    内存计算特点:

    • 硬件: 大内存
    • 软件: 良好编程模型和编程接口
    • 面向数据密集型应用: 数据规模大, 实时性要求高
    • 大多支持并行处理数据

    内存计算分类:

    • 单节点
    • 分布式集群
    • 新型混合内存 (Hybrid Memory)

    单节点内存计算

    节点拥有 1/n 个处理器(单/多核) + 共享内存 (Shared Memory)

    内存存储系统

    内存数据处理系统

    内存压缩技术

    提升 I/O 访问效率

    分布式内存计算

    • 容错与恢复
    • 同步与一致性
    • 内存分配与管理
    • 网络瓶颈

    分布式内存存储系统

    • 内存压缩技术

    内存缓存系统

    • 内存替换策略: LRU, LFU
    • 预取技术

    分布式内存数据处理系统

    • Spark

    混合内存计算

    铁电存储器: Ferroelectric Random Access Memory, 简称 FeRAM 相变存储器: Phase Change Memory, 简称 PCM 电阻存储器: Resistive Random Access Memory, 简称 RRAM

    Hadoop Thesis Notes

    Google File System

    基本设计

    • 迅速地侦测、冗余并恢复失效的组件

    • 存储一定数量的大文件

    • 大规模的流式读取

    • 小规模的随机读取

    • 大规模的、顺序的、数据追加方式的写操作

    • 小规模的随机位置写入操作

    • 高性能的稳定网络带宽远比低延迟重要

    • 客户端和 Master 节点的通信只获取元数据,所有的数据操作都是由客户端直接和 Chunk 服务器进行交互的

    • 无论是客户端还是 Chunk 服务器都不需要缓存文件数据

    • 出于可靠性的考虑, 每个块都会复制到多个块服务器上.缺省情况下, 我们使用 3 个存储复制节点.

    元数据

    Master 节点主要存储三种类型元数据 (保存在内存中, 轮询 Chunk 服务器/周期心跳信息来更新元数据):

    • 文件和 Chunk 的命名空间
    • 文件和 Chunk 的对应关系
    • 每个 Chunk 副本的存放地点

    元数据操作日志:

    • 先写日志再响应请求
    • Checkpoint 文件
    Chunk 尺寸

    较大的 Chunk 尺寸:

    • 降低元数据读取工作和缓存工作成本
    • 多次操作集中在少数 Chunk 上
    一致性模型
    Chunk 副本修改一致性
    • 对 Chunk 的所有副本的修改操作顺序一致
    • 根据版本号判断 Chunk 是否失效 (未成功进行某次修改), 使用垃圾收集系统回收失效 Chunk

    当某个 Chunk 副本失效, 称为不可用; 当所有 Chunk 副本失效, 称为损坏

    系统交互

    原则: 减小 Master 负担

    租约机制

    Master 为某个 Chunk 建立租约, 称为主 Chunk: 修改顺序由主 Chunk 进行管理, 从而减小 Master 管理负担:

    • Client 与 Master 通信, 获取主 Chunk 信息
    • Client 将数据传至所有 Chunk 副本
    • Client 将操作发送至主 Chunk
    • 主 Chunk 为所有操作分配连续的序列号, 所有副本按照序列号顺序执行操作, 并在完成后回复主 Chunk
    • 主 Chunk 回复 Client

    实际上, 客户端通常会在一次请求中查询多个 Chunk 信息, Master 节点的回应也可能包含了紧跟着这些被请求的 Chunk 后面的 Chunk 的信息. 在实际应用中, 这些额外的信息在没有任何代价的情况下, 避免了客户端和 Master 节点未来可能会发生的几次通讯.

    数据流

    链式顺序最近推送原则: 推送至距离最近 (IP 地址) 的一个下游

    原子追加操作

    GFS 并不保证 Chunk 的所有副本在字节级别是完全一致的。它只保证数据作为一个整体原子的被至少写入一次

    快照

    copy-on-write 技术实现快照

    当 Master 节点收到一个快照请求,它首先取消作快照的文件的所有 Chunk 的租约。这个措施保证了后续对这些 Chunk 的写操作都必须与 Master 交互以找到租约持有者

    Master 节点通过复制源文件或者目录的元数据的方式,把这条日志记录的变化反映到保存在内存的状态中。新创建的快照文件和源文件指向完全相同的 Chunk 地址。

    确保数据在本地复制而不是通过网络复制

    Master 节点

    Master 节点管理所有的文件系统元数据

    元数据包括:

    • 名字空间
    • 访问控制信息
    • 文件和 Chunk 的映射信息
    • 当前 Chunk 的位置信息

    Master 节点基本工作:

    • 执行所有的名称空间操作
    • 管理着整个系统里所有 Chunk 的副本: 决定 Chunk 的存储位置, 创建新 Chunk 和它的副本, 协调各种各样的系统活动以保证 Chunk 被完全复制, 在所有的 Chunk 服务器之间的进行负载均衡, 回收不再使用的存储空间
    名称空间锁

    每一个操作都获取一个目录名的上的读取锁和文件名上的写入锁. 目录名的读取锁足以的防止目录被删除、改名以及被快照. 文件名的写入锁序列化文件创建操作, 确保不会多次创建同名的文件.

    Chunk 副本平衡
    • 平衡硬盘使用率
    • 限制同一台 Chunk 服务器上的正在进行的克隆操作的数量
    • 在机架间分布副本
    垃圾回收
    • 回收过期(版本号不一致)和损坏的 Chunk.
    • GFS 空间回收采用惰性的策略: 只在文件和 Chunk 级的常规垃圾收集时进行真正的删除操作.
    • 垃圾回收把存储空间的回收操作合并到 Master 节点规律性的后台活动中(例行扫描和与 Chunk 服务器握手).

    容错性

    • 快速自启动
    • Chunk 副本
    • Master 服务器副本
    • Chunk Checksum 检验数据完整性

    Map Reduce

    • 分割输入数据 (数据分布)
    • 集群调度 (负载均衡)
    • 错误处理 (容错)
    • 集群通信
    1. 用户程序首先调用的 MapReduce 库将输入文件分成 M 个数据片度,每个数据片段的大小一般从 16MB 到 64MB(可以通过可选的参数来控制每个数据片段的大小)。然后用户程序在机群中创建大量 的程序副本。
    2. 这些程序副本中的有一个特殊的程序–master。副本中其它的程序都是 worker 程序,由 master 分配 任务。有 M 个 Map 任务和 R 个 Reduce 任务将被分配,master 将一个 Map 任务或 Reduce 任务分配 给一个空闲的 worker。
    3. 被分配了 map 任务的 worker 程序读取相关的输入数据片段,从输入的数据片段中解析出 key/value pair,然后把 key/value pair 传递给用户自定义的 Map 函数,由 Map 函数生成并输出的中间 key/value pair,并缓存在内存中。
    4. 缓存中的 key/value pair 通过分区函数分成 R 个区域,之后周期性的写入到本地磁盘上。缓存的 key/value pair 在本地磁盘上的存储位置将被回传给 master,由 master 负责把这些存储位置再传送给 Reduce worker。
    5. 当 Reduce worker 程序接收到 master 程序发来的数据存储位置信息后,使用 RPC 从 Map worker 所在 主机的磁盘上读取这些缓存数据。当 Reduce worker 读取了所有的中间数据后,通过对 key 进行排序 后使得具有相同 key 值的数据聚合在一起。由于许多不同的 key 值会映射到相同的 Reduce 任务上, 因此必须进行排序。如果中间数据太大无法在内存中完成排序,那么就要在外部进行排序。
    6. Reduce worker 程序遍历排序后的中间数据,对于每一个唯一的中间 key 值,Reduce worker 程序将这 个 key 值和它相关的中间 value 值的集合传递给用户自定义的 Reduce 函数。Reduce 函数的输出被追 加到所属分区的输出文件。
    7. 当所有的 Map 和 Reduce 任务都完成之后,master 唤醒用户程序。在这个时候,在用户程序里的对 MapReduce 调用才返回。

    Google Big Table

    BigTable 是一个稀疏的、分布式的、持久化存储的多维度排序, Map: (row: string, column: string, time: int64) -> string.

    数据模型

    • 对同一个行关键字的读或者写操作都是原子的
    • BigTable 通过行关键字的字典顺序来组织数据
    • 表中的每个行都可以动态分区, 每个分区叫做一个 "Tablet"
    • Tablet 是数据分布和负载均衡调整的最小单位
    列族
    • 列关键字组成的集合叫做 "列族", 列族是访问控制的基本单位
    • 存放在同一列族下的所有数据通常都属于同一个类型
    • 访问控制、磁盘和内存的使用统计都是在列族层面进行的
    时间戳
    • 在 BigTable 中, 表的每一个数据项都可以包含同一份数据的不同版本
    • 不同版本的数据通过时间戳来索引

    依赖

    SSTable
    • BigTable 内部存储数据的文件是 Google SSTable 格式的, SSTable 是一个持久化的、排序的、不可更改的 Map 结构
    • SSTable 使用块索引(通常存储在 SSTable 的最后)来定位数据块
    • 在打开 SSTable 的时候,索引被加载到内存
    • 每次查找都可以通过一次磁盘搜索完成: 首先使用二分查找法在内存中的索引里找到数据块的位置,然后再从硬盘读取相应的数据块
    Chubby

    BigTable 使用 Chubby 完成以下的几个任务:

    1. 确保在任何给定的时间内最多只有一个活动的 Master 副本
    2. 存储 BigTable 数据的自引导指令的位置
    3. 查找 Tablet 服务器,以及在 Tablet 服务器失效时进行善后
    4. 存储 BigTable 的模式信息(每张表的列族信息)
    5. 存储访问控制列表

    组件

    BigTable 包括了三个主要的组件: 链接到客户程序中的库、一个 Master 服务器和多个 Tablet 服务器

    Master 服务器

    Master 服务器主要负责以下工作:

    • 为 Tablet 服务器分配 Tablets
    • 检测新加入的或者过期失效的 Table 服务器
    • 对 Tablet 服务器进行负载均衡
    • 对保存在 GFS 上的文件进行垃圾收集
    • 处理对模式的相关修改操作, 例如建立表和列族
    Tablet 服务器
    • 每个 Tablet 服务器都管理一个 Tablet 的集合(通常每个服务器有大约数十个至上千个 Tablet)
    • 每个 Tablet 服务器负责处理它所加载的 Tablet 的读写操作
    • 在 Tablets 过大时,对其进行分割

    实现

    定位
    • 使用三层 B+ 树结构存储 Tablets 的位置信息 (位于哪个 Tablet 服务器上)
    • MetaTablet 中 的 row key 是通过 table id 和 end row 来计算出的: 因为 row 是有序的, 所以在读取 row/column 型的数据时可以利用到有序性.
    服务
    • 当写入表时, 先写日志, 再写入内存中的 memTable, 当其大小达到阈值后, 写入 GFS 中 (以 SSTable 存储)
    • 利用 Log-Structured Merge Tree 来表示 memTable 和 SSTable 之间的关系 (内存数据滚动合并至磁盘)
    • 对于一致性的处理,将 SSTable 不可改变化,然后对 memTable 使用 copy-on-write 技术实现读写并行

    Unikernel

    小、简单、安全、高效

    Fast, Small, Secure Workloads

    Containers are Smaller and Faster, but Security is Still an Issue

    SELinux: 在一个开启了 SELinux 的内核中, 可能存在 10 万条以上的安全策略, 有时无法正常启动服务 (缺少权限)

    Unikernels

    Unikernels do at compile time what standard programs do at runtime:

    • Most unikernels use a specialized compiling system that compiles in the low-level functions the developer has selected
    • The code for these low-level functions is compiled directly into the application executable through a library operating system
    • library operating system: a special collection of libraries that provides needed operating system functions in a compilable format

    Security

    • There is no command shell to leverage
    • There are no utilities to co-opt
    • There are no unused device drivers or unused libraries to attack
    • There are no password files or authorization information present
    • There are no connections to machines and databases not needed by the application

    Debug

    Since there is no operating system environment on a unikernel production VM, there are no tools, no debuggers, no shell access with which someone can probe a failure on a deployed program.

    Instead, all that can be done is to engineer the executable to log events and data so that the failure might be reconstructed on a development system, which still has access to all the debugging tools needed.

    People in our industry have successfully debugged failures of complex software for years without direct access to production systems, and I see no reason why they will fail to do so now.

    Limits

    • Single Process (but Multiple Threads)
    • Single User
    • Limited Debugging
    • Impoverished Library Ecosystem

    Ecosystem

    ClickOS

    network function virtualization (NFV) devices

    RumpRun

    compile most of the programs found on a Linux or Unix-like operating system as unikernels

    OSv

    It is unique among existing unikernels in that it provides a general-purpose unikernel base that can accept just about any program that can run in a single process (multiple threads are allowed, but multiple processes are not).

    As a result, OSv is a "fat" unikernel: the results are measured in megabytes, rather than kilobytes.

    Mini-OS

    Mini-OS is a tiny OS kernel distributed with the Xen Project Hypervisor sources:

    • used as operating system for stub domains that are used for Dom0 Disaggregation.
    • used as a basis for development of Unikernels, having been instrumental in the formation of multiple examples including ClickOS and Rump kernels.
    Xen

    Its paravirtualization capabilities allow unikernels to have a very small and efficient footprint interfacing with devices. This is one reason why the Xen Project has been at the forefront of unikernel development.

    Xen team has been consciously reworking the hypervisor’s capabilities so it can handle a future state where 2,000 or 3,000 simultaneous unikernel VMs may need to coexist on a single hardware host server. Currently, the hypervisor can handle about 1,000 unikernels simultaneously before scaling becomes nonlinear. The development work continues to improve unikernel support in each release.

    Unik
    • UniK is an open source tool written in Go for compiling applications into unikernels and deploying those unikernels.
    • UniK utilizes a simple Docker-like command-line interface, making developing on unikernels as easy as developing on containers.

    libOS

    • implement drivers for the virtual hardware devices provided by the hypervisor
    • create the protocol libraries to replace the services of a traditional OS

    the kernel is event-driven via an I/O loop that polls Xen devices

    OPAM

    modern modular, functional and type-safe programming language

    opam install\nopam update -u\nopam switch\nopam remote\nopam depext\n
    1
    2
    3
    4
    5

    MirageOS

    Exokernel -> Library Operating System -> Unikernel:

    • Unikernels: specialized, sealed, single purpose libOS VMs that run directly on the hypervisor
    • A libOS is structured very differently from a conventional OS: all services, from the scheduler to the device drivers to the network stack, are implemented as libraries linked directly with the application.
    • Coupled with the choice of a modern statically type-safe language for implementation, this affords configuration, performance and security benefits to unikernels.
    • the current release contains clean-slate libraries for TLS, TCP/IP, DNS, Xen network and storage device drivers, HTTP and other common Internet protocols.

    Installation

    opam init\nopam remote\nocaml -version\nopam switch 4.04.2\neval `opam config env`\nopam list\nopam install mirage\n
    1
    2
    3
    4
    5
    6
    7
    mirage --help\nmirage configure --xen\nmake depend\nmake\nsudo xl create -c console.xl\nstrip console.xen\nbzip2 -9 console.xen\n
    1
    2
    3
    4
    5
    6
    7

    Development

    opam source repo.name --dev-repo --pin\n
    1

    Use of OCaml

    OCaml is a pragmatic system that strikes a balance between imperative languages, e.g., C, and pure functional languages, e.g., Haskell. It features type inference, algebraic data types, and higher-order functions, but also permits references and mutable data structures while guaranteeing that all such side-effects are always type safe and will never cause memory corruption.

    • (ICFP'10) a full-fledged systems programming language with a flexible programming model that supports functional, imperative and object-oriented programming
    • OCaml has a simple yet high performance runtime making it an ideal platform for experimenting with the unikernel abstraction that interfaces the runtime with Xen.
    • static typing eliminates type information at compile-time while retaining all the benefits of type-safety (remove dynamic typing overheads and introduce more safety at compile time).
    • (SOSP'03/11) the open-source Xen Cloud Platform and critical system components are implemented in OCaml, making integration straightforward.
    Concurrency
    • lightweight control-flow threads for managing I/O and timeouts
    • optimized inter-VM communication for parallel computation

    Each Mirage instance runs as on a single CPU core. Communication is optimized dynamically: if the VMs are running on the same physical machine, Mirage uses shared memory channels instead of the network stack.

    Thread Flow
    • The application’s main thread is launched immediately after boot and the VM shuts down when it returns.
    • Mirage provides an evaluator that uses domain poll to listen for events and wake up lightweight threads. The VM is thus either executing OCaml code or blocked, with no internal preemption or asynchronous interrupts.
    • The main thread repeatedly executes until it completes or throws an exception, and the domain subsequently shuts down with the VM exit code matching the thread return value.

    Device Drivers

    Data arrives to both the network and storage stacks as a stream of discrete packets. Mirage bridges the gap between packets and streams by using channel iterates that map functions over infinite streams of packets to produce a typed stream.

    I/O Stack

    Mirage implements a Xen block front VFS which interacts directly with a block device without an intervening filesystem.

    Xen Soft Device

    Device-level interfaces in operating systems present a very useful cut-point for researchers to experiment with new ideas. By virtualizing these interfaces, developers can create soft devices, which are used in the same way as normal hardware devices, but provide extra functionality in software.

    Rather than attempting to present a fully virtualized hardware interface to each OS in a Xen environment, guest OSes are modified to use a simple, narrow and idealized view of hardware. Soft devices take advantage of these narrow interface to capture and transform block requests, network packets, and USB messages.

    Device Access in Xen

    Physical driver runs in an isolated VM, connected over a shared memory device channel to a guest VM accessing the device. Operating systems wishing to access the device will use a front-end driver, and interact with the back-end driver over a device channel, which is a shared-memory communications primitive (原语).

    Memory Management

    Direct Segment

    In light of the high cost of page-based virtual memory and its significant mismatch to “big-memory” application needs, we propose mapping part of a process’s linear virtual address with a direct segment rather than pages.

    Mapping part of a process’s linear virtual address space with a direct segment, while page mapping the rest of the virtual address space:

    • retains a standard linear virtual address space
    • is not overlaid on top of paging
    • coexists with paging of other virtual addresses
    • a one-time fixed-cost solution for any size memory

    Large Pages Shortcoming

    • Being a cache, TLBs are reliant on memory-access locality to be effective and it can be a mismatch for future big-memory workloads with poor locality
    • efficient TLB support for multiple page sizes is difficult
    • large page sizes are often few and far apart (not enough for big-memory workload)

    Big-memory workload analysis

    • While address translation can be accelerated by TLB hits, misses are costly, taking up to 100s of cycles
    • A sparse memory access pattern can result in more misses with fewer TLB entries

    For the majority of their address space, big-memory workloads do not require:

    • swapping

    • fragmentation mitigation

    • fine-grained per-page protection

    • Big-memory workloads pay a cost of page based virtual memory: substantial performance lost to TLB misses

    • Big-memory workloads are long-running programs, receive little benefit from virtual memory optimizations whose primary goal is to allow quick program startup, such as demand paging

    • Big-memory workloads consume almost all memory resources, are sized to match memory capacity

    • Big-memory workloads isolate from other services, have one (or a few) primary process(es)

    Hardware Support

    direct segments add three registers per core as follows:

    • BASE holds the start address of the contiguous virtual address range mapped through direct segment
    • LIMIT holds the end address of the virtual address range mapped through direct segment
    • OFFSET holds the start address of direct segment’s backing contiguous physical memory minus the value in BASE.

    Direct segments are aligned to the base page size, so page offset bits are omitted from these registers (e.g., 12 bits for 4KB pages)

    Without real direct segment hardware, we emulate direct segment functionalities using 4KB pages

    More specifically, we modify Linux’s page fault handler so that on a page fault within the primary region it calculates the corresponding physical address from the faulting virtual page number.

    If VA fault is the 4KB page-aligned virtual address of a faulting page, then our modified page-fault handler first checks if BASE ≤ VA fault < LIMIT. If so, the handler adds a mapping from VA fault to VA fault + OFFSET to the page table.

    Software Support

    The prototype implementation is simplified by assuming that only one process uses a direct segment at any time (called the primary process)

    • A primary region is a contiguous range of virtual addresses in a process’s address space with uniform read-write access permission
    • fine-grain protection, sparse allocation, swapping, and demand paging are not guaranteed for memory allocated within the primary region
    • managing physical memory: create contiguous physical memory dynamically through periodic memory compaction
    • managing direct segment registers: When the OS dispatches a thread; it loads the BASE, LIMIT, and OFFSET values from the PCB
    • Growing and shrinking direct segment (by updating direct segment registers and page table entries)

    Virtual Machines with Direct Segment

    In a virtualized environment the memory accesses goes through two levels of address translations:

    1. guest virtual address (gVA) to guest physical address (gPA)
    2. guest physical address (gPA) to system physical address (sPA)

    Results

    In x86-64, page table entries (PTEs) have a set of reserved bits (41-51 in our test platform) that cause a trap when loaded into the TLB

    Redundant Memory Mappings (RMM)

    在大内存系统中, 传统的段页式虚存管理技术存在性能问题 (TLBs 的有限性能):

    • 由于 TLBs 不再能覆盖工作集 (working sets: 指活动频繁的页表集), 导致 TLB 缺失 (TLB misses) 急剧上升
    • 在传统内存层次中, 利用 TLBs 完成地址转换后 (虚拟地址 -> 物理地址), 需要从 L1 Cache 开始进行缓存标签匹配, 查看所需内存数据是否已在缓存上. 因此,随意地增大 TLB 的大小以降低 TLB 缺失的方法会影响到所有内存操作的性能 (遍历 TLB 表耗时增大)

    The amount of memory accessible from the TLB or The working set of each process is stored in the TLB: TLB Reach = (TLB Size) X (Page Size)

    Old Methods

    • Clustered TLBs/Multi-Page Mappings: mapping multiple pages per page table entry
    • Transparent Huge Pages/Super-Paging: 使得每个页表项覆盖更大的内存; 但受限于架构, 页面大小最大为 1GB
    • Direct Segment: 将一个进程所需的虚拟内存直接映射到一个大段中; 但不利用操作系统的动态内存分配

    Multi Page mapping

    • pack multiple page table entries(PTEs) into a single TLB entry
    • they pack only a small multiple of translations per entry, which limits their potential to reduce page-walks for large working sets

    Transparent Huge pages

    • memory should be size-aligned and contiguous
    • many commodity processors provide limited numbers of large page TLB entries

    Direct Segment Method

    • applications explicitly allocate a direct segment during startup
    • OS can reserve a single large contiguous range of physical memory for a segment

    New Methods

    two key challenges:

    • The address space of a process can be decomposed into many chunks of variable length segments, which can be allocated dynamically
    • address translation must be off the critical path: to support complicated many segment searches, address translation may take much longer compared to traditional fixed-sized page-based TLB lookups.

    changes:

    • hardware: range TLB, CR-RT (Control Register - Range Translation)
    • software: process creation, memory allocation, range table management

    RMM Benefits

    • transparent to applications
    • maps multiple ranges with no size-alignment restrictions
    • each range contains an unrestricted amount of memory
    • RMM has the potential to map more than 99% of memory for all workloads with 50 or fewer range translations
    • the range TLB achieves extremely high hit rates, eliminating the vast majority of costly page-walks compared to virtual memory systems that use paging alone.

    RMM performance depends on the range TLB achieving a high hit ratio with few entries

    Range Translation

    Range translations are only base-page-aligned and redundant to paging: the page table still maps the entire virtual address space

    • hardware: range TLBs
    • software: range tables
    • OS: change lazy demand page allocation to eager paging, eager paging allocation

    Eager paging instantiates pages in physical memory at allocation request time, rather than at first-access time as with demand paging.

    Range Table

    • when miss: 及时填补 PTE 以使访存操作正常执行, 将 Range TLB 更新移出访存关键路径 (后台更新)
    • PTE 加入 range bit: 表示当前页是某个 Range 的一部分, 及时更新 Range TLB 和 Range Table
    • 利用 CR-RT 寄存器进行 Range Table 查找: OS handler 可以进行 Range Table 查找, 以简化硬件设计
    • 修改 INVLPG 指令: 使其同时无效化 Range TLB

    Contiguous Memory Allocation

    • One motivation for demand paging was to limit unnecessary swapping in multi-programmed workloads, which modern large memories make less common.
    • RMM trades increased memory for better performance, a common tradeoff when memory is cheap and plentiful.
    ',229);t.render=function(s,e,t,o,l,p){return a(),n("div",null,[i])};export default t;export{e as __pageData}; diff --git a/assets/computerScience_virtualization_virtBasicNotes.md.f20c0b3e.lean.js b/assets/computerScience_virtualization_virtBasicNotes.md.f20c0b3e.lean.js new file mode 100644 index 00000000000..71d55059e12 --- /dev/null +++ b/assets/computerScience_virtualization_virtBasicNotes.md.f20c0b3e.lean.js @@ -0,0 +1 @@ +import{o as a,c as n,a as s}from"./app.6dd2a1b7.js";const e='{"title":"Virtualization Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"How to read paper","slug":"how-to-read-paper"},{"level":2,"title":"LXC","slug":"lxc"},{"level":3,"title":"Linux Namespaces","slug":"linux-namespaces"},{"level":3,"title":"chroot","slug":"chroot"},{"level":3,"title":"Control Groups","slug":"control-groups"},{"level":2,"title":"In-Memory Computing Thesis Notes","slug":"in-memory-computing-thesis-notes"},{"level":3,"title":"单节点内存计算","slug":"单节点内存计算"},{"level":3,"title":"分布式内存计算","slug":"分布式内存计算"},{"level":3,"title":"混合内存计算","slug":"混合内存计算"},{"level":2,"title":"Hadoop Thesis Notes","slug":"hadoop-thesis-notes"},{"level":3,"title":"Google File System","slug":"google-file-system"},{"level":3,"title":"Map Reduce","slug":"map-reduce"},{"level":3,"title":"Google Big Table","slug":"google-big-table"},{"level":2,"title":"Unikernel","slug":"unikernel"},{"level":3,"title":"Unikernels","slug":"unikernels"},{"level":3,"title":"libOS","slug":"libos"},{"level":3,"title":"OPAM","slug":"opam"},{"level":3,"title":"MirageOS","slug":"mirageos"},{"level":2,"title":"Xen Soft Device","slug":"xen-soft-device"},{"level":3,"title":"Device Access in Xen","slug":"device-access-in-xen"},{"level":2,"title":"Memory Management","slug":"memory-management"},{"level":3,"title":"Direct Segment","slug":"direct-segment"},{"level":3,"title":"Redundant Memory Mappings (RMM)","slug":"redundant-memory-mappings-rmm"}],"relativePath":"computerScience/virtualization/virtBasicNotes.md","lastUpdated":1627194884000}',t={},i=s('',229);t.render=function(s,e,t,o,l,p){return a(),n("div",null,[i])};export default t;export{e as __pageData}; diff --git a/assets/ctype.h.b7c42e1e.jpg b/assets/ctype.h.b7c42e1e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5c21e9271dcbf1d1f3b0861f3452b3cd3077c0d3 GIT binary patch literal 15117 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

    c$ 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 literal 0 HcmV?d00001 diff --git a/assets/foldl.8f7f9807.png b/assets/foldl.8f7f9807.png new file mode 100644 index 0000000000000000000000000000000000000000..23af745573cdc47db077e43211bf26ea49e1a649 GIT binary patch literal 8333 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 Awesome Notes

    OJ Basic Notes

  •                                    _\n  _      _____  ___  ___  _ __ ___   ___   _ __   ___ | |_ ___  ___\n   \\ /\\ / / _ \\/ __|/ _ \\| '_ ` _ \\ / _ \\ | '_ \\ / _ \\| __/ _ \\/ __|\n  \\ V  V /  __/\\__ \\ (_) | | | | | |  __/ | | | | (_) | ||  __/\\__ \\\n   \\_/\\_/ \\___||___/\\___/|_| |_| |_|\\___| |_| |_|\\___/ \\__\\___||___/\n
    1
    2
    3
    4
    5

    AuthorLICENSE

    Code LinesContinuous Integration

    Personal Learning Notes - Awesome Notes for Myself.

    GitHub Version built on VitePress. GitBook Version built on GitBook.IO.

    License

    MIT License Copyright (c) sabertazimi

    Contact

    EmailTwitterGitHub

    ',10);t.render=function(e,n,t,p,r,i){return a(),s("div",null,[o])};export default t;export{n as __pageData}; diff --git a/assets/index.md.6d96cb4c.lean.js b/assets/index.md.6d96cb4c.lean.js new file mode 100644 index 00000000000..50ea78bffa2 --- /dev/null +++ b/assets/index.md.6d96cb4c.lean.js @@ -0,0 +1 @@ +import{o as a,c as s,a as e}from"./app.6dd2a1b7.js";const n='{"title":"Awesome Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"License","slug":"license"},{"level":2,"title":"Contact","slug":"contact"}],"relativePath":"index.md","lastUpdated":1627216236000}',t={},o=e('',10);t.render=function(e,n,t,p,r,i){return a(),s("div",null,[o])};export default t;export{n as __pageData}; diff --git a/assets/language_assembly_assemblyBasicNotes.md.8a26b6c6.js b/assets/language_assembly_assemblyBasicNotes.md.8a26b6c6.js new file mode 100644 index 00000000000..ccc19e3a86e --- /dev/null +++ b/assets/language_assembly_assemblyBasicNotes.md.8a26b6c6.js @@ -0,0 +1 @@ +import{o as a,c as s,a as n}from"./app.6dd2a1b7.js";const e='{"title":"Assembly Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Assembly Execution Model","slug":"assembly-execution-model"},{"level":2,"title":"Tools","slug":"tools"},{"level":3,"title":"GCC","slug":"gcc"},{"level":3,"title":"GDB","slug":"gdb"},{"level":3,"title":"MASM","slug":"masm"},{"level":3,"title":"LINK","slug":"link"},{"level":3,"title":"TD","slug":"td"},{"level":3,"title":"NMAKE","slug":"nmake"},{"level":3,"title":"Objdump","slug":"objdump"},{"level":2,"title":"位运算","slug":"位运算"},{"level":2,"title":"Address","slug":"address"},{"level":3,"title":"mov","slug":"mov"},{"level":3,"title":"address","slug":"address-1"},{"level":2,"title":"常用命令","slug":"常用命令"},{"level":3,"title":"读取指令","slug":"读取指令"},{"level":3,"title":"算术命令","slug":"算术命令"},{"level":3,"title":"转移命令","slug":"转移命令"},{"level":2,"title":"Control Flow Statement","slug":"control-flow-statement"},{"level":3,"title":"If Statement","slug":"if-statement"},{"level":3,"title":"Loop Statement","slug":"loop-statement"},{"level":3,"title":"Switch Statement","slug":"switch-statement"},{"level":2,"title":"Stack Frame","slug":"stack-frame"},{"level":2,"title":"Data Structure","slug":"data-structure"},{"level":3,"title":"Arrays","slug":"arrays"}],"relativePath":"language/assembly/assemblyBasicNotes.md","lastUpdated":1627196319000}',l={},t=n('

    Assembly Basic Notes

    Assembly Execution Model

    Load-ALU-Store 模式 - 读入寄存器,算术逻辑单元运算,回写至内存

    Tools

    GCC

    • gcc -01/-02/-03 source.c —— 编译优化等级
    • gcc -S source.c —— 编译成汇编代码(文本文件)
    • gcc -o source.c —— 编译成 Object 代码(二进制文件)

    GDB

    • si 单指令执行
    • x/i $pc   执行 si 命令时打印汇编代码
    • disas 显示汇编代码
    • bt 查看函数堆栈
    • step1  下一条汇编指令
    • info register
    • x /numsizeformat $pc/rsp/rbp

    MASM

    masm /Zi/Zd src dist\nmasm /I(path)           // 引用 标准库/宏\nmasm /I..\\include\n
    1
    2
    3
    link /DEBUG src\n
    1

    TD

    • tab 切换分区
    • alt 功能键
    • ctrl 子功能键

    Basic

    • F2: break
    • F7: step into
    • F8: step over

    Alt

    • Alt+F5 : 临时跳转至 dos 界面
    • Alt+Enter: 全屏
    • Alt+X : 退出

    代码区

    • <C-A> Assemble: 临时修改汇编指令
    • <C-C> Caller : 从子程序处跳回至 Caller 处
    • <C-F> Follow : 查看 CALL/JMP/INT 跳转至的子程序处
    • <C-O> Origin : 跳转至 cs:ip 指向指令处

    数据区

    • <C-C> Change: 临时修改数据
    • <C-D> Display: 选择显示格式 e.g Byte/Word/Long/Comp/Float/Real/Double/Extended
    • <C-G> Goto: 跳转至指定地址区

    NMAKE

    • $<: 源文件名
    • $?: 所有源文件名
    • $@: 全路径的目标文件
    • $*: 除去扩展名的全路径的目标文件
    EXE = $(NAME).exe\nOBJS = $(NAME).obj\nSRCS = $(NAME).asm\nSIMPLE_MODE = ;\n\nLINK_FLAG = /subsystem:windows\nML_FLAG = /c/coff/Zi\nMASM_FLAG = /Zi/Zd\n\n$(EXE): $(OBJS)\n    link $(LINK_FLAG) $(OBJS) $(SIMPLE_MODE)\n\n$(OBJS): $(SRCS)\n    masm $(MASM_FLAG) $(SRCS) $(SIMPLE_MODE)\n\nclean:\n    del *.obj\n    del *.tr\n\ntest:\n    td $(EXE)\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21

    Objdump

    AT&T反汇编工具

    位运算

    • ^:无进位
    • p && *p++ : NULL 检查

    编码:2^n e.g 一副牌的编码 2 位牌色位+4 位数字位

    Address

    mov

    movX src dest #X:b/w/l/q (1/2/4/8 字节)

    address

    • D(Rb, Ri, S) —— MEM[ Reg[Rb] + S * Reg[Ri] + D]
    • leal 命令
      • leal D(Rb, Ri, S) dest - 将地址模式表达式的址存入 dest. 作用为快速给指针赋值p = &x[i]Mem[Reg[x] + i * size]->(x, size, I), 快速计算二次多项式 x + i * k.

    常用命令

    读取指令

    mov 读取

    内存数据重复读入寄存器 - 使得汇编代码与上下文无关,减少 BUG 产生可能性

    R1 = MEM[SP + 8]\n……\nR1 = MEM[SP + 8]\n……\nR1 = MEM[SP + 8]\n……\n
    1
    2
    3
    4
    5
    6

    算术命令

    转移命令

    • Flags

      • CF:Carry Flag(unsigned) 进位标志——当有进位时设为 1
      • OF:OverFlow Flag(signed) 溢出标志——当补码溢出时设为 1
      • SF:Sign Flag(signed) 符号标志——当 t<0 时设为 1
      • ZF:Zero Flag 零标志——当 t==0 时设为 1
    • cmpX 命令 cmpl Src2, Src1 根据 Src1 – Src2(subl Src2, Src1)的结果设置标志寄存器的值

    • testX 命令 testl Src2, Src1 根据 Src1 & Src2(andl Src2, Src1)的结果设置标志寄存器的值

      e.g testl %eax, %eax 实现符号函数

    • setX 命令 根据标志寄存器运算值,将值存入 dest setX dest

    Control Flow Statement

    If Statement

    cmovC src, dest(C 表示 Conditional——e/ne 等) 当条件成立时,src->dest src 与 dest 可分别用于存放两种情况的值

    Loop Statement

    Do While Statement

    While Do Statement

    For Statement

    Switch Statement

    Jump Table:

    break; → leaveret

    • fallThrough(without break)
    • mixing(连冒号)
    • missing case

    Stack Frame

    # 准备阶段\n# Caller-Save: %eax %ecx %edx\n# Callee-Save: %ebx %esi %edi\n# 传参顺序: rdi, dsi, rdx, rcx, r8, r9, stack\n\npushl %ebp\nmovl %esp, %ebp\npushl %ebx\n\n# 结束阶段\n\nmovl -4(%ebp), %ebx\nmovl %ebp, %esp\npopl %ebp\nret\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    Data Structure

    Arrays

    int get_sea_digit(int index, int dig) {\n    return sea[index][dig];\n}\n
    1
    2
    3
    # 访问二维数组元素\n# %ecx = dig\n# %eax = index\nleal 0(,%ecx,4), %edx        # 4 * dig\nleal (%eax,%eax,4), %eax     # 5 * index\nmovl sea(%edx,%eax,4), %eax  # * (sea + 4 * dig + 20 * index)\n
    1
    2
    3
    4
    5
    6
    ',61);l.render=function(n,e,l,p,o,c){return a(),s("div",null,[t])};export default l;export{e as __pageData}; diff --git a/assets/language_assembly_assemblyBasicNotes.md.8a26b6c6.lean.js b/assets/language_assembly_assemblyBasicNotes.md.8a26b6c6.lean.js new file mode 100644 index 00000000000..8e672867b59 --- /dev/null +++ b/assets/language_assembly_assemblyBasicNotes.md.8a26b6c6.lean.js @@ -0,0 +1 @@ +import{o as a,c as s,a as n}from"./app.6dd2a1b7.js";const e='{"title":"Assembly Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Assembly Execution Model","slug":"assembly-execution-model"},{"level":2,"title":"Tools","slug":"tools"},{"level":3,"title":"GCC","slug":"gcc"},{"level":3,"title":"GDB","slug":"gdb"},{"level":3,"title":"MASM","slug":"masm"},{"level":3,"title":"LINK","slug":"link"},{"level":3,"title":"TD","slug":"td"},{"level":3,"title":"NMAKE","slug":"nmake"},{"level":3,"title":"Objdump","slug":"objdump"},{"level":2,"title":"位运算","slug":"位运算"},{"level":2,"title":"Address","slug":"address"},{"level":3,"title":"mov","slug":"mov"},{"level":3,"title":"address","slug":"address-1"},{"level":2,"title":"常用命令","slug":"常用命令"},{"level":3,"title":"读取指令","slug":"读取指令"},{"level":3,"title":"算术命令","slug":"算术命令"},{"level":3,"title":"转移命令","slug":"转移命令"},{"level":2,"title":"Control Flow Statement","slug":"control-flow-statement"},{"level":3,"title":"If Statement","slug":"if-statement"},{"level":3,"title":"Loop Statement","slug":"loop-statement"},{"level":3,"title":"Switch Statement","slug":"switch-statement"},{"level":2,"title":"Stack Frame","slug":"stack-frame"},{"level":2,"title":"Data Structure","slug":"data-structure"},{"level":3,"title":"Arrays","slug":"arrays"}],"relativePath":"language/assembly/assemblyBasicNotes.md","lastUpdated":1627196319000}',l={},t=n('',61);l.render=function(n,e,l,p,o,c){return a(),s("div",null,[t])};export default l;export{e as __pageData}; diff --git a/assets/language_c_cBasicNotes.md.4b46ee41.js b/assets/language_c_cBasicNotes.md.4b46ee41.js new file mode 100644 index 00000000000..fbfd60fbdf0 --- /dev/null +++ b/assets/language_c_cBasicNotes.md.4b46ee41.js @@ -0,0 +1 @@ +import{o as n,c as s,b as a,d as e}from"./app.6dd2a1b7.js";const t='{"title":"C Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"编程习惯","slug":"编程习惯"},{"level":3,"title":"Macro(宏)","slug":"macro-宏"},{"level":3,"title":"头文件","slug":"头文件"},{"level":3,"title":"检查","slug":"检查"},{"level":2,"title":"类型转换","slug":"类型转换"},{"level":3,"title":"机器码转换","slug":"机器码转换"},{"level":2,"title":"Pointer Tips and Best Practice","slug":"pointer-tips-and-best-practice"},{"level":3,"title":"Error Prone Pointers","slug":"error-prone-pointers"},{"level":3,"title":"Debugging Malloc","slug":"debugging-malloc"},{"level":3,"title":"利用 void 指针实现 Generic","slug":"利用-void-指针实现-generic"},{"level":2,"title":"Useful Functions","slug":"useful-functions"},{"level":3,"title":"memset","slug":"memset"},{"level":3,"title":"free","slug":"free"},{"level":3,"title":"Strings","slug":"strings"},{"level":3,"title":"I/O","slug":"i-o"},{"level":3,"title":"Exceptions","slug":"exceptions"},{"level":3,"title":"Process","slug":"process"},{"level":3,"title":"Threads","slug":"threads"},{"level":2,"title":"联合体","slug":"联合体"},{"level":2,"title":"Naming Conventions","slug":"naming-conventions"},{"level":3,"title":"常用缩写词","slug":"常用缩写词"},{"level":3,"title":"Header File","slug":"header-file"},{"level":2,"title":"C Standard Library","slug":"c-standard-library"},{"level":3,"title":"Assert","slug":"assert"},{"level":3,"title":"Types","slug":"types"},{"level":3,"title":"Errno","slug":"errno"},{"level":3,"title":"Float and Limits","slug":"float-and-limits"},{"level":3,"title":"Locale","slug":"locale"},{"level":3,"title":"Math","slug":"math"},{"level":3,"title":"SetJMP","slug":"setjmp"},{"level":3,"title":"Signal","slug":"signal"},{"level":3,"title":"Stdarg","slug":"stdarg"},{"level":3,"title":"Stddef","slug":"stddef"},{"level":3,"title":"String","slug":"string"},{"level":2,"title":"GDB Tutorial","slug":"gdb-tutorial"},{"level":3,"title":"Basic Command","slug":"basic-command"},{"level":3,"title":"GDB Set Command","slug":"gdb-set-command"},{"level":3,"title":"GDB Shell","slug":"gdb-shell"},{"level":3,"title":"GDB Assemble","slug":"gdb-assemble"},{"level":3,"title":"GDB Stack Frame","slug":"gdb-stack-frame"},{"level":2,"title":"GCC","slug":"gcc"},{"level":2,"title":"Awesome Tools","slug":"awesome-tools"}],"relativePath":"language/c/cBasicNotes.md","lastUpdated":1627196319000}',l={},o=a("h1",{id:"c-basic-notes"},[a("a",{class:"header-anchor",href:"#c-basic-notes","aria-hidden":"true"},"#"),e(" C Basic Notes")],-1),c=a("p",null,[a("div",{class:"table-of-contents"},[a("ul",null,[a("li",null,[a("a",{href:"#c-basic-notes"},"C Basic Notes"),a("ul",null,[a("li",null,[a("a",{href:"#编程习惯"},"编程习惯")]),a("li",null,[a("a",{href:"#类型转换"},"类型转换")]),a("li",null,[a("a",{href:"#pointer-tips-and-best-practice"},"Pointer Tips and Best Practice")]),a("li",null,[a("a",{href:"#useful-functions"},"Useful Functions")]),a("li",null,[a("a",{href:"#联合体"},"联合体")]),a("li",null,[a("a",{href:"#naming-conventions"},"Naming Conventions")]),a("li",null,[a("a",{href:"#c-standard-library"},"C Standard Library")]),a("li",null,[a("a",{href:"#gdb-tutorial"},"GDB Tutorial")]),a("li",null,[a("a",{href:"#gcc"},"GCC")]),a("li",null,[a("a",{href:"#awesome-tools"},"Awesome Tools")])])])])])],-1),r=a("h2",{id:"编程习惯"},[a("a",{class:"header-anchor",href:"#编程习惯","aria-hidden":"true"},"#"),e(" 编程习惯")],-1),p=a("h3",{id:"macro-宏"},[a("a",{class:"header-anchor",href:"#macro-宏","aria-hidden":"true"},"#"),e(" Macro(宏)")],-1),i=a("h4",{id:"括号"},[a("a",{class:"header-anchor",href:"#括号","aria-hidden":"true"},"#"),e(" 括号")],-1),u=a("p",null,"尽量添加足够的括号,减少宏定义的二义性",-1),k=a("h4",{id:"特殊用法"},[a("a",{class:"header-anchor",href:"#特殊用法","aria-hidden":"true"},"#"),e(" 特殊用法")],-1),d=a("ul",null,[a("li",null,[a("code",null,"#"),e(": 字符串化")]),a("li",null,[a("code",null,"##"),e(": 强制连接符")]),a("li",null,"do { ... } while (0): 防止语法错误")],-1),m=a("h3",{id:"头文件"},[a("a",{class:"header-anchor",href:"#头文件","aria-hidden":"true"},"#"),e(" 头文件")],-1),b=a("h4",{id:"缺少标准库头文件"},[a("a",{class:"header-anchor",href:"#缺少标准库头文件","aria-hidden":"true"},"#"),e(" 缺少标准库头文件")],-1),h=a("h5",{id:"缺少函数原型"},[a("a",{class:"header-anchor",href:"#缺少函数原型","aria-hidden":"true"},"#"),e(" 缺少函数原型")],-1),y=a("p",null,[e("链接成功 - 链接器自动装载库函数,不影响程序执行 "),a("strong",null,"只警告,不报错")],-1),f=a("h5",{id:"覆盖标准库函数原型"},[a("a",{class:"header-anchor",href:"#覆盖标准库函数原型","aria-hidden":"true"},"#"),e(" 覆盖标准库函数原型")],-1),v=a("ul",null,[a("li",null,"定义过多参数原型,调用时传入过多参数,函数正确执行(无视多余参数)"),a("li",null,"定义缺少参数原型,调用时传入不完整参数,函数错误执行,误把 0xc(%ebp),0x10(%ebp),…等更多内存单元当作函数参数")],-1),g=a("h5",{id:"缺少宏定义"},[a("a",{class:"header-anchor",href:"#缺少宏定义","aria-hidden":"true"},"#"),e(" 缺少宏定义")],-1),w=a("p",null,"链接失败 - 宏定义会被识别为函数,但链接器查找不到相应库函数",-1),x=a("h4",{id:"防止重复包括头文件"},[a("a",{class:"header-anchor",href:"#防止重复包括头文件","aria-hidden":"true"},"#"),e(" 防止重复包括头文件")],-1),E=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"ifndef"),e(),a("span",{class:"token expression"},"_FILENAME_H_")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"_FILENAME_H_")]),e("\n\n"),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),e("\n"),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),e("\n"),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),e("\n\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"endif")]),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),_=a("h4",{id:"头文件不申请内存单元"},[a("a",{class:"header-anchor",href:"#头文件不申请内存单元","aria-hidden":"true"},"#"),e(" 头文件不申请内存单元")],-1),N=a("p",null,"除了全局共享静态变量外, 头文件中的定义不允许申请实际的内存单元",-1),S=a("h3",{id:"检查"},[a("a",{class:"header-anchor",href:"#检查","aria-hidden":"true"},"#"),e(" 检查")],-1),T=a("h4",{id:"边界检查"},[a("a",{class:"header-anchor",href:"#边界检查","aria-hidden":"true"},"#"),e(" 边界检查")],-1),O=a("ul",null,[a("li",null,"空/满栈检查"),a("li",null,"参数合法性检查 e.g elemSize > 0 检查")],-1),L=a("h4",{id:"指针检查"},[a("a",{class:"header-anchor",href:"#指针检查","aria-hidden":"true"},"#"),e(" 指针检查")],-1),A=a("ul",null,[a("li",null,[e("Alloctor 失败,需添加 NULL 检查: "),a("ul",null,[a("li",null,"assert"),a("li",null,"exit")])])],-1),C=a("h2",{id:"类型转换"},[a("a",{class:"header-anchor",href:"#类型转换","aria-hidden":"true"},"#"),e(" 类型转换")],-1),D=a("h3",{id:"机器码转换"},[a("a",{class:"header-anchor",href:"#机器码转换","aria-hidden":"true"},"#"),e(" 机器码转换")],-1),R=a("ul",null,[a("li",null,"有符号类型转换: 进行符号扩展"),a("li",null,"无符号类型转换: 进行零扩展")],-1),I=a("h2",{id:"pointer-tips-and-best-practice"},[a("a",{class:"header-anchor",href:"#pointer-tips-and-best-practice","aria-hidden":"true"},"#"),e(" Pointer Tips and Best Practice")],-1),P=a("h3",{id:"error-prone-pointers"},[a("a",{class:"header-anchor",href:"#error-prone-pointers","aria-hidden":"true"},"#"),e(" Error Prone Pointers")],-1),M=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"int"),e(" i "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"37"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"float"),e(" f "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"float"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"&"),e("i"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"float"),e(" f "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"7.0"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"short"),e(" s "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"short"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"&"),e("f"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),B=a("ul",null,[a("li",null,"悬挂指针"),a("li",null,"未初始化"),a("li",null,[e("改写未知区域 "),a("ul",null,[a("li",null,"下标越界"),a("li",null,[e("内存上溢 e.g "),a("code",null,"gets(string);")])])]),a("li",null,"指针相关运算符优先级与结合性"),a("li",null,"返回局部变量的地址"),a("li",null,"重复释放内存空间"),a("li",null,"内存泄漏 e.g 未释放空间/未释放部分深度空间(多维数组)"),a("li",null,"不能引用 void 指针指向的内存单元")],-1),U=a("h3",{id:"debugging-malloc"},[a("a",{class:"header-anchor",href:"#debugging-malloc","aria-hidden":"true"},"#"),e(" Debugging Malloc")],-1),F=a("h4",{id:"处理-void-指针"},[a("a",{class:"header-anchor",href:"#处理-void-指针","aria-hidden":"true"},"#"),e(" 处理 void 指针")],-1),G=a("p",null,"Tips: 中途运用强制类型转换,使得 void 指针可以执行指针加减运算",-1),H=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("target "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e("void_pointer "),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),z=a("h3",{id:"利用-void-指针实现-generic"},[a("a",{class:"header-anchor",href:"#利用-void-指针实现-generic","aria-hidden":"true"},"#"),e(" 利用 void 指针实现 Generic")],-1),X=a("h4",{id:"通用型-swap-函数"},[a("a",{class:"header-anchor",href:"#通用型-swap-函数","aria-hidden":"true"},"#"),e(" 通用型 Swap 函数")],-1),j=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"swap"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("vp1"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("vp2"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"int"),e(" size"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"char"),e(" buffer"),a("span",{class:"token punctuation"},"["),e("size"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token function"},"memcpy"),a("span",{class:"token punctuation"},"("),e("buffer"),a("span",{class:"token punctuation"},","),e(" vp1"),a("span",{class:"token punctuation"},","),e(" size"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token function"},"memcpy"),a("span",{class:"token punctuation"},"("),e("vp1"),a("span",{class:"token punctuation"},","),e(" vp2"),a("span",{class:"token punctuation"},","),e(" size"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token function"},"memcpy"),a("span",{class:"token punctuation"},"("),e("vp2"),a("span",{class:"token punctuation"},","),e(" buffer"),a("span",{class:"token punctuation"},","),e(" size"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),q=a("h4",{id:"通用型-search-function"},[a("a",{class:"header-anchor",href:"#通用型-search-function","aria-hidden":"true"},"#"),e(" 通用型 Search Function")],-1),K=a("h5",{id:"实现"},[a("a",{class:"header-anchor",href:"#实现","aria-hidden":"true"},"#"),e(" 实现")],-1),V=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token function"},"lsearch"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("key"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("base"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"int"),e(" n"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"int"),e(" elemSize"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),e("cmp_fn"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"for"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),e(" i "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("i "),a("span",{class:"token operator"},"<"),e(" n"),a("span",{class:"token punctuation"},";"),e("i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e(" elemAddr "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e("base "),a("span",{class:"token operator"},"+"),e(" i "),a("span",{class:"token operator"},"*"),e(" elemSize"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"cmp_fn"),a("span",{class:"token punctuation"},"("),e("key"),a("span",{class:"token punctuation"},","),e(" elemAddr"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"return"),e(" elemAddr"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n\n "),a("span",{class:"token keyword"},"return"),e(),a("span",{class:"token constant"},"NULL"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),Y=a("h5",{id:"int-实例"},[a("a",{class:"header-anchor",href:"#int-实例","aria-hidden":"true"},"#"),e(" int 实例")],-1),W=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token function"},"IntCmp"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("elem1"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("elem2"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token operator"},"*"),e("ip1 "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e("elem1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token operator"},"*"),e("ip2 "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e("elem2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"return"),e(),a("span",{class:"token operator"},"*"),e("ip1 "),a("span",{class:"token operator"},"-"),e(),a("span",{class:"token operator"},"*"),e("ip2"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),Q=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"int"),e(" array"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"11"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),e("\n size "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),e("\n target "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token comment"},"// 应进行强制类型转换"),e("\n"),a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token operator"},"*"),e(" found "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token function"},"lsearch"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"&"),e("target"),a("span",{class:"token punctuation"},","),e(" array"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"sizeof"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e(" IntCmp"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("found "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token constant"},"NULL"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"Not Found"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"Found"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br")])],-1),J=a("h5",{id:"string-实例"},[a("a",{class:"header-anchor",href:"#string-实例","aria-hidden":"true"},"#"),e(" string 实例")],-1),$=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token function"},"StrCmp"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("vp1"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("vp2"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"// 必须进行强制类型转换"),e("\n "),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),e("s1 "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e("vp1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),e("s2 "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e("vp2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"return"),e(),a("span",{class:"token function"},"strcmp"),a("span",{class:"token punctuation"},"("),e("s1"),a("span",{class:"token punctuation"},","),e(" s2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),Z=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),e("notes"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token string"},'"Ab"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token string"},'"F#"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token string"},'"B"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token string"},'"Gb"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token string"},'"D"'),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token operator"},"*"),e("target "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"Eb"'),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token operator"},"*"),e(" found "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token function"},"lsearch"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"&"),e("target"),a("span",{class:"token punctuation"},","),e(" notes"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"sizeof"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e(" StrCmp"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),nn=a("h4",{id:"泛型数据结构"},[a("a",{class:"header-anchor",href:"#泛型数据结构","aria-hidden":"true"},"#"),e(" 泛型数据结构")],-1),sn=a("h5",{id:"通用型栈"},[a("a",{class:"header-anchor",href:"#通用型栈","aria-hidden":"true"},"#"),e(" 通用型栈")],-1),an=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"typedef"),e(),a("span",{class:"token keyword"},"struct"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("elements"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"int"),e(" elemSize"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"int"),e(" logLen"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"int"),e(" allocLen"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e(" stack"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"StackNew"),a("span",{class:"token punctuation"},"("),e("stack "),a("span",{class:"token operator"},"*"),e("s"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"int"),e(" elemSize"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"StackDispose"),a("span",{class:"token punctuation"},"("),e("stack "),a("span",{class:"token operator"},"*"),e("s"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"StackPush"),a("span",{class:"token punctuation"},"("),e("stack "),a("span",{class:"token operator"},"*"),e("s"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("elemAddr"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"StackPop"),a("span",{class:"token punctuation"},"("),e("stack "),a("span",{class:"token operator"},"*"),e("s"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("elemAddr"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),en=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"StackNew"),a("span",{class:"token punctuation"},"("),e("stack "),a("span",{class:"token operator"},"*"),e("s"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"int"),e(" elemSize"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"// 参数合法性检查"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("s"),a("span",{class:"token operator"},"->"),e("elemSize "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"perror"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"ElemSize <= 0"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"return"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n\n s"),a("span",{class:"token operator"},"->"),e("elemSize "),a("span",{class:"token operator"},"="),e(" elemSize"),a("span",{class:"token punctuation"},";"),e("\n s"),a("span",{class:"token operator"},"->"),e("logLen "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n s"),a("span",{class:"token operator"},"->"),e("allocLen "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},";"),e("\n s"),a("span",{class:"token operator"},"->"),e("elements "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token function"},"malloc"),a("span",{class:"token punctuation"},"("),e("s"),a("span",{class:"token operator"},"->"),e("allocLen "),a("span",{class:"token operator"},"*"),e(" elemSize"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token comment"},"// NULL检查"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("s"),a("span",{class:"token operator"},"->"),e("elements "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token constant"},"NULL"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"perror"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"No Mem"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token function"},"exit"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n\n"),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"StackPush"),a("span",{class:"token punctuation"},"("),e("stack "),a("span",{class:"token operator"},"*"),e("s"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("elemAddr"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"// 满栈检查"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("s"),a("span",{class:"token operator"},"->"),e("logLen "),a("span",{class:"token operator"},"=="),e(" s"),a("span",{class:"token operator"},"->"),e("allocLen"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n s"),a("span",{class:"token operator"},"->"),e("allocLen "),a("span",{class:"token operator"},"*="),e(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},";"),e("\n s"),a("span",{class:"token operator"},"->"),e("elements "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token function"},"malloc"),a("span",{class:"token punctuation"},"("),e("s"),a("span",{class:"token operator"},"->"),e("elements"),a("span",{class:"token punctuation"},","),e(" s"),a("span",{class:"token operator"},"->"),e("allocLen "),a("span",{class:"token operator"},"*"),e(" s"),a("span",{class:"token operator"},"->"),e("elemSize"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n\n "),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("target "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e("s"),a("span",{class:"token operator"},"->"),e("elements "),a("span",{class:"token operator"},"+"),e(" s"),a("span",{class:"token operator"},"->"),e("logLen "),a("span",{class:"token operator"},"*"),e(" s"),a("span",{class:"token operator"},"->"),e("elemSize"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token function"},"memcpy"),a("span",{class:"token punctuation"},"("),e("target"),a("span",{class:"token punctuation"},","),e(" elemAddr"),a("span",{class:"token punctuation"},","),e(" s"),a("span",{class:"token operator"},"->"),e("elemSize"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n s"),a("span",{class:"token operator"},"->"),e("logLen"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n\n"),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"StackPop"),a("span",{class:"token punctuation"},"("),e("stack "),a("span",{class:"token operator"},"*"),e("s"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("elemAddr"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"// 空栈检查"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("s"),a("span",{class:"token operator"},"->"),e("logLen "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"perror"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"Empty Stack"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"return"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n\n s"),a("span",{class:"token operator"},"->"),e("logLen"),a("span",{class:"token operator"},"--"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("source "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e("s"),a("span",{class:"token operator"},"->"),e("elements "),a("span",{class:"token operator"},"+"),e(" s"),a("span",{class:"token operator"},"->"),e("logLen "),a("span",{class:"token operator"},"*"),e(" s"),a("span",{class:"token operator"},"->"),e("elemSize"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token function"},"memcpy"),a("span",{class:"token punctuation"},"("),e("elemAddr"),a("span",{class:"token punctuation"},","),e(" source"),a("span",{class:"token punctuation"},","),e(" s"),a("span",{class:"token operator"},"->"),e("elemSize"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br")])],-1),tn=a("h4",{id:"tools"},[a("a",{class:"header-anchor",href:"#tools","aria-hidden":"true"},"#"),e(" Tools")],-1),ln=a("p",null,[e("Valgrind - "),a("a",{href:"https://github.com/svn2github/valgrind",target:"_blank",rel:"noopener noreferrer"},"GitHub Repo")],-1),on=a("h2",{id:"useful-functions"},[a("a",{class:"header-anchor",href:"#useful-functions","aria-hidden":"true"},"#"),e(" Useful Functions")],-1),cn=a("h3",{id:"memset"},[a("a",{class:"header-anchor",href:"#memset","aria-hidden":"true"},"#"),e(" memset")],-1),rn=a("h3",{id:"free"},[a("a",{class:"header-anchor",href:"#free","aria-hidden":"true"},"#"),e(" free")],-1),pn=a("p",null,[a("strong",null,"free 函数会回退 4/8 字节,取出 heap 块的长度/信息,根据此信息进行 heap 块的释放.")],-1),un=a("h3",{id:"strings"},[a("a",{class:"header-anchor",href:"#strings","aria-hidden":"true"},"#"),e(" Strings")],-1),kn=a("h4",{id:"strdup"},[a("a",{class:"header-anchor",href:"#strdup","aria-hidden":"true"},"#"),e(" strdup")],-1),dn=a("p",null,[e("string duplicate - "),a("code",null,"char *strdup(string)"),e(" 封装 allocator 细节")],-1),mn=a("h4",{id:"strchr-and-strstr"},[a("a",{class:"header-anchor",href:"#strchr-and-strstr","aria-hidden":"true"},"#"),e(" strchr and strstr")],-1),bn=a("p",null,"返回字符/串在字符串中出现的位置(地址)",-1),hn=a("h4",{id:"strtok"},[a("a",{class:"header-anchor",href:"#strtok","aria-hidden":"true"},"#"),e(" strtok")],-1),yn=a("h4",{id:"strcasecmp"},[a("a",{class:"header-anchor",href:"#strcasecmp","aria-hidden":"true"},"#"),e(" strcasecmp")],-1),fn=a("h4",{id:"getopt"},[a("a",{class:"header-anchor",href:"#getopt","aria-hidden":"true"},"#"),e(" getopt")],-1),vn=a("p",null,"解析命令行参数, 轻松地提取以 - 或 / 开头的参数",-1),gn=a("h3",{id:"i-o"},[a("a",{class:"header-anchor",href:"#i-o","aria-hidden":"true"},"#"),e(" I/O")],-1),wn=a("h4",{id:"string-scanf"},[a("a",{class:"header-anchor",href:"#string-scanf","aria-hidden":"true"},"#"),e(" String Scanf")],-1),xn=a("p",null,"可以用作简易匹配读取函数",-1),En=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// 提取除 http:// 外的字符串"),e("\n"),a("span",{class:"token function"},"sscanf"),a("span",{class:"token punctuation"},"("),e("buf"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token string"},'"http://%s"'),a("span",{class:"token punctuation"},","),e(" url_part"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),_n=a("h3",{id:"exceptions"},[a("a",{class:"header-anchor",href:"#exceptions","aria-hidden":"true"},"#"),e(" Exceptions")],-1),Nn=a("p",null,"perror(string) - 用来将上一个函数发生错误的原因输出到标准设备(stderr)",-1),Sn=a("h3",{id:"process"},[a("a",{class:"header-anchor",href:"#process","aria-hidden":"true"},"#"),e(" Process")],-1),Tn=a("h4",{id:"fork-and-execve"},[a("a",{class:"header-anchor",href:"#fork-and-execve","aria-hidden":"true"},"#"),e(" Fork and Execve")],-1),On=a("ul",null,[a("li",null,"fork(): 创建当前进程的拷贝"),a("li",null,[e("execve(): 用另一程序的代码代替当前进程的代码 "),a("ul",null,[a("li",null,[a("code",null,"int execve(char *filename, char *argv[], char *env_p[])")])])])],-1),Ln=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"fork_exec"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),e("path"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),e("argv"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token class-name"},"pid_t"),e(" pid "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token function"},"fork"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),e(),a("span",{class:"token operator"},"!="),e(" pid"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"Parent: created a child %d\\n"'),a("span",{class:"token punctuation"},","),e(" pid"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"Child: exec-ing new program now\\n"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token function"},"execv"),a("span",{class:"token punctuation"},"("),e("path"),a("span",{class:"token punctuation"},","),e(" argv"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"This line printed by parent only!\\n"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br")])],-1),An=a("h4",{id:"other"},[a("a",{class:"header-anchor",href:"#other","aria-hidden":"true"},"#"),e(" Other")],-1),Cn=a("ul",null,[a("li",null,"getpid()"),a("li",null,"wait(int *child_status)/waitpid(pid)"),a("li",null,"exit()")],-1),Dn=a("h3",{id:"threads"},[a("a",{class:"header-anchor",href:"#threads","aria-hidden":"true"},"#"),e(" Threads")],-1),Rn=a("h4",{id:"pthread"},[a("a",{class:"header-anchor",href:"#pthread","aria-hidden":"true"},"#"),e(" PThread")],-1),In=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"typedef"),e(),a("span",{class:"token keyword"},"unsigned"),e(),a("span",{class:"token keyword"},"long"),e(),a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token class-name"},"pthread_t"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token comment"},"/**\n * create thread\n * @param {指向线程标识符的指针} pthread_t *__thread\n * @param {设置线程属性} __const pthread_attr_t *__attr\n * @param {线程运行函数的起始地址} void *(*__start_routine) (void *)\n * @param {运行函数的参数} void *__arg\n */"),e("\n"),a("span",{class:"token keyword"},"extern"),e(),a("span",{class:"token keyword"},"int"),e(" pthread_create "),a("span",{class:"token function"},"__P"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token class-name"},"pthread_t"),e(),a("span",{class:"token operator"},"*"),e("__thread"),a("span",{class:"token punctuation"},","),e("\n __const "),a("span",{class:"token class-name"},"pthread_attr_t"),e(),a("span",{class:"token operator"},"*"),e("__attr"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),e("__start_routine"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e(", "),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("__arg"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n  \n"),a("span",{class:"token comment"},"/**\n * 等待线程\n * @param {被等待的线程标识符} pthread_t __th\n * @param {一个用户定义的指针,它可以用来存储被等待线程的返回值} void **__thread_return\n */"),e("\n"),a("span",{class:"token keyword"},"extern"),e(),a("span",{class:"token keyword"},"int"),e(" pthread_join "),a("span",{class:"token function"},"__P"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"pthread_t"),e(" __th"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token operator"},"*"),e("__thread_return"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token comment"},"/**\n * 退出线程\n * @param {函数的返回代码} (void *__retval)) __attribute__ ((__noreturn__)\n */"),e("\n"),a("span",{class:"token keyword"},"extern"),e(),a("span",{class:"token keyword"},"void"),e(" pthread_exit "),a("span",{class:"token function"},"__P"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("__retval"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"__attribute__"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),e("__noreturn__"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token comment"},"// 一个线程不能被多个线程等待,否则第一个接收到信号的线程成功返回,其余调用pthread_join的线程则返回错误代码 ESRCH"),e("\n\n"),a("span",{class:"token comment"},"// 以下为互斥锁相关函数"),e("\n\npthread_mutex_init\npthread_mutexattr_init\n\n"),a("span",{class:"token comment"},"/**\n * 设置属性 pshared\n * PTHREAD_PROCESS_PRIVATE\n * PTHREAD_PROCESS_SHARED\n */"),e("\npthread_mutexattr_setpshared\n\n"),a("span",{class:"token comment"},"/**\n * 设置互斥锁类型\n * PTHREAD_MUTEX_NORMAL\n * PTHREAD_MUTEX_ERRORCHECK\n * PTHREAD_MUTEX_RECURSIVE\n * PTHREAD_MUTEX_DEFAULT\n */"),e("\npthread_mutexattr_settype\n\npthread_mutex_lock\npthread_mutex_unlock\npthread_delay_np\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br")])],-1),Pn=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[e("InitThreadPackage"),a("span",{class:"token punctuation"},";"),e("\nThreadNew"),a("span",{class:"token punctuation"},";"),e("\nThreadSleep"),a("span",{class:"token punctuation"},";"),e("\nRunAllThreads"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token function"},"SemaphoreNew"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token operator"},">"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token function"},"SemaphoreWait"),a("span",{class:"token punctuation"},"("),e("lock"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token function"},"SemaphoreSignal"),a("span",{class:"token punctuation"},"("),e("lock"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),Mn=a("h4",{id:"semaphore"},[a("a",{class:"header-anchor",href:"#semaphore","aria-hidden":"true"},"#"),e(" Semaphore")],-1),Bn=a("ul",null,[a("li",null,"哲学家就餐问题"),a("li",null,"将 Semaphore 变量的值在允许范围内(不至于使得线程锁失效)使得其取最大值,减少线程阻塞"),a("li",null,"EmptyBuf 8, FullBuf 0"),a("li",null,[e("双向通信,互相唤醒 - "),a("code",null,"Writer:sw(empty),ss(full);"),e(),a("code",null,"Reader:sw(full),ss(empty);")])],-1),Un=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"SellTickets"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),e(" agent"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token operator"},"*"),e("ticketsNum"),a("span",{class:"token punctuation"},","),e(" Semaphore lock"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"while"),e(),a("span",{class:"token punctuation"},"("),e("true"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"// 当 lock == 0 时,当前进程阻塞, 等待 lock > 0"),e("\n "),a("span",{class:"token comment"},"// 当 lock > 0 时, 当前进程继续进行, 并且 lock--"),e("\n "),a("span",{class:"token function"},"SemaphoreWait"),a("span",{class:"token punctuation"},"("),e("lock"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),e("ticketsNum "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"break"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 票已售磬"),e("\n\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),e("ticketsNum"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"--"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 售出一张票"),e("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"Sell One Ticket.\\n"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token comment"},"// lock++ 使得 lock > 0"),e("\n "),a("span",{class:"token comment"},"// 若有其他进程调用了SemaphoreWait, 且因之前 lock == 0 而被阻塞, 则此时其他进程可继续进行"),e("\n "),a("span",{class:"token function"},"SemaphoreSignal"),a("span",{class:"token punctuation"},"("),e("lock"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n\n "),a("span",{class:"token comment"},"// break to here"),e("\n "),a("span",{class:"token comment"},"// 作用同循环内的 Signal 函数"),e("\n "),a("span",{class:"token function"},"SemaphoreSignal"),a("span",{class:"token punctuation"},"("),e("lock"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br")])],-1),Fn=a("h2",{id:"联合体"},[a("a",{class:"header-anchor",href:"#联合体","aria-hidden":"true"},"#"),e(" 联合体")],-1),Gn=a("ul",null,[a("li",null,"机器码 e.g 理解 IEEE 754 标准"),a("li",null,"区分大/小端模式")],-1),Hn=a("h2",{id:"naming-conventions"},[a("a",{class:"header-anchor",href:"#naming-conventions","aria-hidden":"true"},"#"),e(" Naming Conventions")],-1),zn=a("h3",{id:"常用缩写词"},[a("a",{class:"header-anchor",href:"#常用缩写词","aria-hidden":"true"},"#"),e(" 常用缩写词")],-1),Xn=a("table",null,[a("thead",null,[a("tr",null,[a("th",{style:{"text-align":"left"}},"原词"),a("th",{style:{"text-align":"left"}},"缩写")])]),a("tbody",null,[a("tr",null,[a("td",{style:{"text-align":"left"}},"addition"),a("td",{style:{"text-align":"left"}},"add")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"answer"),a("td",{style:{"text-align":"left"}},"ans")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"array"),a("td",{style:{"text-align":"left"}},"arr")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"average"),a("td",{style:{"text-align":"left"}},"avg")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"buffer"),a("td",{style:{"text-align":"left"}},"buf 或 buff")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"capture"),a("td",{style:{"text-align":"left"}},"cap 或 capt")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"check"),a("td",{style:{"text-align":"left"}},"chk")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"count"),a("td",{style:{"text-align":"left"}},"cnt")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"column"),a("td",{style:{"text-align":"left"}},"col")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"control"),a("td",{style:{"text-align":"left"}},"ctrl")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"decode"),a("td",{style:{"text-align":"left"}},"dec")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"define"),a("td",{style:{"text-align":"left"}},"def")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"delete"),a("td",{style:{"text-align":"left"}},"del")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"destination"),a("td",{style:{"text-align":"left"}},"dst 或 dest")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"display"),a("td",{style:{"text-align":"left"}},"disp")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"division"),a("td",{style:{"text-align":"left"}},"div")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"encode"),a("td",{style:{"text-align":"left"}},"enc")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"environment"),a("td",{style:{"text-align":"left"}},"env")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"error"),a("td",{style:{"text-align":"left"}},"err")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"float"),a("td",{style:{"text-align":"left"}},"flt")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"frequency"),a("td",{style:{"text-align":"left"}},"freq")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"header"),a("td",{style:{"text-align":"left"}},"hdr")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"index"),a("td",{style:{"text-align":"left"}},"idx")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"image"),a("td",{style:{"text-align":"left"}},"img")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"increment"),a("td",{style:{"text-align":"left"}},"inc")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"initialize"),a("td",{style:{"text-align":"left"}},"init")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"iteration"),a("td",{style:{"text-align":"left"}},"itr")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"length"),a("td",{style:{"text-align":"left"}},"len")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"memory"),a("td",{style:{"text-align":"left"}},"mem")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"middle"),a("td",{style:{"text-align":"left"}},"mid")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"make"),a("td",{style:{"text-align":"left"}},"mk")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"message"),a("td",{style:{"text-align":"left"}},"msg")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"multiplication"),a("td",{style:{"text-align":"left"}},"mul")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"number"),a("td",{style:{"text-align":"left"}},"num")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"operand"),a("td",{style:{"text-align":"left"}},"opnd")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"optimization"),a("td",{style:{"text-align":"left"}},"opt")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"operator"),a("td",{style:{"text-align":"left"}},"optr")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"packet"),a("td",{style:{"text-align":"left"}},"pkt")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"position"),a("td",{style:{"text-align":"left"}},"pos")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"previous"),a("td",{style:{"text-align":"left"}},"pre/prev")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"payload"),a("td",{style:{"text-align":"left"}},"type")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"pointer"),a("td",{style:{"text-align":"left"}},"ptr/pt")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"return"),a("td",{style:{"text-align":"left"}},"code")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"record"),a("td",{style:{"text-align":"left"}},"rcd/rc")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"receive"),a("td",{style:{"text-align":"left"}},"recv")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"result"),a("td",{style:{"text-align":"left"}},"res")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"return"),a("td",{style:{"text-align":"left"}},"ret")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"source"),a("td",{style:{"text-align":"left"}},"src")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"stack"),a("td",{style:{"text-align":"left"}},"stk")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"string"),a("td",{style:{"text-align":"left"}},"str")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"subtraction"),a("td",{style:{"text-align":"left"}},"sub")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"table"),a("td",{style:{"text-align":"left"}},"tab")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"temporary"),a("td",{style:{"text-align":"left"}},"tmp 或 temp")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"total"),a("td",{style:{"text-align":"left"}},"tot")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"time"),a("td",{style:{"text-align":"left"}},"stamp")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"value"),a("td",{style:{"text-align":"left"}},"val")])])],-1),jn=a("h3",{id:"header-file"},[a("a",{class:"header-anchor",href:"#header-file","aria-hidden":"true"},"#"),e(" Header File")],-1),qn=a("p",null,"防止其他文件重复#include 本文件",-1),Kn=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"ifndef"),e(),a("span",{class:"token expression"},"MONGOOSE_HEADER_INCLUDED")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(" "),a("span",{class:"token macro-name"},"MONGOOSE_HEADER_INCLUDED")]),e("\n\n"),a("span",{class:"token comment"},"/*.................................\n * do something here\n *.................................\n */"),e("\n\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"endif"),e(),a("span",{class:"token comment"},"/* MONGOOSE_HEADER_INCLUDED */")]),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br")])],-1),Vn=a("h2",{id:"c-standard-library"},[a("a",{class:"header-anchor",href:"#c-standard-library","aria-hidden":"true"},"#"),e(" C Standard Library")],-1),Yn=a("h3",{id:"assert"},[a("a",{class:"header-anchor",href:"#assert","aria-hidden":"true"},"#"),e(" Assert")],-1),Wn=a("ul",null,[a("li",null,"关闭断言")],-1),Qn=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"NDEBUG")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"include"),e(),a("span",{class:"token string"},"")]),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Jn=a("ul",null,[a("li",null,"开启断言")],-1),$n=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"undef"),e(),a("span",{class:"token expression"},"NDEBUG")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"include"),e(),a("span",{class:"token string"},"")]),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Zn=a("h3",{id:"types"},[a("a",{class:"header-anchor",href:"#types","aria-hidden":"true"},"#"),e(" Types")],-1),ns=a("ul",null,[a("li",null,"可检测字符")],-1),ss=a("p",null,"getc、fgetc、getchar 函数可返回值(EOF 值/unsigned char 类型)",-1),as=a("ul",null,[a("li",null,"不可检测字符")],-1),es=a("p",null,[e("非 EOF 值/非 unsigned char 类型("),a("em",null,"会引发严重错误"),e(")")],-1),ts=a("p",null,[a("img",{src:"/awesome-notes/assets/ctype.h.b7c42e1e.jpg",alt:"CType Functions"})],-1),ls=a("h3",{id:"errno"},[a("a",{class:"header-anchor",href:"#errno","aria-hidden":"true"},"#"),e(" Errno")],-1),os=a("ul",null,[a("li",null,"errno 的值在程序启动时为零,但是不会被任何库函数设为零")],-1),cs=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[e("errno "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\ny "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token function"},"sqrt"),a("span",{class:"token punctuation"},"("),e("x"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("errno "),a("span",{class:"token operator"},"!="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"invalid x : %e\\n"'),a("span",{class:"token punctuation"},","),e(" x"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),rs=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"ifndef"),e(),a("span",{class:"token expression"},"_I386_ERRNO_H")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"_I386_ERRNO_H")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EPERM"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"1"),e()]),a("span",{class:"token comment"},"/* Operation not permitted */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOENT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"2"),e()]),a("span",{class:"token comment"},"/* No such file or directory */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ESRCH"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"3"),e()]),a("span",{class:"token comment"},"/* No such process */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EINTR"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"4"),e()]),a("span",{class:"token comment"},"/* Interrupted system call */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EIO"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"5"),e()]),a("span",{class:"token comment"},"/* I/O error */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENXIO"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"6"),e()]),a("span",{class:"token comment"},"/* No such device or address */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"E2BIG"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"7"),e()]),a("span",{class:"token comment"},"/* Arg list too long */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOEXEC"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"8"),e()]),a("span",{class:"token comment"},"/* Exec format error */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EBADF"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"9"),e()]),a("span",{class:"token comment"},"/* Bad file number */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ECHILD"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"10"),e()]),a("span",{class:"token comment"},"/* No child processes */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EAGAIN"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"11"),e()]),a("span",{class:"token comment"},"/* Try again */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOMEM"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"12"),e()]),a("span",{class:"token comment"},"/* Out of memory */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EACCES"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"13"),e()]),a("span",{class:"token comment"},"/* Permission denied */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EFAULT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"14"),e()]),a("span",{class:"token comment"},"/* Bad address */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOTBLK"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"15"),e()]),a("span",{class:"token comment"},"/* Block device required */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EBUSY"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"16"),e()]),a("span",{class:"token comment"},"/* Device or resource busy */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EEXIST"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"17"),e()]),a("span",{class:"token comment"},"/* File exists */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EXDEV"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"18"),e()]),a("span",{class:"token comment"},"/* Cross-device link */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENODEV"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"19"),e()]),a("span",{class:"token comment"},"/* No such device */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOTDIR"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"20"),e()]),a("span",{class:"token comment"},"/* Not a directory */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EISDIR"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"21"),e()]),a("span",{class:"token comment"},"/* Is a directory */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EINVAL"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"22"),e()]),a("span",{class:"token comment"},"/* Invalid argument */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENFILE"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"23"),e()]),a("span",{class:"token comment"},"/* File table overflow */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EMFILE"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"24"),e()]),a("span",{class:"token comment"},"/* Too many open files */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOTTY"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"25"),e()]),a("span",{class:"token comment"},"/* Not a typewriter */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ETXTBSY"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"26"),e()]),a("span",{class:"token comment"},"/* Text file busy */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EFBIG"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"27"),e()]),a("span",{class:"token comment"},"/* File too large */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOSPC"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"28"),e()]),a("span",{class:"token comment"},"/* No space left on device */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ESPIPE"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"29"),e()]),a("span",{class:"token comment"},"/* Illegal seek */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EROFS"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"30"),e()]),a("span",{class:"token comment"},"/* Read-only file system */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EMLINK"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"31"),e()]),a("span",{class:"token comment"},"/* Too many links */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EPIPE"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"32"),e()]),a("span",{class:"token comment"},"/* Broken pipe */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EDOM"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"33"),e()]),a("span",{class:"token comment"},"/* Math argument out of domain of func */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ERANGE"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"34"),e()]),a("span",{class:"token comment"},"/* Math result not representable */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EDEADLK"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"35"),e()]),a("span",{class:"token comment"},"/* Resource deadlock would occur */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENAMETOOLONG"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"36"),e()]),a("span",{class:"token comment"},"/* File name too long */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOLCK"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"37"),e()]),a("span",{class:"token comment"},"/* No record locks available */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOSYS"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"38"),e()]),a("span",{class:"token comment"},"/* Function not implemented */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOTEMPTY"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"39"),e()]),a("span",{class:"token comment"},"/* Directory not empty */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ELOOP"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"40"),e()]),a("span",{class:"token comment"},"/* Too many symbolic links encountered */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EWOULDBLOCK"),e(),a("span",{class:"token expression"},"EAGAIN "),a("span",{class:"token comment"},"/* Operation would block */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOMSG"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"42"),e()]),a("span",{class:"token comment"},"/* No message of desired type */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EIDRM"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"43"),e()]),a("span",{class:"token comment"},"/* Identifier removed */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ECHRNG"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"44"),e()]),a("span",{class:"token comment"},"/* Channel number out of range */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EL2NSYNC"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"45"),e()]),a("span",{class:"token comment"},"/* Level 2 not synchronized */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EL3HLT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"46"),e()]),a("span",{class:"token comment"},"/* Level 3 halted */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EL3RST"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"47"),e()]),a("span",{class:"token comment"},"/* Level 3 reset */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ELNRNG"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"48"),e()]),a("span",{class:"token comment"},"/* Link number out of range */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EUNATCH"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"49"),e()]),a("span",{class:"token comment"},"/* Protocol driver not attached */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOCSI"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"50"),e()]),a("span",{class:"token comment"},"/* No CSI structure available */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EL2HLT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"51"),e()]),a("span",{class:"token comment"},"/* Level 2 halted */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EBADE"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"52"),e()]),a("span",{class:"token comment"},"/* Invalid exchange */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EBADR"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"53"),e()]),a("span",{class:"token comment"},"/* Invalid request descriptor */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EXFULL"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"54"),e()]),a("span",{class:"token comment"},"/* Exchange full */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOANO"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"55"),e()]),a("span",{class:"token comment"},"/* No anode */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EBADRQC"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"56"),e()]),a("span",{class:"token comment"},"/* Invalid request code */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EBADSLT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"57"),e()]),a("span",{class:"token comment"},"/* Invalid slot */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EDEADLOCK"),e(),a("span",{class:"token expression"},"EDEADLK")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EBFONT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"59"),e()]),a("span",{class:"token comment"},"/* Bad font file format */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOSTR"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"60"),e()]),a("span",{class:"token comment"},"/* Device not a stream */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENODATA"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"61"),e()]),a("span",{class:"token comment"},"/* No data available */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ETIME"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"62"),e()]),a("span",{class:"token comment"},"/* Timer expired */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOSR"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"63"),e()]),a("span",{class:"token comment"},"/* Out of streams resources */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENONET"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"64"),e()]),a("span",{class:"token comment"},"/* Machine is not on the network */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOPKG"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"65"),e()]),a("span",{class:"token comment"},"/* Package not installed */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EREMOTE"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"66"),e()]),a("span",{class:"token comment"},"/* Object is remote */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOLINK"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"67"),e()]),a("span",{class:"token comment"},"/* Link has been severed */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EADV"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"68"),e()]),a("span",{class:"token comment"},"/* Advertise error */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ESRMNT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"69"),e()]),a("span",{class:"token comment"},"/* Srmount error */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ECOMM"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"70"),e()]),a("span",{class:"token comment"},"/* Communication error on send */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EPROTO"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"71"),e()]),a("span",{class:"token comment"},"/* Protocol error */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EMULTIHOP"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"72"),e()]),a("span",{class:"token comment"},"/* Multi hop attempted */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EDOTDOT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"73"),e()]),a("span",{class:"token comment"},"/* RFS specific error */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EBADMSG"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"74"),e()]),a("span",{class:"token comment"},"/* Not a data message */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EOVERFLOW"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"75"),e()]),a("span",{class:"token comment"},"/* Value too large for defined data type */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOTUNIQ"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"76"),e()]),a("span",{class:"token comment"},"/* Name not unique on network */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EBADFD"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"77"),e()]),a("span",{class:"token comment"},"/* File descriptor in bad state */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EREMCHG"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"78"),e()]),a("span",{class:"token comment"},"/* Remote address changed */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ELIBACC"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"79"),e()]),a("span",{class:"token comment"},"/* Can not access a needed shared library */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ELIBBAD"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"80"),e()]),a("span",{class:"token comment"},"/* Accessing a corrupted shared library */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ELIBSCN"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"81"),e()]),a("span",{class:"token comment"},"/* .lib section in a.out corrupted */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ELIBMAX"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"82"),e()]),a("span",{class:"token comment"},"/* Attempting to link in too many shared libraries */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ELIBEXEC"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"83"),e()]),a("span",{class:"token comment"},"/* Cannot exec a shared library directly */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EILSEQ"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"84"),e()]),a("span",{class:"token comment"},"/* Illegal byte sequence */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ERESTART"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"85"),e()]),a("span",{class:"token comment"},"/* Interrupted system call should be restarted */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ESTRPIPE"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"86"),e()]),a("span",{class:"token comment"},"/* Streams pipe error */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EUSERS"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"87"),e()]),a("span",{class:"token comment"},"/* Too many users */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOTSOCK"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"88"),e()]),a("span",{class:"token comment"},"/* Socket operation on non-socket */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EDESTADDRREQ"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"89"),e()]),a("span",{class:"token comment"},"/* Destination address required */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EMSGSIZE"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"90"),e()]),a("span",{class:"token comment"},"/* Message too long */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EPROTOTYPE"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"91"),e()]),a("span",{class:"token comment"},"/* Protocol wrong type for socket */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOPROTOOPT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"92"),e()]),a("span",{class:"token comment"},"/* Protocol not available */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EPROTONOSUPPORT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"93"),e()]),a("span",{class:"token comment"},"/* Protocol not supported */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ESOCKTNOSUPPORT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"94"),e()]),a("span",{class:"token comment"},"/* Socket type not supported */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EOPNOTSUPP"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"95"),e()]),a("span",{class:"token comment"},"/* Operation not supported on transport endpoint */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EPFNOSUPPORT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"96"),e()]),a("span",{class:"token comment"},"/* Protocol family not supported */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EAFNOSUPPORT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"97"),e()]),a("span",{class:"token comment"},"/* Address family not supported by protocol */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EADDRINUSE"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"98"),e()]),a("span",{class:"token comment"},"/* Address already in use */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EADDRNOTAVAIL"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"99"),e()]),a("span",{class:"token comment"},"/* Cannot assign requested address */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENETDOWN"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"100"),e()]),a("span",{class:"token comment"},"/* Network is down */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENETUNREACH"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"101"),e()]),a("span",{class:"token comment"},"/* Network is unreachable */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENETRESET"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"102"),e()]),a("span",{class:"token comment"},"/* Network dropped connection because of reset */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ECONNABORTED"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"103"),e()]),a("span",{class:"token comment"},"/* Software caused connection abort */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ECONNRESET"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"104"),e()]),a("span",{class:"token comment"},"/* Connection reset by peer */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOBUFS"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"105"),e()]),a("span",{class:"token comment"},"/* No buffer space available */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EISCONN"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"106"),e()]),a("span",{class:"token comment"},"/* Transport endpoint is already connected */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOTCONN"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"107"),e()]),a("span",{class:"token comment"},"/* Transport endpoint is not connected */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ESHUTDOWN"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"108"),e()]),a("span",{class:"token comment"},"/* Cannot send after transport endpoint shutdown */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ETOOMANYREFS"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"109"),e()]),a("span",{class:"token comment"},"/* Too many references: cannot splice */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ETIMEDOUT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"110"),e()]),a("span",{class:"token comment"},"/* Connection timed out */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ECONNREFUSED"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"111"),e()]),a("span",{class:"token comment"},"/* Connection refused */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EHOSTDOWN"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"112"),e()]),a("span",{class:"token comment"},"/* Host is down */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EHOSTUNREACH"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"113"),e()]),a("span",{class:"token comment"},"/* No route to host */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EALREADY"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"114"),e()]),a("span",{class:"token comment"},"/* Operation already in progress */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EINPROGRESS"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"115"),e()]),a("span",{class:"token comment"},"/* Operation now in progress */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ESTALE"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"116"),e()]),a("span",{class:"token comment"},"/* Stale NFS file handle */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EUCLEAN"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"117"),e()]),a("span",{class:"token comment"},"/* Structure needs cleaning */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOTNAM"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"118"),e()]),a("span",{class:"token comment"},"/* Not a XENIX named type file */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENAVAIL"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"119"),e()]),a("span",{class:"token comment"},"/* No XENIX semaphores available */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EISNAM"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"120"),e()]),a("span",{class:"token comment"},"/* Is a named type file */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EREMOTEIO"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"121"),e()]),a("span",{class:"token comment"},"/* Remote I/O error */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EDQUOT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"122"),e()]),a("span",{class:"token comment"},"/* Quota exceeded */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOMEDIUM"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"123"),e()]),a("span",{class:"token comment"},"/* No medium found */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EMEDIUMTYPE"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"124"),e()]),a("span",{class:"token comment"},"/* Wrong medium type */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"endif")]),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br"),a("span",{class:"line-number"},"58"),a("br"),a("span",{class:"line-number"},"59"),a("br"),a("span",{class:"line-number"},"60"),a("br"),a("span",{class:"line-number"},"61"),a("br"),a("span",{class:"line-number"},"62"),a("br"),a("span",{class:"line-number"},"63"),a("br"),a("span",{class:"line-number"},"64"),a("br"),a("span",{class:"line-number"},"65"),a("br"),a("span",{class:"line-number"},"66"),a("br"),a("span",{class:"line-number"},"67"),a("br"),a("span",{class:"line-number"},"68"),a("br"),a("span",{class:"line-number"},"69"),a("br"),a("span",{class:"line-number"},"70"),a("br"),a("span",{class:"line-number"},"71"),a("br"),a("span",{class:"line-number"},"72"),a("br"),a("span",{class:"line-number"},"73"),a("br"),a("span",{class:"line-number"},"74"),a("br"),a("span",{class:"line-number"},"75"),a("br"),a("span",{class:"line-number"},"76"),a("br"),a("span",{class:"line-number"},"77"),a("br"),a("span",{class:"line-number"},"78"),a("br"),a("span",{class:"line-number"},"79"),a("br"),a("span",{class:"line-number"},"80"),a("br"),a("span",{class:"line-number"},"81"),a("br"),a("span",{class:"line-number"},"82"),a("br"),a("span",{class:"line-number"},"83"),a("br"),a("span",{class:"line-number"},"84"),a("br"),a("span",{class:"line-number"},"85"),a("br"),a("span",{class:"line-number"},"86"),a("br"),a("span",{class:"line-number"},"87"),a("br"),a("span",{class:"line-number"},"88"),a("br"),a("span",{class:"line-number"},"89"),a("br"),a("span",{class:"line-number"},"90"),a("br"),a("span",{class:"line-number"},"91"),a("br"),a("span",{class:"line-number"},"92"),a("br"),a("span",{class:"line-number"},"93"),a("br"),a("span",{class:"line-number"},"94"),a("br"),a("span",{class:"line-number"},"95"),a("br"),a("span",{class:"line-number"},"96"),a("br"),a("span",{class:"line-number"},"97"),a("br"),a("span",{class:"line-number"},"98"),a("br"),a("span",{class:"line-number"},"99"),a("br"),a("span",{class:"line-number"},"100"),a("br"),a("span",{class:"line-number"},"101"),a("br"),a("span",{class:"line-number"},"102"),a("br"),a("span",{class:"line-number"},"103"),a("br"),a("span",{class:"line-number"},"104"),a("br"),a("span",{class:"line-number"},"105"),a("br"),a("span",{class:"line-number"},"106"),a("br"),a("span",{class:"line-number"},"107"),a("br"),a("span",{class:"line-number"},"108"),a("br"),a("span",{class:"line-number"},"109"),a("br"),a("span",{class:"line-number"},"110"),a("br"),a("span",{class:"line-number"},"111"),a("br"),a("span",{class:"line-number"},"112"),a("br"),a("span",{class:"line-number"},"113"),a("br"),a("span",{class:"line-number"},"114"),a("br"),a("span",{class:"line-number"},"115"),a("br"),a("span",{class:"line-number"},"116"),a("br"),a("span",{class:"line-number"},"117"),a("br"),a("span",{class:"line-number"},"118"),a("br"),a("span",{class:"line-number"},"119"),a("br"),a("span",{class:"line-number"},"120"),a("br"),a("span",{class:"line-number"},"121"),a("br"),a("span",{class:"line-number"},"122"),a("br"),a("span",{class:"line-number"},"123"),a("br"),a("span",{class:"line-number"},"124"),a("br"),a("span",{class:"line-number"},"125"),a("br"),a("span",{class:"line-number"},"126"),a("br"),a("span",{class:"line-number"},"127"),a("br")])],-1),ps=a("h3",{id:"float-and-limits"},[a("a",{class:"header-anchor",href:"#float-and-limits","aria-hidden":"true"},"#"),e(" Float and Limits")],-1),is=a("ul",null,[a("li",null,[e("宏定义:"),a("code",null,"CHAR/UCHAR/SCHAR/SHRT/USHRT/INT/UINT/LONG/ULONG/FLT/DBL/LDBL"),e("有关的"),a("code",null,"MIN/MAX/EPSILON")])],-1),us=a("h3",{id:"locale"},[a("a",{class:"header-anchor",href:"#locale","aria-hidden":"true"},"#"),e(" Locale")],-1),ks=a("ul",null,[a("li",null,"实现时间/单位/货币等一系列的国际化"),a("li",null,"常用函数")],-1),ds=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[e("_CRTIMP "),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),e(" __cdecl "),a("span",{class:"token function"},"setlocale"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"const"),e(),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n_CRTIMP "),a("span",{class:"token keyword"},"struct"),e(),a("span",{class:"token class-name"},"lconv"),e(),a("span",{class:"token operator"},"*"),e(" __cdecl "),a("span",{class:"token function"},"localeconv"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),ms=a("ul",null,[a("li",null,"int 值")],-1),bs=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"LC_ALL"),e(" "),a("span",{class:"token expression"},[a("span",{class:"token number"},"0")])]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"LC_COLLATE"),e(" "),a("span",{class:"token expression"},[a("span",{class:"token number"},"1")])]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"LC_CTYPE"),e(" "),a("span",{class:"token expression"},[a("span",{class:"token number"},"2")])]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"LC_MONETARY"),e(" "),a("span",{class:"token expression"},[a("span",{class:"token number"},"3")])]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"LC_NUMERIC"),e(" "),a("span",{class:"token expression"},[a("span",{class:"token number"},"4")])]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"LC_TIME"),e(" "),a("span",{class:"token expression"},[a("span",{class:"token number"},"5")])]),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),hs=a("h3",{id:"math"},[a("a",{class:"header-anchor",href:"#math","aria-hidden":"true"},"#"),e(" Math")],-1),ys=a("p",null,"数学函数库(包括后缀 f(float)/l(long double))",-1),fs=a("h3",{id:"setjmp"},[a("a",{class:"header-anchor",href:"#setjmp","aria-hidden":"true"},"#"),e(" SetJMP")],-1),vs=a("ul",null,[a("li",null,"常用函数")],-1),gs=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token function"},"setjmp"),a("span",{class:"token punctuation"},"("),e("jmp_buf env"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"longjmp"),a("span",{class:"token punctuation"},"("),e("jmp_buf env"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"int"),e(" val"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),ws=a("ul",null,[a("li",null,[e("使用:用于 if/else、loop、switch 语句 "),a("ol",null,[a("li",null,"直接调用 setjmp 函数时,返回值为 0;"),a("li",null,"调用 longjmp 函数时,若 val 值不为 0,则跳转至上次 setjmp 返回值为 0 处,继续向后执行语句")])]),a("li",null,[e("功能 "),a("ol",null,[a("li",null,"实现非本地(局部)跳转(跨越多层函数调用栈进行跳转)"),a("li",null,"实现类 Java 异常机制(异常抛出及捕获)")])])],-1),xs=a("h3",{id:"signal"},[a("a",{class:"header-anchor",href:"#signal","aria-hidden":"true"},"#"),e(" Signal")],-1),Es=a("p",null,"信号处理程序中所有数据应为 volatile 类型",-1),_s=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[e("_CRTIMP "),a("span",{class:"token keyword"},"int"),e(" __cdecl "),a("span",{class:"token function"},"raise"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n_CRTIMP "),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token punctuation"},"("),e("__cdecl "),a("span",{class:"token operator"},"*"),e(" __cdecl "),a("span",{class:"token function"},"signal"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token punctuation"},"("),e("__cdecl "),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Ns=a("h3",{id:"stdarg"},[a("a",{class:"header-anchor",href:"#stdarg","aria-hidden":"true"},"#"),e(" Stdarg")],-1),Ss=a("p",null,"用于编写可变参数函数",-1),Ts=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"printargs"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),e(" arg1"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token comment"},"/* 输出所有int类型的参数,直到-1结束 */"),e("\n"),a("span",{class:"token punctuation"},"{"),e("\n va_list ap"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"int"),e(" i"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token function"},"va_start"),a("span",{class:"token punctuation"},"("),e("ap"),a("span",{class:"token punctuation"},","),e(" arg1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"for"),e(),a("span",{class:"token punctuation"},"("),e("i "),a("span",{class:"token operator"},"="),e(" arg1"),a("span",{class:"token punctuation"},";"),e(" i "),a("span",{class:"token operator"},"!="),e(),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e(" i "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token function"},"va_arg"),a("span",{class:"token punctuation"},"("),e("ap"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"%d "'),a("span",{class:"token punctuation"},","),e(" i"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token function"},"va_end"),a("span",{class:"token punctuation"},"("),e("ap"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token function"},"putchar"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'\\n'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),Os=a("h3",{id:"stddef"},[a("a",{class:"header-anchor",href:"#stddef","aria-hidden":"true"},"#"),e(" Stddef")],-1),Ls=a("ul",null,[a("li",null,[e("宏 "),a("ul",null,[a("li",null,"NULL Null 指针常量"),a("li",null,[a("code",null,"offsetof(type, member-designator)"),e(" 获得字段在结构体中的偏移量")])])]),a("li",null,[e("类型 "),a("ul",null,[a("li",null,[a("code",null,"ptrdiff_t"),e(" 带符号的整数类型, 用来表示指针相减的结果类型")]),a("li",null,[a("code",null,"wchar_t"),e(" 宽字符类型")]),a("li",null,[a("code",null,"size_t"),e(" 无符号整数类型, 用来表示 sizeof 操作符的结果类型")])])])],-1),As=a("h3",{id:"string"},[a("a",{class:"header-anchor",href:"#string","aria-hidden":"true"},"#"),e(" String")],-1),Cs=a("ul",null,[a("li",null,"men 系函数:操作任意字符序列"),a("li",null,"strn 系函数:操作非空字符序列"),a("li",null,"str 系函数:操作字符串序列('\\0')")],-1),Ds=a("h2",{id:"gdb-tutorial"},[a("a",{class:"header-anchor",href:"#gdb-tutorial","aria-hidden":"true"},"#"),e(" GDB Tutorial")],-1),Rs=a("h3",{id:"basic-command"},[a("a",{class:"header-anchor",href:"#basic-command","aria-hidden":"true"},"#"),e(" Basic Command")],-1),Is=a("ul",null,[a("li",null,"r(run)"),a("li",null,"l(list)"),a("li",null,[e("b(break) "),a("ul",null,[a("li",null,"b line_num"),a("li",null,"b filename:line_num")])]),a("li",null,"display/format address")],-1),Ps=a("p",null,"e.g display/i $pc",-1),Ms=a("ul",null,[a("li",null,[a("p",null,"t 按二进制格式显示变量")]),a("li",null,[a("p",null,"d 按十进制格式显示变量")]),a("li",null,[a("p",null,"o 按八进制格式显示变量")]),a("li",null,[a("p",null,"u 按十六进制格式显示无符号整型")]),a("li",null,[a("p",null,"x 按十六进制格式显示变量")]),a("li",null,[a("p",null,"a 按十六进制格式显示变量")]),a("li",null,[a("p",null,"f 按浮点数格式显示变量")]),a("li",null,[a("p",null,"c 按字符格式显示变量")]),a("li",null,[a("p",null,"s 按字符串格式显示变量")]),a("li",null,[a("p",null,"disas 显示汇编代码")]),a("li",null,[a("p",null,"x /num-size-format $pc/rsp/rbp")])],-1),Bs=a("p",null,"e.g size:w(2 字节) format:x/d/s(十六进制/十进制/字符串) 2wx",-1),Us=a("ul",null,[a("li",null,[e("examine - 查看内存 n、f、u 是可选的参数 "),a("ul",null,[a("li",null,"n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。"),a("li",null,"f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是 s,如果地十是指令地址,那么格式可以是 i。"),a("li",null,"u 表示从当前地址往后请求的字节数,如果不指定的话,GDB 默认是 4 个 bytes. u 参数可以用下面的字符来代替,b 表示单字节,h 表示双字节,w 表示四字节,g 表示八字节. 当我们指定了字节长度后,GDB 会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来. 表示一个内存地址.")])])],-1),Fs=a("blockquote",null,[a("p",null,"命令:x/3uh 0x54320 表示,从内存地址 0x54320 读取内容,h 表示以双字节为一个单位,3 表示三个单位,u 表示按十六进制显示。")],-1),Gs=a("ul",null,[a("li",null,[e("s step into "),a("ul",null,[a("li",null,"step1 下一条汇编指令")])]),a("li",null,"n next line"),a("li",null,"p print"),a("li",null,"q quit"),a("li",null,"up last stack"),a("li",null,"bt(back trace) function stack 显示堆栈回溯信息"),a("li",null,"info breakpoints/register")],-1),Hs=a("h3",{id:"gdb-set-command"},[a("a",{class:"header-anchor",href:"#gdb-set-command","aria-hidden":"true"},"#"),e(" GDB Set Command")],-1),zs=a("ul",null,[a("li",null,"set disassembly"),a("li",null,"set variable")],-1),Xs=a("h3",{id:"gdb-shell"},[a("a",{class:"header-anchor",href:"#gdb-shell","aria-hidden":"true"},"#"),e(" GDB Shell")],-1),js=a("p",null,"shell command",-1),qs=a("h3",{id:"gdb-assemble"},[a("a",{class:"header-anchor",href:"#gdb-assemble","aria-hidden":"true"},"#"),e(" GDB Assemble")],-1),Ks=a("h4",{id:"gdb-core-dump"},[a("a",{class:"header-anchor",href:"#gdb-core-dump","aria-hidden":"true"},"#"),e(" GDB Core Dump")],-1),Vs=a("div",{class:"language-bash line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin class-name"},"ulimit"),e(" -c unlimited\ngdb -c core_file_path target_exe_path\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Ys=a("h4",{id:"gdb-disasm"},[a("a",{class:"header-anchor",href:"#gdb-disasm","aria-hidden":"true"},"#"),e(" GDB Disasm")],-1),Ws=a("ul",null,[a("li",null,"CS Segment")],-1),Qs=a("div",{class:"language-bash line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token punctuation"},"("),e("gdb"),a("span",{class:"token punctuation"},")"),e(" disass\n"),a("span",{class:"token punctuation"},"("),e("gdb"),a("span",{class:"token punctuation"},")"),e(" x/i\n"),a("span",{class:"token punctuation"},"("),e("gdb"),a("span",{class:"token punctuation"},")"),e(" x/5i "),a("span",{class:"token variable"},"$pc"),e("\n"),a("span",{class:"token punctuation"},"("),e("gdb"),a("span",{class:"token punctuation"},")"),e(" ni/si\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Js=a("ul",null,[a("li",null,"Registers")],-1),$s=a("div",{class:"language-bash line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token punctuation"},"("),e("gdb"),a("span",{class:"token punctuation"},")"),e(" i r\n"),a("span",{class:"token punctuation"},"("),e("gdb"),a("span",{class:"token punctuation"},")"),e(" i r a\n"),a("span",{class:"token punctuation"},"("),e("gdb"),a("span",{class:"token punctuation"},")"),e(" i r ds\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),Zs=a("ul",null,[a("li",null,"DS Segment"),a("li",null,"SS Segment")],-1),na=a("h3",{id:"gdb-stack-frame"},[a("a",{class:"header-anchor",href:"#gdb-stack-frame","aria-hidden":"true"},"#"),e(" GDB Stack Frame")],-1),sa=a("div",{class:"language-bash line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token punctuation"},"("),e("gdb"),a("span",{class:"token punctuation"},")"),e(" bt\n"),a("span",{class:"token punctuation"},"("),e("gdb"),a("span",{class:"token punctuation"},")"),e(" frame n\n"),a("span",{class:"token punctuation"},"("),e("gdb"),a("span",{class:"token punctuation"},")"),e(" info locals\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),aa=a("h2",{id:"gcc"},[a("a",{class:"header-anchor",href:"#gcc","aria-hidden":"true"},"#"),e(" GCC")],-1),ea=a("ul",null,[a("li",null,"-E: cpp(c preprocessor) 预处理 => .i"),a("li",null,"-S: cll 编译 => .s"),a("li",null,"-c: as(assemble) 汇编 => .o"),a("li",null,"-time Time the execution of each subprocess"),a("li",null,[a("code",null,"-std="),e(" Assume that the input sources are for "),a("code",null,"")]),a("li",null,[a("code",null,"-B "),e(" Add "),a("code",null,""),e(" to the compiler's search paths")]),a("li",null,"-v Display the programs invoked by the compiler"),a("li",null,[a("code",null,"-o "),e(" Place the output into "),a("code",null,"")]),a("li",null,"-shared Create a shared library"),a("li",null,[a("code",null,"-Wall")]),a("li",null,[a("code",null,"-v --help")])],-1),ta=a("h2",{id:"awesome-tools"},[a("a",{class:"header-anchor",href:"#awesome-tools","aria-hidden":"true"},"#"),e(" Awesome Tools")],-1),la=a("ul",null,[a("li",null,"用于创建代码文档资料的 NDoc"),a("li",null,"用于生成解决方案的 NAnt"),a("li",null,"用于生成代码的 CodeSmith"),a("li",null,"用于监视代码的 FxCop"),a("li",null,"用于编译少量代码的 Snippet Compiler"),a("li",null,[e("两种不同的转换器工具:"),a("a",{href:"http://ASP.NET",target:"_blank",rel:"noopener noreferrer"},"ASP.NET"),e(" 版本转换器和 Visual Studio .NET 项目转换器")]),a("li",null,"用于生成正则表达式的 Regulator"),a("li",null,"用于分析程序集的 .NET Reflector"),a("li",null,"用于单元测试的 NUnit")],-1);l.render=function(a,e,t,l,oa,ca){return n(),s("div",null,[o,c,r,p,i,u,k,d,m,b,h,y,f,v,g,w,x,E,_,N,S,T,O,L,A,C,D,R,I,P,M,B,U,F,G,H,z,X,j,q,K,V,Y,W,Q,J,$,Z,nn,sn,an,en,tn,ln,on,cn,rn,pn,un,kn,dn,mn,bn,hn,yn,fn,vn,gn,wn,xn,En,_n,Nn,Sn,Tn,On,Ln,An,Cn,Dn,Rn,In,Pn,Mn,Bn,Un,Fn,Gn,Hn,zn,Xn,jn,qn,Kn,Vn,Yn,Wn,Qn,Jn,$n,Zn,ns,ss,as,es,ts,ls,os,cs,rs,ps,is,us,ks,ds,ms,bs,hs,ys,fs,vs,gs,ws,xs,Es,_s,Ns,Ss,Ts,Os,Ls,As,Cs,Ds,Rs,Is,Ps,Ms,Bs,Us,Fs,Gs,Hs,zs,Xs,js,qs,Ks,Vs,Ys,Ws,Qs,Js,$s,Zs,na,sa,aa,ea,ta,la])};export default l;export{t as __pageData}; diff --git a/assets/language_c_cBasicNotes.md.4b46ee41.lean.js b/assets/language_c_cBasicNotes.md.4b46ee41.lean.js new file mode 100644 index 00000000000..fbfd60fbdf0 --- /dev/null +++ b/assets/language_c_cBasicNotes.md.4b46ee41.lean.js @@ -0,0 +1 @@ +import{o as n,c as s,b as a,d as e}from"./app.6dd2a1b7.js";const t='{"title":"C Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"编程习惯","slug":"编程习惯"},{"level":3,"title":"Macro(宏)","slug":"macro-宏"},{"level":3,"title":"头文件","slug":"头文件"},{"level":3,"title":"检查","slug":"检查"},{"level":2,"title":"类型转换","slug":"类型转换"},{"level":3,"title":"机器码转换","slug":"机器码转换"},{"level":2,"title":"Pointer Tips and Best Practice","slug":"pointer-tips-and-best-practice"},{"level":3,"title":"Error Prone Pointers","slug":"error-prone-pointers"},{"level":3,"title":"Debugging Malloc","slug":"debugging-malloc"},{"level":3,"title":"利用 void 指针实现 Generic","slug":"利用-void-指针实现-generic"},{"level":2,"title":"Useful Functions","slug":"useful-functions"},{"level":3,"title":"memset","slug":"memset"},{"level":3,"title":"free","slug":"free"},{"level":3,"title":"Strings","slug":"strings"},{"level":3,"title":"I/O","slug":"i-o"},{"level":3,"title":"Exceptions","slug":"exceptions"},{"level":3,"title":"Process","slug":"process"},{"level":3,"title":"Threads","slug":"threads"},{"level":2,"title":"联合体","slug":"联合体"},{"level":2,"title":"Naming Conventions","slug":"naming-conventions"},{"level":3,"title":"常用缩写词","slug":"常用缩写词"},{"level":3,"title":"Header File","slug":"header-file"},{"level":2,"title":"C Standard Library","slug":"c-standard-library"},{"level":3,"title":"Assert","slug":"assert"},{"level":3,"title":"Types","slug":"types"},{"level":3,"title":"Errno","slug":"errno"},{"level":3,"title":"Float and Limits","slug":"float-and-limits"},{"level":3,"title":"Locale","slug":"locale"},{"level":3,"title":"Math","slug":"math"},{"level":3,"title":"SetJMP","slug":"setjmp"},{"level":3,"title":"Signal","slug":"signal"},{"level":3,"title":"Stdarg","slug":"stdarg"},{"level":3,"title":"Stddef","slug":"stddef"},{"level":3,"title":"String","slug":"string"},{"level":2,"title":"GDB Tutorial","slug":"gdb-tutorial"},{"level":3,"title":"Basic Command","slug":"basic-command"},{"level":3,"title":"GDB Set Command","slug":"gdb-set-command"},{"level":3,"title":"GDB Shell","slug":"gdb-shell"},{"level":3,"title":"GDB Assemble","slug":"gdb-assemble"},{"level":3,"title":"GDB Stack Frame","slug":"gdb-stack-frame"},{"level":2,"title":"GCC","slug":"gcc"},{"level":2,"title":"Awesome Tools","slug":"awesome-tools"}],"relativePath":"language/c/cBasicNotes.md","lastUpdated":1627196319000}',l={},o=a("h1",{id:"c-basic-notes"},[a("a",{class:"header-anchor",href:"#c-basic-notes","aria-hidden":"true"},"#"),e(" C Basic Notes")],-1),c=a("p",null,[a("div",{class:"table-of-contents"},[a("ul",null,[a("li",null,[a("a",{href:"#c-basic-notes"},"C Basic Notes"),a("ul",null,[a("li",null,[a("a",{href:"#编程习惯"},"编程习惯")]),a("li",null,[a("a",{href:"#类型转换"},"类型转换")]),a("li",null,[a("a",{href:"#pointer-tips-and-best-practice"},"Pointer Tips and Best Practice")]),a("li",null,[a("a",{href:"#useful-functions"},"Useful Functions")]),a("li",null,[a("a",{href:"#联合体"},"联合体")]),a("li",null,[a("a",{href:"#naming-conventions"},"Naming Conventions")]),a("li",null,[a("a",{href:"#c-standard-library"},"C Standard Library")]),a("li",null,[a("a",{href:"#gdb-tutorial"},"GDB Tutorial")]),a("li",null,[a("a",{href:"#gcc"},"GCC")]),a("li",null,[a("a",{href:"#awesome-tools"},"Awesome Tools")])])])])])],-1),r=a("h2",{id:"编程习惯"},[a("a",{class:"header-anchor",href:"#编程习惯","aria-hidden":"true"},"#"),e(" 编程习惯")],-1),p=a("h3",{id:"macro-宏"},[a("a",{class:"header-anchor",href:"#macro-宏","aria-hidden":"true"},"#"),e(" Macro(宏)")],-1),i=a("h4",{id:"括号"},[a("a",{class:"header-anchor",href:"#括号","aria-hidden":"true"},"#"),e(" 括号")],-1),u=a("p",null,"尽量添加足够的括号,减少宏定义的二义性",-1),k=a("h4",{id:"特殊用法"},[a("a",{class:"header-anchor",href:"#特殊用法","aria-hidden":"true"},"#"),e(" 特殊用法")],-1),d=a("ul",null,[a("li",null,[a("code",null,"#"),e(": 字符串化")]),a("li",null,[a("code",null,"##"),e(": 强制连接符")]),a("li",null,"do { ... } while (0): 防止语法错误")],-1),m=a("h3",{id:"头文件"},[a("a",{class:"header-anchor",href:"#头文件","aria-hidden":"true"},"#"),e(" 头文件")],-1),b=a("h4",{id:"缺少标准库头文件"},[a("a",{class:"header-anchor",href:"#缺少标准库头文件","aria-hidden":"true"},"#"),e(" 缺少标准库头文件")],-1),h=a("h5",{id:"缺少函数原型"},[a("a",{class:"header-anchor",href:"#缺少函数原型","aria-hidden":"true"},"#"),e(" 缺少函数原型")],-1),y=a("p",null,[e("链接成功 - 链接器自动装载库函数,不影响程序执行 "),a("strong",null,"只警告,不报错")],-1),f=a("h5",{id:"覆盖标准库函数原型"},[a("a",{class:"header-anchor",href:"#覆盖标准库函数原型","aria-hidden":"true"},"#"),e(" 覆盖标准库函数原型")],-1),v=a("ul",null,[a("li",null,"定义过多参数原型,调用时传入过多参数,函数正确执行(无视多余参数)"),a("li",null,"定义缺少参数原型,调用时传入不完整参数,函数错误执行,误把 0xc(%ebp),0x10(%ebp),…等更多内存单元当作函数参数")],-1),g=a("h5",{id:"缺少宏定义"},[a("a",{class:"header-anchor",href:"#缺少宏定义","aria-hidden":"true"},"#"),e(" 缺少宏定义")],-1),w=a("p",null,"链接失败 - 宏定义会被识别为函数,但链接器查找不到相应库函数",-1),x=a("h4",{id:"防止重复包括头文件"},[a("a",{class:"header-anchor",href:"#防止重复包括头文件","aria-hidden":"true"},"#"),e(" 防止重复包括头文件")],-1),E=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"ifndef"),e(),a("span",{class:"token expression"},"_FILENAME_H_")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"_FILENAME_H_")]),e("\n\n"),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),e("\n"),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),e("\n"),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),e("\n\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"endif")]),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),_=a("h4",{id:"头文件不申请内存单元"},[a("a",{class:"header-anchor",href:"#头文件不申请内存单元","aria-hidden":"true"},"#"),e(" 头文件不申请内存单元")],-1),N=a("p",null,"除了全局共享静态变量外, 头文件中的定义不允许申请实际的内存单元",-1),S=a("h3",{id:"检查"},[a("a",{class:"header-anchor",href:"#检查","aria-hidden":"true"},"#"),e(" 检查")],-1),T=a("h4",{id:"边界检查"},[a("a",{class:"header-anchor",href:"#边界检查","aria-hidden":"true"},"#"),e(" 边界检查")],-1),O=a("ul",null,[a("li",null,"空/满栈检查"),a("li",null,"参数合法性检查 e.g elemSize > 0 检查")],-1),L=a("h4",{id:"指针检查"},[a("a",{class:"header-anchor",href:"#指针检查","aria-hidden":"true"},"#"),e(" 指针检查")],-1),A=a("ul",null,[a("li",null,[e("Alloctor 失败,需添加 NULL 检查: "),a("ul",null,[a("li",null,"assert"),a("li",null,"exit")])])],-1),C=a("h2",{id:"类型转换"},[a("a",{class:"header-anchor",href:"#类型转换","aria-hidden":"true"},"#"),e(" 类型转换")],-1),D=a("h3",{id:"机器码转换"},[a("a",{class:"header-anchor",href:"#机器码转换","aria-hidden":"true"},"#"),e(" 机器码转换")],-1),R=a("ul",null,[a("li",null,"有符号类型转换: 进行符号扩展"),a("li",null,"无符号类型转换: 进行零扩展")],-1),I=a("h2",{id:"pointer-tips-and-best-practice"},[a("a",{class:"header-anchor",href:"#pointer-tips-and-best-practice","aria-hidden":"true"},"#"),e(" Pointer Tips and Best Practice")],-1),P=a("h3",{id:"error-prone-pointers"},[a("a",{class:"header-anchor",href:"#error-prone-pointers","aria-hidden":"true"},"#"),e(" Error Prone Pointers")],-1),M=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"int"),e(" i "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"37"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"float"),e(" f "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"float"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"&"),e("i"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"float"),e(" f "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"7.0"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"short"),e(" s "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"short"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"&"),e("f"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),B=a("ul",null,[a("li",null,"悬挂指针"),a("li",null,"未初始化"),a("li",null,[e("改写未知区域 "),a("ul",null,[a("li",null,"下标越界"),a("li",null,[e("内存上溢 e.g "),a("code",null,"gets(string);")])])]),a("li",null,"指针相关运算符优先级与结合性"),a("li",null,"返回局部变量的地址"),a("li",null,"重复释放内存空间"),a("li",null,"内存泄漏 e.g 未释放空间/未释放部分深度空间(多维数组)"),a("li",null,"不能引用 void 指针指向的内存单元")],-1),U=a("h3",{id:"debugging-malloc"},[a("a",{class:"header-anchor",href:"#debugging-malloc","aria-hidden":"true"},"#"),e(" Debugging Malloc")],-1),F=a("h4",{id:"处理-void-指针"},[a("a",{class:"header-anchor",href:"#处理-void-指针","aria-hidden":"true"},"#"),e(" 处理 void 指针")],-1),G=a("p",null,"Tips: 中途运用强制类型转换,使得 void 指针可以执行指针加减运算",-1),H=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("target "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e("void_pointer "),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),z=a("h3",{id:"利用-void-指针实现-generic"},[a("a",{class:"header-anchor",href:"#利用-void-指针实现-generic","aria-hidden":"true"},"#"),e(" 利用 void 指针实现 Generic")],-1),X=a("h4",{id:"通用型-swap-函数"},[a("a",{class:"header-anchor",href:"#通用型-swap-函数","aria-hidden":"true"},"#"),e(" 通用型 Swap 函数")],-1),j=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"swap"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("vp1"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("vp2"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"int"),e(" size"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"char"),e(" buffer"),a("span",{class:"token punctuation"},"["),e("size"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token function"},"memcpy"),a("span",{class:"token punctuation"},"("),e("buffer"),a("span",{class:"token punctuation"},","),e(" vp1"),a("span",{class:"token punctuation"},","),e(" size"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token function"},"memcpy"),a("span",{class:"token punctuation"},"("),e("vp1"),a("span",{class:"token punctuation"},","),e(" vp2"),a("span",{class:"token punctuation"},","),e(" size"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token function"},"memcpy"),a("span",{class:"token punctuation"},"("),e("vp2"),a("span",{class:"token punctuation"},","),e(" buffer"),a("span",{class:"token punctuation"},","),e(" size"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),q=a("h4",{id:"通用型-search-function"},[a("a",{class:"header-anchor",href:"#通用型-search-function","aria-hidden":"true"},"#"),e(" 通用型 Search Function")],-1),K=a("h5",{id:"实现"},[a("a",{class:"header-anchor",href:"#实现","aria-hidden":"true"},"#"),e(" 实现")],-1),V=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token function"},"lsearch"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("key"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("base"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"int"),e(" n"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"int"),e(" elemSize"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),e("cmp_fn"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"for"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),e(" i "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("i "),a("span",{class:"token operator"},"<"),e(" n"),a("span",{class:"token punctuation"},";"),e("i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e(" elemAddr "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e("base "),a("span",{class:"token operator"},"+"),e(" i "),a("span",{class:"token operator"},"*"),e(" elemSize"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"cmp_fn"),a("span",{class:"token punctuation"},"("),e("key"),a("span",{class:"token punctuation"},","),e(" elemAddr"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"return"),e(" elemAddr"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n\n "),a("span",{class:"token keyword"},"return"),e(),a("span",{class:"token constant"},"NULL"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),Y=a("h5",{id:"int-实例"},[a("a",{class:"header-anchor",href:"#int-实例","aria-hidden":"true"},"#"),e(" int 实例")],-1),W=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token function"},"IntCmp"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("elem1"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("elem2"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token operator"},"*"),e("ip1 "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e("elem1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token operator"},"*"),e("ip2 "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e("elem2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"return"),e(),a("span",{class:"token operator"},"*"),e("ip1 "),a("span",{class:"token operator"},"-"),e(),a("span",{class:"token operator"},"*"),e("ip2"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),Q=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"int"),e(" array"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"11"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),e("\n size "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),e("\n target "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token comment"},"// 应进行强制类型转换"),e("\n"),a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token operator"},"*"),e(" found "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token function"},"lsearch"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"&"),e("target"),a("span",{class:"token punctuation"},","),e(" array"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"sizeof"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e(" IntCmp"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("found "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token constant"},"NULL"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"Not Found"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"Found"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br")])],-1),J=a("h5",{id:"string-实例"},[a("a",{class:"header-anchor",href:"#string-实例","aria-hidden":"true"},"#"),e(" string 实例")],-1),$=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token function"},"StrCmp"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("vp1"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("vp2"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"// 必须进行强制类型转换"),e("\n "),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),e("s1 "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e("vp1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),e("s2 "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e("vp2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"return"),e(),a("span",{class:"token function"},"strcmp"),a("span",{class:"token punctuation"},"("),e("s1"),a("span",{class:"token punctuation"},","),e(" s2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),Z=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),e("notes"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token string"},'"Ab"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token string"},'"F#"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token string"},'"B"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token string"},'"Gb"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token string"},'"D"'),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token operator"},"*"),e("target "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"Eb"'),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token operator"},"*"),e(" found "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token function"},"lsearch"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"&"),e("target"),a("span",{class:"token punctuation"},","),e(" notes"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"sizeof"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e(" StrCmp"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),nn=a("h4",{id:"泛型数据结构"},[a("a",{class:"header-anchor",href:"#泛型数据结构","aria-hidden":"true"},"#"),e(" 泛型数据结构")],-1),sn=a("h5",{id:"通用型栈"},[a("a",{class:"header-anchor",href:"#通用型栈","aria-hidden":"true"},"#"),e(" 通用型栈")],-1),an=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"typedef"),e(),a("span",{class:"token keyword"},"struct"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("elements"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"int"),e(" elemSize"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"int"),e(" logLen"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"int"),e(" allocLen"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e(" stack"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"StackNew"),a("span",{class:"token punctuation"},"("),e("stack "),a("span",{class:"token operator"},"*"),e("s"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"int"),e(" elemSize"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"StackDispose"),a("span",{class:"token punctuation"},"("),e("stack "),a("span",{class:"token operator"},"*"),e("s"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"StackPush"),a("span",{class:"token punctuation"},"("),e("stack "),a("span",{class:"token operator"},"*"),e("s"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("elemAddr"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"StackPop"),a("span",{class:"token punctuation"},"("),e("stack "),a("span",{class:"token operator"},"*"),e("s"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("elemAddr"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),en=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"StackNew"),a("span",{class:"token punctuation"},"("),e("stack "),a("span",{class:"token operator"},"*"),e("s"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"int"),e(" elemSize"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"// 参数合法性检查"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("s"),a("span",{class:"token operator"},"->"),e("elemSize "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"perror"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"ElemSize <= 0"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"return"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n\n s"),a("span",{class:"token operator"},"->"),e("elemSize "),a("span",{class:"token operator"},"="),e(" elemSize"),a("span",{class:"token punctuation"},";"),e("\n s"),a("span",{class:"token operator"},"->"),e("logLen "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n s"),a("span",{class:"token operator"},"->"),e("allocLen "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},";"),e("\n s"),a("span",{class:"token operator"},"->"),e("elements "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token function"},"malloc"),a("span",{class:"token punctuation"},"("),e("s"),a("span",{class:"token operator"},"->"),e("allocLen "),a("span",{class:"token operator"},"*"),e(" elemSize"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token comment"},"// NULL检查"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("s"),a("span",{class:"token operator"},"->"),e("elements "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token constant"},"NULL"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"perror"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"No Mem"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token function"},"exit"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n\n"),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"StackPush"),a("span",{class:"token punctuation"},"("),e("stack "),a("span",{class:"token operator"},"*"),e("s"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("elemAddr"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"// 满栈检查"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("s"),a("span",{class:"token operator"},"->"),e("logLen "),a("span",{class:"token operator"},"=="),e(" s"),a("span",{class:"token operator"},"->"),e("allocLen"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n s"),a("span",{class:"token operator"},"->"),e("allocLen "),a("span",{class:"token operator"},"*="),e(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},";"),e("\n s"),a("span",{class:"token operator"},"->"),e("elements "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token function"},"malloc"),a("span",{class:"token punctuation"},"("),e("s"),a("span",{class:"token operator"},"->"),e("elements"),a("span",{class:"token punctuation"},","),e(" s"),a("span",{class:"token operator"},"->"),e("allocLen "),a("span",{class:"token operator"},"*"),e(" s"),a("span",{class:"token operator"},"->"),e("elemSize"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n\n "),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("target "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e("s"),a("span",{class:"token operator"},"->"),e("elements "),a("span",{class:"token operator"},"+"),e(" s"),a("span",{class:"token operator"},"->"),e("logLen "),a("span",{class:"token operator"},"*"),e(" s"),a("span",{class:"token operator"},"->"),e("elemSize"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token function"},"memcpy"),a("span",{class:"token punctuation"},"("),e("target"),a("span",{class:"token punctuation"},","),e(" elemAddr"),a("span",{class:"token punctuation"},","),e(" s"),a("span",{class:"token operator"},"->"),e("elemSize"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n s"),a("span",{class:"token operator"},"->"),e("logLen"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n\n"),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"StackPop"),a("span",{class:"token punctuation"},"("),e("stack "),a("span",{class:"token operator"},"*"),e("s"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("elemAddr"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"// 空栈检查"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("s"),a("span",{class:"token operator"},"->"),e("logLen "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"perror"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"Empty Stack"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"return"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n\n s"),a("span",{class:"token operator"},"->"),e("logLen"),a("span",{class:"token operator"},"--"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("source "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e("s"),a("span",{class:"token operator"},"->"),e("elements "),a("span",{class:"token operator"},"+"),e(" s"),a("span",{class:"token operator"},"->"),e("logLen "),a("span",{class:"token operator"},"*"),e(" s"),a("span",{class:"token operator"},"->"),e("elemSize"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token function"},"memcpy"),a("span",{class:"token punctuation"},"("),e("elemAddr"),a("span",{class:"token punctuation"},","),e(" source"),a("span",{class:"token punctuation"},","),e(" s"),a("span",{class:"token operator"},"->"),e("elemSize"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br")])],-1),tn=a("h4",{id:"tools"},[a("a",{class:"header-anchor",href:"#tools","aria-hidden":"true"},"#"),e(" Tools")],-1),ln=a("p",null,[e("Valgrind - "),a("a",{href:"https://github.com/svn2github/valgrind",target:"_blank",rel:"noopener noreferrer"},"GitHub Repo")],-1),on=a("h2",{id:"useful-functions"},[a("a",{class:"header-anchor",href:"#useful-functions","aria-hidden":"true"},"#"),e(" Useful Functions")],-1),cn=a("h3",{id:"memset"},[a("a",{class:"header-anchor",href:"#memset","aria-hidden":"true"},"#"),e(" memset")],-1),rn=a("h3",{id:"free"},[a("a",{class:"header-anchor",href:"#free","aria-hidden":"true"},"#"),e(" free")],-1),pn=a("p",null,[a("strong",null,"free 函数会回退 4/8 字节,取出 heap 块的长度/信息,根据此信息进行 heap 块的释放.")],-1),un=a("h3",{id:"strings"},[a("a",{class:"header-anchor",href:"#strings","aria-hidden":"true"},"#"),e(" Strings")],-1),kn=a("h4",{id:"strdup"},[a("a",{class:"header-anchor",href:"#strdup","aria-hidden":"true"},"#"),e(" strdup")],-1),dn=a("p",null,[e("string duplicate - "),a("code",null,"char *strdup(string)"),e(" 封装 allocator 细节")],-1),mn=a("h4",{id:"strchr-and-strstr"},[a("a",{class:"header-anchor",href:"#strchr-and-strstr","aria-hidden":"true"},"#"),e(" strchr and strstr")],-1),bn=a("p",null,"返回字符/串在字符串中出现的位置(地址)",-1),hn=a("h4",{id:"strtok"},[a("a",{class:"header-anchor",href:"#strtok","aria-hidden":"true"},"#"),e(" strtok")],-1),yn=a("h4",{id:"strcasecmp"},[a("a",{class:"header-anchor",href:"#strcasecmp","aria-hidden":"true"},"#"),e(" strcasecmp")],-1),fn=a("h4",{id:"getopt"},[a("a",{class:"header-anchor",href:"#getopt","aria-hidden":"true"},"#"),e(" getopt")],-1),vn=a("p",null,"解析命令行参数, 轻松地提取以 - 或 / 开头的参数",-1),gn=a("h3",{id:"i-o"},[a("a",{class:"header-anchor",href:"#i-o","aria-hidden":"true"},"#"),e(" I/O")],-1),wn=a("h4",{id:"string-scanf"},[a("a",{class:"header-anchor",href:"#string-scanf","aria-hidden":"true"},"#"),e(" String Scanf")],-1),xn=a("p",null,"可以用作简易匹配读取函数",-1),En=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// 提取除 http:// 外的字符串"),e("\n"),a("span",{class:"token function"},"sscanf"),a("span",{class:"token punctuation"},"("),e("buf"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token string"},'"http://%s"'),a("span",{class:"token punctuation"},","),e(" url_part"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),_n=a("h3",{id:"exceptions"},[a("a",{class:"header-anchor",href:"#exceptions","aria-hidden":"true"},"#"),e(" Exceptions")],-1),Nn=a("p",null,"perror(string) - 用来将上一个函数发生错误的原因输出到标准设备(stderr)",-1),Sn=a("h3",{id:"process"},[a("a",{class:"header-anchor",href:"#process","aria-hidden":"true"},"#"),e(" Process")],-1),Tn=a("h4",{id:"fork-and-execve"},[a("a",{class:"header-anchor",href:"#fork-and-execve","aria-hidden":"true"},"#"),e(" Fork and Execve")],-1),On=a("ul",null,[a("li",null,"fork(): 创建当前进程的拷贝"),a("li",null,[e("execve(): 用另一程序的代码代替当前进程的代码 "),a("ul",null,[a("li",null,[a("code",null,"int execve(char *filename, char *argv[], char *env_p[])")])])])],-1),Ln=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"fork_exec"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),e("path"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),e("argv"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token class-name"},"pid_t"),e(" pid "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token function"},"fork"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),e(),a("span",{class:"token operator"},"!="),e(" pid"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"Parent: created a child %d\\n"'),a("span",{class:"token punctuation"},","),e(" pid"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"Child: exec-ing new program now\\n"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token function"},"execv"),a("span",{class:"token punctuation"},"("),e("path"),a("span",{class:"token punctuation"},","),e(" argv"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"This line printed by parent only!\\n"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br")])],-1),An=a("h4",{id:"other"},[a("a",{class:"header-anchor",href:"#other","aria-hidden":"true"},"#"),e(" Other")],-1),Cn=a("ul",null,[a("li",null,"getpid()"),a("li",null,"wait(int *child_status)/waitpid(pid)"),a("li",null,"exit()")],-1),Dn=a("h3",{id:"threads"},[a("a",{class:"header-anchor",href:"#threads","aria-hidden":"true"},"#"),e(" Threads")],-1),Rn=a("h4",{id:"pthread"},[a("a",{class:"header-anchor",href:"#pthread","aria-hidden":"true"},"#"),e(" PThread")],-1),In=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"typedef"),e(),a("span",{class:"token keyword"},"unsigned"),e(),a("span",{class:"token keyword"},"long"),e(),a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token class-name"},"pthread_t"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token comment"},"/**\n * create thread\n * @param {指向线程标识符的指针} pthread_t *__thread\n * @param {设置线程属性} __const pthread_attr_t *__attr\n * @param {线程运行函数的起始地址} void *(*__start_routine) (void *)\n * @param {运行函数的参数} void *__arg\n */"),e("\n"),a("span",{class:"token keyword"},"extern"),e(),a("span",{class:"token keyword"},"int"),e(" pthread_create "),a("span",{class:"token function"},"__P"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token class-name"},"pthread_t"),e(),a("span",{class:"token operator"},"*"),e("__thread"),a("span",{class:"token punctuation"},","),e("\n __const "),a("span",{class:"token class-name"},"pthread_attr_t"),e(),a("span",{class:"token operator"},"*"),e("__attr"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),e("__start_routine"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e(", "),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("__arg"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n  \n"),a("span",{class:"token comment"},"/**\n * 等待线程\n * @param {被等待的线程标识符} pthread_t __th\n * @param {一个用户定义的指针,它可以用来存储被等待线程的返回值} void **__thread_return\n */"),e("\n"),a("span",{class:"token keyword"},"extern"),e(),a("span",{class:"token keyword"},"int"),e(" pthread_join "),a("span",{class:"token function"},"__P"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"pthread_t"),e(" __th"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token operator"},"*"),e("__thread_return"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token comment"},"/**\n * 退出线程\n * @param {函数的返回代码} (void *__retval)) __attribute__ ((__noreturn__)\n */"),e("\n"),a("span",{class:"token keyword"},"extern"),e(),a("span",{class:"token keyword"},"void"),e(" pthread_exit "),a("span",{class:"token function"},"__P"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),e("__retval"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"__attribute__"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),e("__noreturn__"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token comment"},"// 一个线程不能被多个线程等待,否则第一个接收到信号的线程成功返回,其余调用pthread_join的线程则返回错误代码 ESRCH"),e("\n\n"),a("span",{class:"token comment"},"// 以下为互斥锁相关函数"),e("\n\npthread_mutex_init\npthread_mutexattr_init\n\n"),a("span",{class:"token comment"},"/**\n * 设置属性 pshared\n * PTHREAD_PROCESS_PRIVATE\n * PTHREAD_PROCESS_SHARED\n */"),e("\npthread_mutexattr_setpshared\n\n"),a("span",{class:"token comment"},"/**\n * 设置互斥锁类型\n * PTHREAD_MUTEX_NORMAL\n * PTHREAD_MUTEX_ERRORCHECK\n * PTHREAD_MUTEX_RECURSIVE\n * PTHREAD_MUTEX_DEFAULT\n */"),e("\npthread_mutexattr_settype\n\npthread_mutex_lock\npthread_mutex_unlock\npthread_delay_np\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br")])],-1),Pn=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[e("InitThreadPackage"),a("span",{class:"token punctuation"},";"),e("\nThreadNew"),a("span",{class:"token punctuation"},";"),e("\nThreadSleep"),a("span",{class:"token punctuation"},";"),e("\nRunAllThreads"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token function"},"SemaphoreNew"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token operator"},">"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token function"},"SemaphoreWait"),a("span",{class:"token punctuation"},"("),e("lock"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token function"},"SemaphoreSignal"),a("span",{class:"token punctuation"},"("),e("lock"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),Mn=a("h4",{id:"semaphore"},[a("a",{class:"header-anchor",href:"#semaphore","aria-hidden":"true"},"#"),e(" Semaphore")],-1),Bn=a("ul",null,[a("li",null,"哲学家就餐问题"),a("li",null,"将 Semaphore 变量的值在允许范围内(不至于使得线程锁失效)使得其取最大值,减少线程阻塞"),a("li",null,"EmptyBuf 8, FullBuf 0"),a("li",null,[e("双向通信,互相唤醒 - "),a("code",null,"Writer:sw(empty),ss(full);"),e(),a("code",null,"Reader:sw(full),ss(empty);")])],-1),Un=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"SellTickets"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),e(" agent"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token operator"},"*"),e("ticketsNum"),a("span",{class:"token punctuation"},","),e(" Semaphore lock"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"while"),e(),a("span",{class:"token punctuation"},"("),e("true"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"// 当 lock == 0 时,当前进程阻塞, 等待 lock > 0"),e("\n "),a("span",{class:"token comment"},"// 当 lock > 0 时, 当前进程继续进行, 并且 lock--"),e("\n "),a("span",{class:"token function"},"SemaphoreWait"),a("span",{class:"token punctuation"},"("),e("lock"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),e("ticketsNum "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"break"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 票已售磬"),e("\n\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),e("ticketsNum"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"--"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 售出一张票"),e("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"Sell One Ticket.\\n"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token comment"},"// lock++ 使得 lock > 0"),e("\n "),a("span",{class:"token comment"},"// 若有其他进程调用了SemaphoreWait, 且因之前 lock == 0 而被阻塞, 则此时其他进程可继续进行"),e("\n "),a("span",{class:"token function"},"SemaphoreSignal"),a("span",{class:"token punctuation"},"("),e("lock"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n\n "),a("span",{class:"token comment"},"// break to here"),e("\n "),a("span",{class:"token comment"},"// 作用同循环内的 Signal 函数"),e("\n "),a("span",{class:"token function"},"SemaphoreSignal"),a("span",{class:"token punctuation"},"("),e("lock"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br")])],-1),Fn=a("h2",{id:"联合体"},[a("a",{class:"header-anchor",href:"#联合体","aria-hidden":"true"},"#"),e(" 联合体")],-1),Gn=a("ul",null,[a("li",null,"机器码 e.g 理解 IEEE 754 标准"),a("li",null,"区分大/小端模式")],-1),Hn=a("h2",{id:"naming-conventions"},[a("a",{class:"header-anchor",href:"#naming-conventions","aria-hidden":"true"},"#"),e(" Naming Conventions")],-1),zn=a("h3",{id:"常用缩写词"},[a("a",{class:"header-anchor",href:"#常用缩写词","aria-hidden":"true"},"#"),e(" 常用缩写词")],-1),Xn=a("table",null,[a("thead",null,[a("tr",null,[a("th",{style:{"text-align":"left"}},"原词"),a("th",{style:{"text-align":"left"}},"缩写")])]),a("tbody",null,[a("tr",null,[a("td",{style:{"text-align":"left"}},"addition"),a("td",{style:{"text-align":"left"}},"add")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"answer"),a("td",{style:{"text-align":"left"}},"ans")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"array"),a("td",{style:{"text-align":"left"}},"arr")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"average"),a("td",{style:{"text-align":"left"}},"avg")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"buffer"),a("td",{style:{"text-align":"left"}},"buf 或 buff")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"capture"),a("td",{style:{"text-align":"left"}},"cap 或 capt")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"check"),a("td",{style:{"text-align":"left"}},"chk")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"count"),a("td",{style:{"text-align":"left"}},"cnt")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"column"),a("td",{style:{"text-align":"left"}},"col")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"control"),a("td",{style:{"text-align":"left"}},"ctrl")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"decode"),a("td",{style:{"text-align":"left"}},"dec")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"define"),a("td",{style:{"text-align":"left"}},"def")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"delete"),a("td",{style:{"text-align":"left"}},"del")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"destination"),a("td",{style:{"text-align":"left"}},"dst 或 dest")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"display"),a("td",{style:{"text-align":"left"}},"disp")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"division"),a("td",{style:{"text-align":"left"}},"div")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"encode"),a("td",{style:{"text-align":"left"}},"enc")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"environment"),a("td",{style:{"text-align":"left"}},"env")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"error"),a("td",{style:{"text-align":"left"}},"err")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"float"),a("td",{style:{"text-align":"left"}},"flt")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"frequency"),a("td",{style:{"text-align":"left"}},"freq")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"header"),a("td",{style:{"text-align":"left"}},"hdr")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"index"),a("td",{style:{"text-align":"left"}},"idx")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"image"),a("td",{style:{"text-align":"left"}},"img")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"increment"),a("td",{style:{"text-align":"left"}},"inc")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"initialize"),a("td",{style:{"text-align":"left"}},"init")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"iteration"),a("td",{style:{"text-align":"left"}},"itr")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"length"),a("td",{style:{"text-align":"left"}},"len")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"memory"),a("td",{style:{"text-align":"left"}},"mem")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"middle"),a("td",{style:{"text-align":"left"}},"mid")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"make"),a("td",{style:{"text-align":"left"}},"mk")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"message"),a("td",{style:{"text-align":"left"}},"msg")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"multiplication"),a("td",{style:{"text-align":"left"}},"mul")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"number"),a("td",{style:{"text-align":"left"}},"num")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"operand"),a("td",{style:{"text-align":"left"}},"opnd")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"optimization"),a("td",{style:{"text-align":"left"}},"opt")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"operator"),a("td",{style:{"text-align":"left"}},"optr")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"packet"),a("td",{style:{"text-align":"left"}},"pkt")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"position"),a("td",{style:{"text-align":"left"}},"pos")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"previous"),a("td",{style:{"text-align":"left"}},"pre/prev")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"payload"),a("td",{style:{"text-align":"left"}},"type")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"pointer"),a("td",{style:{"text-align":"left"}},"ptr/pt")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"return"),a("td",{style:{"text-align":"left"}},"code")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"record"),a("td",{style:{"text-align":"left"}},"rcd/rc")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"receive"),a("td",{style:{"text-align":"left"}},"recv")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"result"),a("td",{style:{"text-align":"left"}},"res")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"return"),a("td",{style:{"text-align":"left"}},"ret")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"source"),a("td",{style:{"text-align":"left"}},"src")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"stack"),a("td",{style:{"text-align":"left"}},"stk")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"string"),a("td",{style:{"text-align":"left"}},"str")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"subtraction"),a("td",{style:{"text-align":"left"}},"sub")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"table"),a("td",{style:{"text-align":"left"}},"tab")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"temporary"),a("td",{style:{"text-align":"left"}},"tmp 或 temp")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"total"),a("td",{style:{"text-align":"left"}},"tot")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"time"),a("td",{style:{"text-align":"left"}},"stamp")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"value"),a("td",{style:{"text-align":"left"}},"val")])])],-1),jn=a("h3",{id:"header-file"},[a("a",{class:"header-anchor",href:"#header-file","aria-hidden":"true"},"#"),e(" Header File")],-1),qn=a("p",null,"防止其他文件重复#include 本文件",-1),Kn=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"ifndef"),e(),a("span",{class:"token expression"},"MONGOOSE_HEADER_INCLUDED")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(" "),a("span",{class:"token macro-name"},"MONGOOSE_HEADER_INCLUDED")]),e("\n\n"),a("span",{class:"token comment"},"/*.................................\n * do something here\n *.................................\n */"),e("\n\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"endif"),e(),a("span",{class:"token comment"},"/* MONGOOSE_HEADER_INCLUDED */")]),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br")])],-1),Vn=a("h2",{id:"c-standard-library"},[a("a",{class:"header-anchor",href:"#c-standard-library","aria-hidden":"true"},"#"),e(" C Standard Library")],-1),Yn=a("h3",{id:"assert"},[a("a",{class:"header-anchor",href:"#assert","aria-hidden":"true"},"#"),e(" Assert")],-1),Wn=a("ul",null,[a("li",null,"关闭断言")],-1),Qn=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"NDEBUG")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"include"),e(),a("span",{class:"token string"},"")]),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Jn=a("ul",null,[a("li",null,"开启断言")],-1),$n=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"undef"),e(),a("span",{class:"token expression"},"NDEBUG")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"include"),e(),a("span",{class:"token string"},"")]),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Zn=a("h3",{id:"types"},[a("a",{class:"header-anchor",href:"#types","aria-hidden":"true"},"#"),e(" Types")],-1),ns=a("ul",null,[a("li",null,"可检测字符")],-1),ss=a("p",null,"getc、fgetc、getchar 函数可返回值(EOF 值/unsigned char 类型)",-1),as=a("ul",null,[a("li",null,"不可检测字符")],-1),es=a("p",null,[e("非 EOF 值/非 unsigned char 类型("),a("em",null,"会引发严重错误"),e(")")],-1),ts=a("p",null,[a("img",{src:"/awesome-notes/assets/ctype.h.b7c42e1e.jpg",alt:"CType Functions"})],-1),ls=a("h3",{id:"errno"},[a("a",{class:"header-anchor",href:"#errno","aria-hidden":"true"},"#"),e(" Errno")],-1),os=a("ul",null,[a("li",null,"errno 的值在程序启动时为零,但是不会被任何库函数设为零")],-1),cs=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[e("errno "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\ny "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token function"},"sqrt"),a("span",{class:"token punctuation"},"("),e("x"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("errno "),a("span",{class:"token operator"},"!="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"invalid x : %e\\n"'),a("span",{class:"token punctuation"},","),e(" x"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),rs=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"ifndef"),e(),a("span",{class:"token expression"},"_I386_ERRNO_H")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"_I386_ERRNO_H")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EPERM"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"1"),e()]),a("span",{class:"token comment"},"/* Operation not permitted */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOENT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"2"),e()]),a("span",{class:"token comment"},"/* No such file or directory */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ESRCH"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"3"),e()]),a("span",{class:"token comment"},"/* No such process */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EINTR"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"4"),e()]),a("span",{class:"token comment"},"/* Interrupted system call */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EIO"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"5"),e()]),a("span",{class:"token comment"},"/* I/O error */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENXIO"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"6"),e()]),a("span",{class:"token comment"},"/* No such device or address */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"E2BIG"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"7"),e()]),a("span",{class:"token comment"},"/* Arg list too long */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOEXEC"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"8"),e()]),a("span",{class:"token comment"},"/* Exec format error */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EBADF"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"9"),e()]),a("span",{class:"token comment"},"/* Bad file number */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ECHILD"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"10"),e()]),a("span",{class:"token comment"},"/* No child processes */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EAGAIN"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"11"),e()]),a("span",{class:"token comment"},"/* Try again */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOMEM"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"12"),e()]),a("span",{class:"token comment"},"/* Out of memory */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EACCES"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"13"),e()]),a("span",{class:"token comment"},"/* Permission denied */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EFAULT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"14"),e()]),a("span",{class:"token comment"},"/* Bad address */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOTBLK"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"15"),e()]),a("span",{class:"token comment"},"/* Block device required */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EBUSY"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"16"),e()]),a("span",{class:"token comment"},"/* Device or resource busy */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EEXIST"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"17"),e()]),a("span",{class:"token comment"},"/* File exists */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EXDEV"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"18"),e()]),a("span",{class:"token comment"},"/* Cross-device link */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENODEV"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"19"),e()]),a("span",{class:"token comment"},"/* No such device */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOTDIR"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"20"),e()]),a("span",{class:"token comment"},"/* Not a directory */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EISDIR"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"21"),e()]),a("span",{class:"token comment"},"/* Is a directory */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EINVAL"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"22"),e()]),a("span",{class:"token comment"},"/* Invalid argument */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENFILE"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"23"),e()]),a("span",{class:"token comment"},"/* File table overflow */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EMFILE"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"24"),e()]),a("span",{class:"token comment"},"/* Too many open files */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOTTY"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"25"),e()]),a("span",{class:"token comment"},"/* Not a typewriter */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ETXTBSY"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"26"),e()]),a("span",{class:"token comment"},"/* Text file busy */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EFBIG"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"27"),e()]),a("span",{class:"token comment"},"/* File too large */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOSPC"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"28"),e()]),a("span",{class:"token comment"},"/* No space left on device */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ESPIPE"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"29"),e()]),a("span",{class:"token comment"},"/* Illegal seek */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EROFS"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"30"),e()]),a("span",{class:"token comment"},"/* Read-only file system */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EMLINK"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"31"),e()]),a("span",{class:"token comment"},"/* Too many links */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EPIPE"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"32"),e()]),a("span",{class:"token comment"},"/* Broken pipe */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EDOM"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"33"),e()]),a("span",{class:"token comment"},"/* Math argument out of domain of func */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ERANGE"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"34"),e()]),a("span",{class:"token comment"},"/* Math result not representable */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EDEADLK"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"35"),e()]),a("span",{class:"token comment"},"/* Resource deadlock would occur */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENAMETOOLONG"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"36"),e()]),a("span",{class:"token comment"},"/* File name too long */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOLCK"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"37"),e()]),a("span",{class:"token comment"},"/* No record locks available */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOSYS"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"38"),e()]),a("span",{class:"token comment"},"/* Function not implemented */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOTEMPTY"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"39"),e()]),a("span",{class:"token comment"},"/* Directory not empty */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ELOOP"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"40"),e()]),a("span",{class:"token comment"},"/* Too many symbolic links encountered */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EWOULDBLOCK"),e(),a("span",{class:"token expression"},"EAGAIN "),a("span",{class:"token comment"},"/* Operation would block */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOMSG"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"42"),e()]),a("span",{class:"token comment"},"/* No message of desired type */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EIDRM"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"43"),e()]),a("span",{class:"token comment"},"/* Identifier removed */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ECHRNG"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"44"),e()]),a("span",{class:"token comment"},"/* Channel number out of range */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EL2NSYNC"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"45"),e()]),a("span",{class:"token comment"},"/* Level 2 not synchronized */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EL3HLT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"46"),e()]),a("span",{class:"token comment"},"/* Level 3 halted */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EL3RST"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"47"),e()]),a("span",{class:"token comment"},"/* Level 3 reset */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ELNRNG"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"48"),e()]),a("span",{class:"token comment"},"/* Link number out of range */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EUNATCH"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"49"),e()]),a("span",{class:"token comment"},"/* Protocol driver not attached */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOCSI"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"50"),e()]),a("span",{class:"token comment"},"/* No CSI structure available */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EL2HLT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"51"),e()]),a("span",{class:"token comment"},"/* Level 2 halted */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EBADE"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"52"),e()]),a("span",{class:"token comment"},"/* Invalid exchange */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EBADR"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"53"),e()]),a("span",{class:"token comment"},"/* Invalid request descriptor */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EXFULL"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"54"),e()]),a("span",{class:"token comment"},"/* Exchange full */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOANO"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"55"),e()]),a("span",{class:"token comment"},"/* No anode */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EBADRQC"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"56"),e()]),a("span",{class:"token comment"},"/* Invalid request code */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EBADSLT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"57"),e()]),a("span",{class:"token comment"},"/* Invalid slot */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EDEADLOCK"),e(),a("span",{class:"token expression"},"EDEADLK")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EBFONT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"59"),e()]),a("span",{class:"token comment"},"/* Bad font file format */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOSTR"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"60"),e()]),a("span",{class:"token comment"},"/* Device not a stream */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENODATA"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"61"),e()]),a("span",{class:"token comment"},"/* No data available */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ETIME"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"62"),e()]),a("span",{class:"token comment"},"/* Timer expired */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOSR"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"63"),e()]),a("span",{class:"token comment"},"/* Out of streams resources */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENONET"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"64"),e()]),a("span",{class:"token comment"},"/* Machine is not on the network */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOPKG"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"65"),e()]),a("span",{class:"token comment"},"/* Package not installed */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EREMOTE"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"66"),e()]),a("span",{class:"token comment"},"/* Object is remote */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOLINK"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"67"),e()]),a("span",{class:"token comment"},"/* Link has been severed */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EADV"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"68"),e()]),a("span",{class:"token comment"},"/* Advertise error */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ESRMNT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"69"),e()]),a("span",{class:"token comment"},"/* Srmount error */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ECOMM"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"70"),e()]),a("span",{class:"token comment"},"/* Communication error on send */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EPROTO"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"71"),e()]),a("span",{class:"token comment"},"/* Protocol error */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EMULTIHOP"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"72"),e()]),a("span",{class:"token comment"},"/* Multi hop attempted */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EDOTDOT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"73"),e()]),a("span",{class:"token comment"},"/* RFS specific error */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EBADMSG"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"74"),e()]),a("span",{class:"token comment"},"/* Not a data message */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EOVERFLOW"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"75"),e()]),a("span",{class:"token comment"},"/* Value too large for defined data type */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOTUNIQ"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"76"),e()]),a("span",{class:"token comment"},"/* Name not unique on network */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EBADFD"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"77"),e()]),a("span",{class:"token comment"},"/* File descriptor in bad state */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EREMCHG"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"78"),e()]),a("span",{class:"token comment"},"/* Remote address changed */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ELIBACC"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"79"),e()]),a("span",{class:"token comment"},"/* Can not access a needed shared library */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ELIBBAD"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"80"),e()]),a("span",{class:"token comment"},"/* Accessing a corrupted shared library */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ELIBSCN"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"81"),e()]),a("span",{class:"token comment"},"/* .lib section in a.out corrupted */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ELIBMAX"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"82"),e()]),a("span",{class:"token comment"},"/* Attempting to link in too many shared libraries */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ELIBEXEC"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"83"),e()]),a("span",{class:"token comment"},"/* Cannot exec a shared library directly */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EILSEQ"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"84"),e()]),a("span",{class:"token comment"},"/* Illegal byte sequence */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ERESTART"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"85"),e()]),a("span",{class:"token comment"},"/* Interrupted system call should be restarted */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ESTRPIPE"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"86"),e()]),a("span",{class:"token comment"},"/* Streams pipe error */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EUSERS"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"87"),e()]),a("span",{class:"token comment"},"/* Too many users */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOTSOCK"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"88"),e()]),a("span",{class:"token comment"},"/* Socket operation on non-socket */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EDESTADDRREQ"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"89"),e()]),a("span",{class:"token comment"},"/* Destination address required */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EMSGSIZE"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"90"),e()]),a("span",{class:"token comment"},"/* Message too long */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EPROTOTYPE"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"91"),e()]),a("span",{class:"token comment"},"/* Protocol wrong type for socket */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOPROTOOPT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"92"),e()]),a("span",{class:"token comment"},"/* Protocol not available */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EPROTONOSUPPORT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"93"),e()]),a("span",{class:"token comment"},"/* Protocol not supported */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ESOCKTNOSUPPORT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"94"),e()]),a("span",{class:"token comment"},"/* Socket type not supported */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EOPNOTSUPP"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"95"),e()]),a("span",{class:"token comment"},"/* Operation not supported on transport endpoint */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EPFNOSUPPORT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"96"),e()]),a("span",{class:"token comment"},"/* Protocol family not supported */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EAFNOSUPPORT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"97"),e()]),a("span",{class:"token comment"},"/* Address family not supported by protocol */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EADDRINUSE"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"98"),e()]),a("span",{class:"token comment"},"/* Address already in use */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EADDRNOTAVAIL"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"99"),e()]),a("span",{class:"token comment"},"/* Cannot assign requested address */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENETDOWN"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"100"),e()]),a("span",{class:"token comment"},"/* Network is down */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENETUNREACH"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"101"),e()]),a("span",{class:"token comment"},"/* Network is unreachable */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENETRESET"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"102"),e()]),a("span",{class:"token comment"},"/* Network dropped connection because of reset */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ECONNABORTED"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"103"),e()]),a("span",{class:"token comment"},"/* Software caused connection abort */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ECONNRESET"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"104"),e()]),a("span",{class:"token comment"},"/* Connection reset by peer */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOBUFS"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"105"),e()]),a("span",{class:"token comment"},"/* No buffer space available */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EISCONN"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"106"),e()]),a("span",{class:"token comment"},"/* Transport endpoint is already connected */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOTCONN"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"107"),e()]),a("span",{class:"token comment"},"/* Transport endpoint is not connected */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ESHUTDOWN"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"108"),e()]),a("span",{class:"token comment"},"/* Cannot send after transport endpoint shutdown */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ETOOMANYREFS"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"109"),e()]),a("span",{class:"token comment"},"/* Too many references: cannot splice */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ETIMEDOUT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"110"),e()]),a("span",{class:"token comment"},"/* Connection timed out */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ECONNREFUSED"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"111"),e()]),a("span",{class:"token comment"},"/* Connection refused */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EHOSTDOWN"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"112"),e()]),a("span",{class:"token comment"},"/* Host is down */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EHOSTUNREACH"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"113"),e()]),a("span",{class:"token comment"},"/* No route to host */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EALREADY"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"114"),e()]),a("span",{class:"token comment"},"/* Operation already in progress */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EINPROGRESS"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"115"),e()]),a("span",{class:"token comment"},"/* Operation now in progress */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ESTALE"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"116"),e()]),a("span",{class:"token comment"},"/* Stale NFS file handle */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EUCLEAN"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"117"),e()]),a("span",{class:"token comment"},"/* Structure needs cleaning */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOTNAM"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"118"),e()]),a("span",{class:"token comment"},"/* Not a XENIX named type file */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENAVAIL"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"119"),e()]),a("span",{class:"token comment"},"/* No XENIX semaphores available */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EISNAM"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"120"),e()]),a("span",{class:"token comment"},"/* Is a named type file */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EREMOTEIO"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"121"),e()]),a("span",{class:"token comment"},"/* Remote I/O error */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EDQUOT"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"122"),e()]),a("span",{class:"token comment"},"/* Quota exceeded */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"ENOMEDIUM"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"123"),e()]),a("span",{class:"token comment"},"/* No medium found */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"EMEDIUMTYPE"),e(),a("span",{class:"token expression"},[a("span",{class:"token number"},"124"),e()]),a("span",{class:"token comment"},"/* Wrong medium type */")]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"endif")]),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br"),a("span",{class:"line-number"},"58"),a("br"),a("span",{class:"line-number"},"59"),a("br"),a("span",{class:"line-number"},"60"),a("br"),a("span",{class:"line-number"},"61"),a("br"),a("span",{class:"line-number"},"62"),a("br"),a("span",{class:"line-number"},"63"),a("br"),a("span",{class:"line-number"},"64"),a("br"),a("span",{class:"line-number"},"65"),a("br"),a("span",{class:"line-number"},"66"),a("br"),a("span",{class:"line-number"},"67"),a("br"),a("span",{class:"line-number"},"68"),a("br"),a("span",{class:"line-number"},"69"),a("br"),a("span",{class:"line-number"},"70"),a("br"),a("span",{class:"line-number"},"71"),a("br"),a("span",{class:"line-number"},"72"),a("br"),a("span",{class:"line-number"},"73"),a("br"),a("span",{class:"line-number"},"74"),a("br"),a("span",{class:"line-number"},"75"),a("br"),a("span",{class:"line-number"},"76"),a("br"),a("span",{class:"line-number"},"77"),a("br"),a("span",{class:"line-number"},"78"),a("br"),a("span",{class:"line-number"},"79"),a("br"),a("span",{class:"line-number"},"80"),a("br"),a("span",{class:"line-number"},"81"),a("br"),a("span",{class:"line-number"},"82"),a("br"),a("span",{class:"line-number"},"83"),a("br"),a("span",{class:"line-number"},"84"),a("br"),a("span",{class:"line-number"},"85"),a("br"),a("span",{class:"line-number"},"86"),a("br"),a("span",{class:"line-number"},"87"),a("br"),a("span",{class:"line-number"},"88"),a("br"),a("span",{class:"line-number"},"89"),a("br"),a("span",{class:"line-number"},"90"),a("br"),a("span",{class:"line-number"},"91"),a("br"),a("span",{class:"line-number"},"92"),a("br"),a("span",{class:"line-number"},"93"),a("br"),a("span",{class:"line-number"},"94"),a("br"),a("span",{class:"line-number"},"95"),a("br"),a("span",{class:"line-number"},"96"),a("br"),a("span",{class:"line-number"},"97"),a("br"),a("span",{class:"line-number"},"98"),a("br"),a("span",{class:"line-number"},"99"),a("br"),a("span",{class:"line-number"},"100"),a("br"),a("span",{class:"line-number"},"101"),a("br"),a("span",{class:"line-number"},"102"),a("br"),a("span",{class:"line-number"},"103"),a("br"),a("span",{class:"line-number"},"104"),a("br"),a("span",{class:"line-number"},"105"),a("br"),a("span",{class:"line-number"},"106"),a("br"),a("span",{class:"line-number"},"107"),a("br"),a("span",{class:"line-number"},"108"),a("br"),a("span",{class:"line-number"},"109"),a("br"),a("span",{class:"line-number"},"110"),a("br"),a("span",{class:"line-number"},"111"),a("br"),a("span",{class:"line-number"},"112"),a("br"),a("span",{class:"line-number"},"113"),a("br"),a("span",{class:"line-number"},"114"),a("br"),a("span",{class:"line-number"},"115"),a("br"),a("span",{class:"line-number"},"116"),a("br"),a("span",{class:"line-number"},"117"),a("br"),a("span",{class:"line-number"},"118"),a("br"),a("span",{class:"line-number"},"119"),a("br"),a("span",{class:"line-number"},"120"),a("br"),a("span",{class:"line-number"},"121"),a("br"),a("span",{class:"line-number"},"122"),a("br"),a("span",{class:"line-number"},"123"),a("br"),a("span",{class:"line-number"},"124"),a("br"),a("span",{class:"line-number"},"125"),a("br"),a("span",{class:"line-number"},"126"),a("br"),a("span",{class:"line-number"},"127"),a("br")])],-1),ps=a("h3",{id:"float-and-limits"},[a("a",{class:"header-anchor",href:"#float-and-limits","aria-hidden":"true"},"#"),e(" Float and Limits")],-1),is=a("ul",null,[a("li",null,[e("宏定义:"),a("code",null,"CHAR/UCHAR/SCHAR/SHRT/USHRT/INT/UINT/LONG/ULONG/FLT/DBL/LDBL"),e("有关的"),a("code",null,"MIN/MAX/EPSILON")])],-1),us=a("h3",{id:"locale"},[a("a",{class:"header-anchor",href:"#locale","aria-hidden":"true"},"#"),e(" Locale")],-1),ks=a("ul",null,[a("li",null,"实现时间/单位/货币等一系列的国际化"),a("li",null,"常用函数")],-1),ds=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[e("_CRTIMP "),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),e(" __cdecl "),a("span",{class:"token function"},"setlocale"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"const"),e(),a("span",{class:"token keyword"},"char"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n_CRTIMP "),a("span",{class:"token keyword"},"struct"),e(),a("span",{class:"token class-name"},"lconv"),e(),a("span",{class:"token operator"},"*"),e(" __cdecl "),a("span",{class:"token function"},"localeconv"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),ms=a("ul",null,[a("li",null,"int 值")],-1),bs=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"LC_ALL"),e(" "),a("span",{class:"token expression"},[a("span",{class:"token number"},"0")])]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"LC_COLLATE"),e(" "),a("span",{class:"token expression"},[a("span",{class:"token number"},"1")])]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"LC_CTYPE"),e(" "),a("span",{class:"token expression"},[a("span",{class:"token number"},"2")])]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"LC_MONETARY"),e(" "),a("span",{class:"token expression"},[a("span",{class:"token number"},"3")])]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"LC_NUMERIC"),e(" "),a("span",{class:"token expression"},[a("span",{class:"token number"},"4")])]),e("\n"),a("span",{class:"token macro property"},[a("span",{class:"token directive-hash"},"#"),a("span",{class:"token directive keyword"},"define"),e(),a("span",{class:"token macro-name"},"LC_TIME"),e(" "),a("span",{class:"token expression"},[a("span",{class:"token number"},"5")])]),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),hs=a("h3",{id:"math"},[a("a",{class:"header-anchor",href:"#math","aria-hidden":"true"},"#"),e(" Math")],-1),ys=a("p",null,"数学函数库(包括后缀 f(float)/l(long double))",-1),fs=a("h3",{id:"setjmp"},[a("a",{class:"header-anchor",href:"#setjmp","aria-hidden":"true"},"#"),e(" SetJMP")],-1),vs=a("ul",null,[a("li",null,"常用函数")],-1),gs=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"int"),e(),a("span",{class:"token function"},"setjmp"),a("span",{class:"token punctuation"},"("),e("jmp_buf env"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"longjmp"),a("span",{class:"token punctuation"},"("),e("jmp_buf env"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"int"),e(" val"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),ws=a("ul",null,[a("li",null,[e("使用:用于 if/else、loop、switch 语句 "),a("ol",null,[a("li",null,"直接调用 setjmp 函数时,返回值为 0;"),a("li",null,"调用 longjmp 函数时,若 val 值不为 0,则跳转至上次 setjmp 返回值为 0 处,继续向后执行语句")])]),a("li",null,[e("功能 "),a("ol",null,[a("li",null,"实现非本地(局部)跳转(跨越多层函数调用栈进行跳转)"),a("li",null,"实现类 Java 异常机制(异常抛出及捕获)")])])],-1),xs=a("h3",{id:"signal"},[a("a",{class:"header-anchor",href:"#signal","aria-hidden":"true"},"#"),e(" Signal")],-1),Es=a("p",null,"信号处理程序中所有数据应为 volatile 类型",-1),_s=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[e("_CRTIMP "),a("span",{class:"token keyword"},"int"),e(" __cdecl "),a("span",{class:"token function"},"raise"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n_CRTIMP "),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token punctuation"},"("),e("__cdecl "),a("span",{class:"token operator"},"*"),e(" __cdecl "),a("span",{class:"token function"},"signal"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token punctuation"},"("),e("__cdecl "),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Ns=a("h3",{id:"stdarg"},[a("a",{class:"header-anchor",href:"#stdarg","aria-hidden":"true"},"#"),e(" Stdarg")],-1),Ss=a("p",null,"用于编写可变参数函数",-1),Ts=a("div",{class:"language-c line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"printargs"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),e(" arg1"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token comment"},"/* 输出所有int类型的参数,直到-1结束 */"),e("\n"),a("span",{class:"token punctuation"},"{"),e("\n va_list ap"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"int"),e(" i"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token function"},"va_start"),a("span",{class:"token punctuation"},"("),e("ap"),a("span",{class:"token punctuation"},","),e(" arg1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"for"),e(),a("span",{class:"token punctuation"},"("),e("i "),a("span",{class:"token operator"},"="),e(" arg1"),a("span",{class:"token punctuation"},";"),e(" i "),a("span",{class:"token operator"},"!="),e(),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e(" i "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token function"},"va_arg"),a("span",{class:"token punctuation"},"("),e("ap"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"int"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token function"},"printf"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"%d "'),a("span",{class:"token punctuation"},","),e(" i"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token function"},"va_end"),a("span",{class:"token punctuation"},"("),e("ap"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token function"},"putchar"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'\\n'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),Os=a("h3",{id:"stddef"},[a("a",{class:"header-anchor",href:"#stddef","aria-hidden":"true"},"#"),e(" Stddef")],-1),Ls=a("ul",null,[a("li",null,[e("宏 "),a("ul",null,[a("li",null,"NULL Null 指针常量"),a("li",null,[a("code",null,"offsetof(type, member-designator)"),e(" 获得字段在结构体中的偏移量")])])]),a("li",null,[e("类型 "),a("ul",null,[a("li",null,[a("code",null,"ptrdiff_t"),e(" 带符号的整数类型, 用来表示指针相减的结果类型")]),a("li",null,[a("code",null,"wchar_t"),e(" 宽字符类型")]),a("li",null,[a("code",null,"size_t"),e(" 无符号整数类型, 用来表示 sizeof 操作符的结果类型")])])])],-1),As=a("h3",{id:"string"},[a("a",{class:"header-anchor",href:"#string","aria-hidden":"true"},"#"),e(" String")],-1),Cs=a("ul",null,[a("li",null,"men 系函数:操作任意字符序列"),a("li",null,"strn 系函数:操作非空字符序列"),a("li",null,"str 系函数:操作字符串序列('\\0')")],-1),Ds=a("h2",{id:"gdb-tutorial"},[a("a",{class:"header-anchor",href:"#gdb-tutorial","aria-hidden":"true"},"#"),e(" GDB Tutorial")],-1),Rs=a("h3",{id:"basic-command"},[a("a",{class:"header-anchor",href:"#basic-command","aria-hidden":"true"},"#"),e(" Basic Command")],-1),Is=a("ul",null,[a("li",null,"r(run)"),a("li",null,"l(list)"),a("li",null,[e("b(break) "),a("ul",null,[a("li",null,"b line_num"),a("li",null,"b filename:line_num")])]),a("li",null,"display/format address")],-1),Ps=a("p",null,"e.g display/i $pc",-1),Ms=a("ul",null,[a("li",null,[a("p",null,"t 按二进制格式显示变量")]),a("li",null,[a("p",null,"d 按十进制格式显示变量")]),a("li",null,[a("p",null,"o 按八进制格式显示变量")]),a("li",null,[a("p",null,"u 按十六进制格式显示无符号整型")]),a("li",null,[a("p",null,"x 按十六进制格式显示变量")]),a("li",null,[a("p",null,"a 按十六进制格式显示变量")]),a("li",null,[a("p",null,"f 按浮点数格式显示变量")]),a("li",null,[a("p",null,"c 按字符格式显示变量")]),a("li",null,[a("p",null,"s 按字符串格式显示变量")]),a("li",null,[a("p",null,"disas 显示汇编代码")]),a("li",null,[a("p",null,"x /num-size-format $pc/rsp/rbp")])],-1),Bs=a("p",null,"e.g size:w(2 字节) format:x/d/s(十六进制/十进制/字符串) 2wx",-1),Us=a("ul",null,[a("li",null,[e("examine - 查看内存 n、f、u 是可选的参数 "),a("ul",null,[a("li",null,"n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。"),a("li",null,"f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是 s,如果地十是指令地址,那么格式可以是 i。"),a("li",null,"u 表示从当前地址往后请求的字节数,如果不指定的话,GDB 默认是 4 个 bytes. u 参数可以用下面的字符来代替,b 表示单字节,h 表示双字节,w 表示四字节,g 表示八字节. 当我们指定了字节长度后,GDB 会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来. 表示一个内存地址.")])])],-1),Fs=a("blockquote",null,[a("p",null,"命令:x/3uh 0x54320 表示,从内存地址 0x54320 读取内容,h 表示以双字节为一个单位,3 表示三个单位,u 表示按十六进制显示。")],-1),Gs=a("ul",null,[a("li",null,[e("s step into "),a("ul",null,[a("li",null,"step1 下一条汇编指令")])]),a("li",null,"n next line"),a("li",null,"p print"),a("li",null,"q quit"),a("li",null,"up last stack"),a("li",null,"bt(back trace) function stack 显示堆栈回溯信息"),a("li",null,"info breakpoints/register")],-1),Hs=a("h3",{id:"gdb-set-command"},[a("a",{class:"header-anchor",href:"#gdb-set-command","aria-hidden":"true"},"#"),e(" GDB Set Command")],-1),zs=a("ul",null,[a("li",null,"set disassembly"),a("li",null,"set variable")],-1),Xs=a("h3",{id:"gdb-shell"},[a("a",{class:"header-anchor",href:"#gdb-shell","aria-hidden":"true"},"#"),e(" GDB Shell")],-1),js=a("p",null,"shell command",-1),qs=a("h3",{id:"gdb-assemble"},[a("a",{class:"header-anchor",href:"#gdb-assemble","aria-hidden":"true"},"#"),e(" GDB Assemble")],-1),Ks=a("h4",{id:"gdb-core-dump"},[a("a",{class:"header-anchor",href:"#gdb-core-dump","aria-hidden":"true"},"#"),e(" GDB Core Dump")],-1),Vs=a("div",{class:"language-bash line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin class-name"},"ulimit"),e(" -c unlimited\ngdb -c core_file_path target_exe_path\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Ys=a("h4",{id:"gdb-disasm"},[a("a",{class:"header-anchor",href:"#gdb-disasm","aria-hidden":"true"},"#"),e(" GDB Disasm")],-1),Ws=a("ul",null,[a("li",null,"CS Segment")],-1),Qs=a("div",{class:"language-bash line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token punctuation"},"("),e("gdb"),a("span",{class:"token punctuation"},")"),e(" disass\n"),a("span",{class:"token punctuation"},"("),e("gdb"),a("span",{class:"token punctuation"},")"),e(" x/i\n"),a("span",{class:"token punctuation"},"("),e("gdb"),a("span",{class:"token punctuation"},")"),e(" x/5i "),a("span",{class:"token variable"},"$pc"),e("\n"),a("span",{class:"token punctuation"},"("),e("gdb"),a("span",{class:"token punctuation"},")"),e(" ni/si\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Js=a("ul",null,[a("li",null,"Registers")],-1),$s=a("div",{class:"language-bash line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token punctuation"},"("),e("gdb"),a("span",{class:"token punctuation"},")"),e(" i r\n"),a("span",{class:"token punctuation"},"("),e("gdb"),a("span",{class:"token punctuation"},")"),e(" i r a\n"),a("span",{class:"token punctuation"},"("),e("gdb"),a("span",{class:"token punctuation"},")"),e(" i r ds\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),Zs=a("ul",null,[a("li",null,"DS Segment"),a("li",null,"SS Segment")],-1),na=a("h3",{id:"gdb-stack-frame"},[a("a",{class:"header-anchor",href:"#gdb-stack-frame","aria-hidden":"true"},"#"),e(" GDB Stack Frame")],-1),sa=a("div",{class:"language-bash line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token punctuation"},"("),e("gdb"),a("span",{class:"token punctuation"},")"),e(" bt\n"),a("span",{class:"token punctuation"},"("),e("gdb"),a("span",{class:"token punctuation"},")"),e(" frame n\n"),a("span",{class:"token punctuation"},"("),e("gdb"),a("span",{class:"token punctuation"},")"),e(" info locals\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),aa=a("h2",{id:"gcc"},[a("a",{class:"header-anchor",href:"#gcc","aria-hidden":"true"},"#"),e(" GCC")],-1),ea=a("ul",null,[a("li",null,"-E: cpp(c preprocessor) 预处理 => .i"),a("li",null,"-S: cll 编译 => .s"),a("li",null,"-c: as(assemble) 汇编 => .o"),a("li",null,"-time Time the execution of each subprocess"),a("li",null,[a("code",null,"-std="),e(" Assume that the input sources are for "),a("code",null,"")]),a("li",null,[a("code",null,"-B "),e(" Add "),a("code",null,""),e(" to the compiler's search paths")]),a("li",null,"-v Display the programs invoked by the compiler"),a("li",null,[a("code",null,"-o "),e(" Place the output into "),a("code",null,"")]),a("li",null,"-shared Create a shared library"),a("li",null,[a("code",null,"-Wall")]),a("li",null,[a("code",null,"-v --help")])],-1),ta=a("h2",{id:"awesome-tools"},[a("a",{class:"header-anchor",href:"#awesome-tools","aria-hidden":"true"},"#"),e(" Awesome Tools")],-1),la=a("ul",null,[a("li",null,"用于创建代码文档资料的 NDoc"),a("li",null,"用于生成解决方案的 NAnt"),a("li",null,"用于生成代码的 CodeSmith"),a("li",null,"用于监视代码的 FxCop"),a("li",null,"用于编译少量代码的 Snippet Compiler"),a("li",null,[e("两种不同的转换器工具:"),a("a",{href:"http://ASP.NET",target:"_blank",rel:"noopener noreferrer"},"ASP.NET"),e(" 版本转换器和 Visual Studio .NET 项目转换器")]),a("li",null,"用于生成正则表达式的 Regulator"),a("li",null,"用于分析程序集的 .NET Reflector"),a("li",null,"用于单元测试的 NUnit")],-1);l.render=function(a,e,t,l,oa,ca){return n(),s("div",null,[o,c,r,p,i,u,k,d,m,b,h,y,f,v,g,w,x,E,_,N,S,T,O,L,A,C,D,R,I,P,M,B,U,F,G,H,z,X,j,q,K,V,Y,W,Q,J,$,Z,nn,sn,an,en,tn,ln,on,cn,rn,pn,un,kn,dn,mn,bn,hn,yn,fn,vn,gn,wn,xn,En,_n,Nn,Sn,Tn,On,Ln,An,Cn,Dn,Rn,In,Pn,Mn,Bn,Un,Fn,Gn,Hn,zn,Xn,jn,qn,Kn,Vn,Yn,Wn,Qn,Jn,$n,Zn,ns,ss,as,es,ts,ls,os,cs,rs,ps,is,us,ks,ds,ms,bs,hs,ys,fs,vs,gs,ws,xs,Es,_s,Ns,Ss,Ts,Os,Ls,As,Cs,Ds,Rs,Is,Ps,Ms,Bs,Us,Fs,Gs,Hs,zs,Xs,js,qs,Ks,Vs,Ys,Ws,Qs,Js,$s,Zs,na,sa,aa,ea,ta,la])};export default l;export{t as __pageData}; diff --git a/assets/language_cpp_cppBasicNotes.md.212edeb8.js b/assets/language_cpp_cppBasicNotes.md.212edeb8.js new file mode 100644 index 00000000000..0a0220881f1 --- /dev/null +++ b/assets/language_cpp_cppBasicNotes.md.212edeb8.js @@ -0,0 +1 @@ +import{o as n,c as s,a}from"./app.6dd2a1b7.js";const p='{"title":"C++ Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Basic Workflow","slug":"basic-workflow"},{"level":3,"title":"初始化与回收","slug":"初始化与回收"},{"level":2,"title":"变量","slug":"变量"},{"level":3,"title":"指针","slug":"指针"},{"level":3,"title":"reference (引用类型)","slug":"reference-引用类型"},{"level":3,"title":"volatile 类型","slug":"volatile-类型"},{"level":2,"title":"运算符","slug":"运算符"},{"level":3,"title":"左/右值运算符(运算结果为左/右值)","slug":"左-右值运算符-运算结果为左-右值"},{"level":3,"title":"sizeof","slug":"sizeof"},{"level":2,"title":"Expression (表达式)","slug":"expression-表达式"},{"level":3,"title":"左/右值表达式","slug":"左-右值表达式"},{"level":2,"title":"联合(union)","slug":"联合-union"},{"level":3,"title":"位段","slug":"位段"},{"level":2,"title":"函数","slug":"函数"},{"level":3,"title":"Default Params","slug":"default-params"},{"level":3,"title":"内联函数(inline)","slug":"内联函数-inline"},{"level":2,"title":"类","slug":"类"},{"level":3,"title":"访问控制权限","slug":"访问控制权限"},{"level":3,"title":"构造函数","slug":"构造函数"},{"level":3,"title":"析构函数","slug":"析构函数"},{"level":3,"title":"构造与析构(重点)(P148)","slug":"构造与析构-重点-p148"},{"level":3,"title":"New and Delete","slug":"new-and-delete"},{"level":3,"title":"This Pointer","slug":"this-pointer"},{"level":3,"title":"成员指针 与 指针成员","slug":"成员指针-与-指针成员"},{"level":3,"title":"函数成员","slug":"函数成员"},{"level":3,"title":"静态成员","slug":"静态成员"},{"level":3,"title":"友元","slug":"友元"},{"level":3,"title":"单继承","slug":"单继承"},{"level":3,"title":"虚函数","slug":"虚函数"},{"level":2,"title":"作用域(Scope)","slug":"作用域-scope"},{"level":3,"title":"面向过程的作用域","slug":"面向过程的作用域"},{"level":3,"title":"面向对象的作用域","slug":"面向对象的作用域"},{"level":2,"title":"运算符重载","slug":"运算符重载"},{"level":3,"title":"重载原则","slug":"重载原则"},{"level":3,"title":"自增/减运算符","slug":"自增-减运算符"},{"level":3,"title":"成员运算符","slug":"成员运算符"},{"level":3,"title":"赋值运算符","slug":"赋值运算符"},{"level":3,"title":"强制类型转换","slug":"强制类型转换"},{"level":2,"title":"模板","slug":"模板"},{"level":3,"title":"模板调用形式","slug":"模板调用形式"},{"level":2,"title":"异常","slug":"异常"},{"level":3,"title":"异常对象的析构","slug":"异常对象的析构"},{"level":2,"title":"多态","slug":"多态"},{"level":2,"title":"STL","slug":"stl"},{"level":3,"title":"String","slug":"string"},{"level":3,"title":"Input Output","slug":"input-output"},{"level":3,"title":"Container","slug":"container"},{"level":3,"title":"Heap Algorithm","slug":"heap-algorithm"},{"level":3,"title":"Sorting Algorithms","slug":"sorting-algorithms"},{"level":3,"title":"Partitioning Algorithms","slug":"partitioning-algorithms"},{"level":3,"title":"Permutation Algorithms","slug":"permutation-algorithms"},{"level":3,"title":"Numeric Algorithms","slug":"numeric-algorithms"},{"level":3,"title":"Query Algorithms","slug":"query-algorithms"},{"level":3,"title":"Search Algorithms","slug":"search-algorithms"},{"level":3,"title":"Set Algorithms","slug":"set-algorithms"},{"level":3,"title":"Mover Algorithms","slug":"mover-algorithms"},{"level":3,"title":"Value Algorithms","slug":"value-algorithms"},{"level":3,"title":"Functional Algorithms","slug":"functional-algorithms"},{"level":2,"title":"Awesome Tips and Best Practice","slug":"awesome-tips-and-best-practice"},{"level":3,"title":"静态成员 BP","slug":"静态成员-bp"},{"level":3,"title":"友元函数","slug":"友元函数"},{"level":3,"title":"单继承 BP","slug":"单继承-bp"},{"level":3,"title":"虚函数 BP","slug":"虚函数-bp"},{"level":3,"title":"Error BP","slug":"error-bp"},{"level":3,"title":"Inherits Output","slug":"inherits-output"}],"relativePath":"language/cpp/cppBasicNotes.md","lastUpdated":1627196319000}',e={},t=a('

    C++ Basic Notes

    Basic Workflow

    初始化与回收

    • Treat global program as a object: 开工函数与收工函数
    • Normal Object: 构造函数与析构函数

    变量

    const 变量 代替 #define 宏定义

    指针

    • 只读指针可赋值为 普通对象地址
    • 普通指针不可赋值为 只读对象地址
    int *p = const int;         // x\nint *p = int;               // o\nconst int *p = const int;   // o\nconst int *p = int;         // o\n
    1
    2
    3
    4

    reference (引用类型)

    性质

    引用类型(&)实质上是一种语法糖,编译器将引用变量最终全部编译为指针变量

    作为函数参数

    向函数传递引用类型实参时,若:

    • 实参与形参类型不一致(必须完全一致)
    • 实参为(右)值表达式

    则会生成一个内部匿名变量,用于函数调用. 此时,对参数进行的操作将无法改变实参原有值,使得 call by reference 失效.

    特性

    • 普通全局引用变量必须在定义时初始化初始化(左值表达式)
    int &x = 1;   // warning: 引用匿名变量\nint &k = j++; // warning: 引用匿名变量\n
    1
    2
    • 引用变量不分配存储单元: 不能引用 引用变量, 不能作为指针所指对象, 不能作为数组元素
    int & &x;       // error\nint & *p;       // error\nint & s[4];     // error\n
    1
    2
    3
    • 引用变量的值按字节(指针/地址)编码: 不能引用位段(无法按字节编码)
    int &w = a.j; // error\n
    1
    • 引用变量不能引用引用变量, 只能引用另一个引用变量所引用的变量/地址
    int x = 10;\nint &j = x;\nint &&m = j;  // error\nint &m = j;   // pass: m = j => x\n
    1
    2
    3
    4
    • 引用变量可以引用 register 变量, 编译器会将其自动转为 auto 变量(为其分配地址)
    register int i = 0,\nregister int &j = i;\n
    1
    2
    • 引用变量在一定程度上具有指针性质
    int x = 1;\nconst int &p = x;   // pass\n\nx = 7;  // pass\np = 7;  // error\n
    1
    2
    3
    4
    5

    volatile 类型

    • volatile 表示可被其他线程/进程改变的变量
    • volatile 变量常作为全局变量, 用于同步各进程
    • const 表示不可被本线程/进程修改的变量
    volatile int x;\n\nx = 3;\n\nif (4 == x) {\n    cout << "X changed by other routines.";\n}\n
    1
    2
    3
    4
    5
    6
    7

    运算符

    左/右值运算符(运算结果为左/右值)

    • 左值运算符: 前置++/--, =/+=/*=/&=/op=
    • 右值运算符: 强制类型转换(不可对其运算结果进行取地址), +/*/binary

    sizeof

    sizeof 数值\nsizeof(数值)\nsizeof(类型)\n\nsizeof(printf("abcd")); // 无输出\n
    1
    2
    3
    4
    5

    Expression (表达式)

    左/右值表达式

    左值表达式一定可作(右)值表达式, (右)值表达式不可作左值表达式:

    • 左值表达式 : 变量, 赋值表达式, 前缀自操作表达式, 返回值为引用类型的函数调用
    bar;\ny = 6;\ni -= 10;\n++i;\n\nint &f(void);\nf() = j;\n
    1
    2
    3
    4
    5
    6
    7
    • (右)值表达式: 常量, 强制类型转换表达式, 后缀自操作表达式, 算数表达式
    20;\n(type)x;\ni++;\ny + 2;\n
    1
    2
    3
    4

    联合(union)

    匿名联合具有以下性质:

    • 没有对象的全局匿名联合必须 static
    • 只可定义 public 成员
    • 数据成员与联合本身作用域相同
    • 数据成员共享存储空间

    位段

    class/struct/union 都可定义位段成员, 但类型必须为 char/short/int/enum, 不可为 long/float/array/class

    函数

    Default Params

    • 不能在 函数原型声明函数定义同时 定义参数的默认值,会产生默认值冲突
    • 所有缺省参数必须位于参数列表右边
    • 不能用前一个参数初始化后一个参数
    • 当同时有 int g(void) int g(int x = 1) 时, 不能调用 g() (具有二义性)
    int bar(int x , int y = 5, int z = m(u,v));\nint foo(int x, int y = x++);    // error\n
    1
    2

    内联函数(inline)

    以下情况会造成内联失败:

    • 内联函数中使用 分支/循环/开关/函数调用
    • 内联函数定义出现在调用后面(先调用后定义)
    • 其他函数访问了内联函数入口地址
    • 内联函数定义为(纯)虚函数

    内联最终结果:

    • 内联成功后, 原函数会被编译器清除
    • 不管内联是否成功, 内联函数作用域局限于当前源文件
    • 全局 extern main 函数不能定义为内联函数(否则会使得主函数作用域变小, 操作系统无法访问主函数)
    • 在类体内实现的任何函数自动变为内联函数

    访问控制权限

    public > protected > private + friend > private

    构造函数

    调用形式

    构造函数不可被显式调用(类前缀), 必须隐式调用(省略类前缀)

    构造函数体

    • 构造函数体前: 初始化只读成员、引用成员、对象成员、其他数据成员, 初始化顺序以定义顺序为准, 无关构造函数体前出现顺序
    • 构造函数体内: 再次赋值其他数据成员(不可再次只读成员、引用成员、对象成员)

    默认无参构造函数

    • 当定义了含参构造函数后, 编译器将不会再为对象自动添加无参构造函数
    • 默认无参构造函数不会初始化只读/引用成员, 且只会调用对象成员的无参构造函数(若对象成员没有无参构造函数,则编译器报错)
    • 对于局部对象, 将随机初始化普通数据成员; 对于全局对象, 将普通数据成员初始化为 0. 由于默认无参构造函数的存在, 当对象只含有普通数据成员(无只读/引用/指针成员, 且对象成员有无参构造函数), 可以不显式定义构造函数
    class Foo {\n    const int b;\n    int c, &d, e, f;\n    String g, h;\n\npublic:\n    // 初始化顺序: b, c, d, e, f, g, h\n    Foo(int bar): d(c), c(bar), g(bar), b(bar), e(bar) {\n        c += bar;\n        f = bar;\n    }\n};\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    B z(7, 8); => B z(7, 8);    ///< 2 参\nB z = (7, 8); => B z(8);    ///< 1 参\n
    1
    2

    构造顺序

    • 同一派生树上所有虚基类(自左向右, 自下向上)(递归)
    • (继承顺序)直接基类(递归)
    • (定义顺序)所有成员
    • 构造函数体

    深拷贝构造函数

    • 形式为 Foo:Foo(Foo &obj) 的构造函数,可使得对象作为实参传递时自动进行深拷贝复制
    ARRAY::ARRAY(ARRAY &r) {\n    p = new int[size = r.size];\n\n    for (int i = 0;i < size; i++) {\n        p[i] = r.p[i];\n    }\n}\n
    1
    2
    3
    4
    5
    6
    7

    Move Constructor

    class A {\n  A(const A&& a) {\n    // move constructor\n    // set a == null_ptr\n  }\n}\n
    1
    2
    3
    4
    5
    6

    析构函数

    • 析构函数即可显式调用,又可隐式调用
    • 析构函数与全局 main 函数 没有重载函数
    • 作用域结束时会自动调用析构函数
    • 调用 exit/abort 时, 需手动调用析构函数释放资源
    String x("global");\n\nint main(void) {\n    short error = 0;\n    String y("local");\n\n    // set error flag\n    switch (error) {\n        case 0:\n            return;\n        case 1:\n            y.~String();\n            exit(1);\n        default:\n            x.~String();\n            y.~String();\n            abort();\n    }\n\n    return 0;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    • 设置 析构标志 防止重复析构同一对象
    String::~String() {\n    // check flag\n    if (s == NULL) {\n        return;\n    }\n\n    cout<<"Deconstruct:"<<s;\n\n    free(s);\n\n    // set flag\n    s = NULL;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    构造与析构(重点)(P148)

    • 按定义顺序自左下至右上地构造所有虚基类
    • 按定义顺序构造直接基类
    • 按定义顺序构造数据成员(对象/const/引用/普通成员)
    • 执行类构造函数体
    • 递归执行以上过程

    派生树

    • 一个对象/对象成员一颗单独的派生树
    • 单独的派生树中, 合并同名虚基类, 不合并同名基类, 并 { name(type), ...} 标示数据成员

    New and Delete

    Stack and Heap

    • string str("sabertazimi") 创建在栈上, 自动析构
    • new/malloc 返回堆指针, delete/free 的对象是堆指针/(&引用变量), 完全由程序员管理创建与回收
    int x = 5;\nint *p = &x;\nint &q = x;\n\ndelete p;   // address of x\ndelete &q;  // address of x\n
    1
    2
    3
    4
    5
    6

    指针成员

    • 普通指针/不含指针成员的对象变量分配/回收内存可混用 malloc/new/free/delete/delete []
    • 创建/回收含有指针成员的类时,只能用 new/delete/delete [](分配对象内存+调用构造/析构函数), 不能用 malloc/free(只作用于对象本身,不调用构造/析构函数,即不为指针成员分配/回收内存), 否则会造成指针成员未分配内存/内存泄露
    • new 对象数组实质: malloc 对象 + 调用对象无参构造函数

    This Pointer

    普通函数成员比静态函数成员多一个隐含参数 this 指针, 其会随着函数类型的不同而改变类型

    • this 指针指向对象起始地址处(对象首成员地址)
    • 一般函数: class_type *const this;
    • const 函数: const class_type *const this;, 可以修改 this 所指对象的非只读静态数据成员
    • volatile 函数: volatile class_type *const this;
    • 当 this 指针类型不同时, 亦会产生重载函数

    成员指针 与 指针成员

    成员指针 - 指向成员的指针

    • 成员指针不是地址, 而是偏移量
    • 考虑到越界问题,成员指针不可移动
    • 成员指针不可进行类型转换, 不可将其转换为其他类型, 也不可将其他类型转换为它
    • 作用: 成员别名 (a.*pf)() => a.size()
    • 优先级: . > * > .*(结合性: 自左向右)
    int A::*pi = &A::i;         ///< 数据成员指针\nint (A::*pf)(void) = &A::f;     ///< 函数成员指针\n\nlong x = a.*pi;     ///< x = a.*pi = a.*(&A::i) = a.A::i = a.i;\nx = (a.*pf)();      ///< x = (a.*pf)() = (a.*(&A::f))() = (a.A::f)() = a.f()\n\npi++, pf+=1;        ///< Error: 成员指针不可移动\nx = (long)pi;       ///< Error: pi 不能转换为 long int\n
    1
    2
    3
    4
    5
    6
    7
    8

    定义含指针成员的类

    • 深拷贝构造函数: T(const T &)
    • 深拷贝赋值运算函数: virtual T& operator=(const T &)
    • 虚析构函数: virtual ~T()
    • 定义T &p = *new T()后, 使用delete &p释放内存
    • 定义T *p = new T()后, 使用delete p释放内存

    函数成员

    Const and Volatile Member

    • 修饰函数成员隐含参数 * this 对象指针,表示不可修改/挥发对象
    • 被修饰函数成员不能修改对象自身(即对象的普通数据成员), 可以修改对象的非只读静态数据成员
    • 构造函数/析构函数不可被 const/volatile 修饰: 在构造/析构函数中, 对象必须可以被修改(No const), 且处于稳定状态(No volatile)

    Mutable Member

    • mutable 不可修饰引用成员
    • mutable 成员不可用 const/volatile/static 修饰
    • const 函数中可以修改 mutable 成员

    静态成员

    静态数据成员

    static member 特性
    • 静态数据成员脱离对象实例存在 Person::totalNum
    • 静态数据成员存储单元不属于任何对象实例
    定义
    • 不能在构造函数/析构函数创建/释放静态数据成员的存储单元
    • 在类体内声明静态数据成员, 在类体外定义并初始化静态数据成员 List * List::head = NULL;(包括私有静态数据成员)
    • 局部类/union 类不可定义静态数据成员, 局部类/union 类可以定义静态函数成员

    静态函数成员

    • 静态函数成员不含隐含参数(this 对象指针)
    • 构造/析构/virtual/const/volatile 函数(均有 this 对象指针)不能定义为静态函数成员
    • 体内实现为 inline 函数, 体外实现不能有 static 关键字
    引用形式
    • 抽象类型 List::sort()
    • 对象实例 list.sort()
    Static Function Member
    • 只能直接修改当前对象静态数据成员
    • 可以通过静态函数成员的函数参数, 传入对象实例指针, 从而间接修改非静态数据成员

    静态成员指针

    除了具有访问权限外, 静态成员指针就是普通指针(可以进行指针加减运算)

    int *d = &CROWD::number;\nint (*f)() = &CROWD::getnumber;\n
    1
    2

    static 关键字

    • 位于 class 体内: 表示该成员/方法共享存储单元(不限定作用域)
    • 位于 class 体外: 表示该变量/函数具有静态存储周期(限定作用域为当前文件)

    友元

    • 在重载函数中, (函数签名不一致的) 未声明的函数只能访问类的共有成员
    • friend 声明不能与存储类型关键字共用(static/virtual)
    • 定义友元函数(使用 friend 修饰函数声明)时: 友元函数不是此处的函数成员, 可随意指定 返回类型与访问控制权限

    成员友元函数

    可在 3 处实现函数体:

    • 函数定义处(本类): 内联函数成员
    • 友元声明处(它类): 内联友元函数(作用域局限于当前程序文件)
    • 类体外(不使用 friend 关键字)

    单继承

    派生控制权限

    • 降低/维持权限
    • class 缺省为 private 派生控制, struct 缺省为 public 派生控制
    • 只可恢复至基类原权限, 不可随意修改基类成员权限

    父类与子类

    • 子类对象地址可以赋值给父类指针, 子类指针可以直接赋值给父类指针
    • 父类对象地址不可以赋值给子类指针, 父类指针即使强制类型转换后也不可以赋值给子类指针

    虚函数

    virtual function 特性

    • 无限传递性: 派生类中原型相同的函数自动成为虚函数
    • 具有隐式参数(this 对象指针): 不能为静态函数成员(静态函数无 this 参数)/非函数成员(本类友元函数), 可以为它类成员友元函数
    • 构造函数不能为虚函数, 析构函数可以为虚函数
    • virtual 与 friend/static 关键字不可共用
    • union 既不能定义基类也不能定义派生类, 故不能在 union 中定义虚函数

    功能

    实现运行时多态. 最好将普通函数成员全部定义为 虚函数

    纯虚函数 与 抽象类

    • 纯虚函数具有虚函数的所有特性
    • 具有纯虚函数的类自动成为抽象类
    struct A {\n    virtual void f1() = 0;\n    virtual void f2() = 0;\n};\n
    1
    2
    3
    4

    易错点

    • virtual 关键字只能在 struct/class 体内使用, 在体外实现相应函数成员时, 应去掉 virtual 关键字
    • 当在函数成员中调用虚函数时, 会根据 this 所指真实对象动态调用虚函数(如在基类函数成员中调用虚函数, 可能实际调用的是子类的虚函数)
    • 使用基类指针/基类引用指向派生类时, 只可按基类访问控制权限调用基类拥有的方法
    • 不可以new 抽象类(堆实例)/构造抽象类的栈实例, 函数参数/返回值不可直接定义为抽象类(调用时无法构造栈实例), 但可以定义为抽象类的引用/指针
    Parent *p = new Child(5);\np->~Child();    // Error: method not defined\np->~Parent();   // Success: invoke Child::~Child()\n
    1
    2
    3

    作用域(Scope)

    • 标识符的作用域越小,访问的优先级别越高
    • 单目运算符 :: 可访问全局符号 e.g ::process++ // 自加全局变量 process

    面向过程的作用域

    • 作用于表达式内
    • 作用于函数内
    • 作用于程序文件内
    • 作用于整个程序

    面向对象的作用域

    • 作用于函数成员
    • 作用于类/派生类
    • 作用于基类
    • 作用于虚基类

    命名空间(namespace)

    • 指定一个完全的命名空间时, 不会将任何标识符加入当前作用域. 可重新定义同名局部符号
    namespace A {\n    int a = 0;\n    namespace B {\n        int a = 0;\n    }\n    namespace C {\n\n    }\n    namespace D {\n\n    }\n    using namespace B;\n    using namespace C;\n}\n\nusing namespace A;\nint a = 5;      ///< Right: 全局变量 a 与 A中的a 同名\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    • 指定一个命名空间的具体成员时, 会将成员符号加入当前作用域
    namespace A {\n    float a = 0,\n          b = 0;\n    float d(float y) {\n        return y;\n    }\n}\n\nnamespace B {\n    void g(void) {\n        cout<<"B\\n">>;\n    }\n}\n\nint main(void) {\n    using A::a;\n    using A::d;\n    using B::g;\n\n    long a = 1;     ///< Error: a 已被加入当前 main 函数作用域(A::a), 不可重复定义\n    a = d(2.1);     ///< Right: A::a = A::d(2.1);\n\n    return 0;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    • 可以为嵌套命名空间定义别名
    namespace A {\n    namespace B {\n        namespace C {\n            int k = 4;\n        }\n    }\n}\n\nnamespace ABCD = A::B::C;\n\nusing ABCD::k;      ///< refer to A::B::C::k\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    运算符重载

    运算符重载方式
    sizeof . .* :: ?:不可重载
    = -> () [](必须有 this 指针)普通函数成员
    new delete(不可有 this 指针)静态函数成员 普通函数
    其他运算符普通函数成员 普通函数

    重载原则

    • 若运算符为左值运算符, 则重载返回类型为非 const 引用类型
    • 若运算符为非左值运算符, 则重载返回类型为普通类型(栈内存)或 const 类型
    • 重载为普通函数成员, this 占据第一个参数位置
    • 重载不改变运算符的优先级与结合性

    自增/减运算符

    A &A::operator++();     ///< 前置++\nA A::operator++(int);   ///< 后置++, int 参数只起区分作用\n
    1
    2

    成员运算符

    只能重载为普通函数成员, 只有一个参数(+ this), 返回类型必须为指针/引用类型

    struct A {\n    int a;\n};\n\nclass B {\n    A x;\npublic:\n    A *operator->() {\n        return &x;\n    }\n};\n\nint main(void) {\n    B b;\n    int i = b->a;               // i = b.x.a\n    i = (*b.operator->()).a;    // i = b.x.a\n    i = b.operator->()->a;      // i = b.x.a\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    赋值运算符

    • 所有对象都有默认的 = 重载: 浅拷贝赋值运算

    强制类型转换

    • 当定义只有一个参数的构造函数时, 进行运算时会自动发生类型转换(利用右值调用此构造函数, 生成中间变量赋给左值)
    Complex m;\nm + 2 => m + 2.0 => m + Complex(2.0);\n
    1
    2

    模板

    模板调用形式

    • 函数标签相同的覆盖函数
    • 通过函数模板自动生成可匹配参数的实例函数
    • 通过强制类型转换,调用已经手动生成的可匹配参数的实例函数
    • 调用失败

    异常

    异常对象的析构

    catch (const A *a) 形式

    多态

    • 编译时多态(重载): 静态绑定(同名不同参的)重载函数 - 一个方法, 多种参数 (f(void) => f@, f(int) => f@i, f(int, int) => f@ii)
    • 运行时多态(多态): 动态绑定(upcasting)虚函数 - 一个接口, 多个方法(父子表现不同, 兄弟表现不同)
    Parent c = new Child();\nc.speak("Hello World!") // => "Child: Hello World!"\n
    1
    2

    STL

    • 工作方式: copy in, copy out

    String

    #include <iostream>\n#include <malloc.h>\n#include <string.h>\n\nusing namespace std;\n\n/**\n *\n * Demos for operator overload:\n *  comparison: < == >\n *  getter: []\n *  typecast: (const char *)\n *  contact: +\n *  assign: = +=\n */\n\n/**\n * Notes:\n *  普通函数成员 与 析构函数 全部定义为虚函数\n *  不改变对象实例的函数 全部定义为 const 函数\n *  被改变参数/返回值 全部定义为 引用类型\n *  深拷贝(赋值)函数参数/返回值 全部定义为 引用类型\n */\n\nclass String {\n    char *s;\npublic:\n    virtual int operator>(const String &c) const;\n    virtual int operator==(const String &c) const;\n    virtual int operator<(const String &c) const;\n    virtual char &operator[](int x);\n    virtual operator const char *() const;\n    virtual String operator+(const String &c) const;\n    virtual String &operator=(const String &c);\n    virtual String &operator+=(const String &c);\n    String(const char *c);\n    String(const String &c);\n    virtual ~String();\n};\n\nint String::operator>(const String &c) const {\n    return strcmp(s, c.s) > 0;\n}\n\nint String::operator==(const String &c) const {\n    return strcmp(s, c.s) == 0;\n}\n\nint String::operator<(const String &c) const {\n    return strcmp(s, c.s) < 0;\n}\n\nchar &String::operator[](int x) {\n    return s[x];\n}\n\nString::operator const char *() const {\n    return s;\n}\n\nString String::operator+(const String &c) const {\n    char *t = new char[strlen(s)+strlen(c.s)+1];\n    String r(strcat(strcpy(t,s), c.s));\n    delete []t;\n    return r;\n}\n\nString &String::operator=(const String &c) {\n    delete []s;\n    strcpy(s=new char[strlen(c.s)+1], c.s);\n    return *this;\n}\n\nString &String::operator+=(const String &c) {\n    return *this = *this+s;\n}\n\nString::String(const char *c) {\n    strcpy(s=new char[strlen(c)+1], c);\n}\n\nString::String(const String &c) {\n    strcpy(s=new char[strlen(c.s)+1], c.s);\n}\n\nString::~String(void) {\n    if (s) {\n        delete []s;\n        s = 0;\n    }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91

    Input Output

    iomanip STL API

    output format

    #include <iostream>\n#include <iomanip>\n\nint main() {\n    std::cout << "default fill: " << std::setw(10) << 42 << '\\n'\n              << "setfill('*'): " << std::setfill('*')\n                                  << std::setw(10) << 42 << '\\n';\n\n    std::cout << rd.name << " 0x"\n              << std::setfill('0') << std::setw(16) << std::hex\n              << get_register_value(m_pid, rd.r) << std::endl;\n}\n\n// Output:\n// default fill:         42\n// setfill('*'): ********42\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

    Container

    • 序列容器: vector string deque list
    • 关联容器: set multiset map multimap
    • 连续内存容器: vector string deque
    • 链表容器: list slit hash

    unordered_map container

    • count/find
    • []
    if (m_breakpoints.count(possible_breakpoint_location)) {\n    auto& bp = m_breakpoints[possible_breakpoint_location];\n}\n\nauto alias = m_aliases.find(input);\nreturn (alias != m_aliases.end() && alias->second == command);\n
    1
    2
    3
    4
    5
    6

    Container Choosing

    • Vector vs Array: use Array when size is fixed and need elaborate container-like behavior
    • Vector vs Deque: use Deque when container is large
    • Vector vs List (no random access): use List when many middle insertion/deletion/splicing
    • Vector vs Set/Map: use Set/Map when container is large

    List Size

    list.empty() 优于 list.size() == 0

    List Manipulation

    void container::insert(InputIterator begin, InputIterator end);\nvoid container::insert(iterator position, InputIterator begin, InputIterator end);\n\niterator container::erase(iterator begin, iterator end);    // 序列容器\nvoid container::erase(iterator begin, iterator end);        // 关联容器\n\nvoid container::assign(InputIterator begin, InputIterator end);\n
    1
    2
    3
    4
    5
    6
    7
    v1.assign(v2.begin() + v2.size() / 2, v2.end());\nv1.insert(v1.end(), v2.begin() + v2.size() / 2, v2.end())   // 将 v2 一半元素插入 v1 尾部\n
    1
    2

    List Remove

    • 对于连续内存容器 vector/string/deque:
    c.erase(remove(c.begin(), c.end(), 1963), c.end())\n\nbool badValue(int);\nc.erase(remove_if(c.begin(), c.end(), badValue), c.end());\n
    1
    2
    3
    4
    • 对于 list:
    c.remove(1963)\n\nbool badValue(int);\nc.remove_if(badValue);  // higher order function\n
    1
    2
    3
    4
    • 对于关联容器:
    c.erase(1963);\n
    1

    List Reserve and Swap

    v.reserve(1000);    // 强制分配 1000 个元素内存单元, 防止反复回收/释放, 提高执行效率\n\nstring(s).swap(s);  // 回收多余内存单元(shrink to fit), 提高内存利用率\n
    1
    2
    3

    Heap Algorithm

    std::make_heap(begin(numbers), end(numbers));\nstd::push_heap(begin(numbers), end(numbers));\nstd::pop_heap(begin(numbers), end(numbers));\nstd::is_heap\nstd::is_heap_until\n
    1
    2
    3
    4
    5

    Sorting Algorithms

    sort\nstable_sort\nstd::is_sorted\nstd::is_sorted_until\n\npartial_sort\nnth_element: 0 - nth-1 sorted (< nth), nth+1 - end (> nth) unsorted\nsort_heap\ninplace_merge\n
    1
    2
    3
    4
    5
    6
    7
    8
    9

    Partitioning Algorithms

    partition_point\npartition\nstable_partition\nstd::is_partitioned\nstd::is_partitioned_until\n
    1
    2
    3
    4
    5

    Permutation Algorithms

    rotate\nshuffle\nprev_permutation\nnext_permutation\n
    1
    2
    3
    4

    Numeric Algorithms

    count\ncount_if\n\naccumulate\n(transform_)reduce\n\npartial_sum\n(transform_)inclusive_scan\n(transform_)exclusive_scan\n\ninner_product\nadjacent_difference\nsample\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    Query Algorithms

    all_of\nany_of\nnone_of\n\nequal\nlexicographical_compare\nmismatch\n
    1
    2
    3
    4
    5
    6
    7

    Equal STL Algorithm

    template<class InputIt1, class InputIt2>\nbool equal(\n    InputIt1 first1,\n    InputIt1 last1,\n    InputIt2 first2\n) {\n    for (; first1 != last1; ++first1, ++first2) {\n        if (!(*first1 == *first2)) {\n            return false;\n        }\n    }\n\n    return true;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    bool is_prefix(const std::string& s, const std::string& of) {\n    if (s.size() > of.size()) return false;\n    return std::equal(s.begin(), s.end(), of.begin());\n}\n\nbool is_suffix(const std::string& s, const std::string& of) {\n    if (s.size() > of.size()) return false;\n    auto diff = of.size() - s.size();\n    return std::equal(s.begin(), s.end(), of.begin() + diff);\n}\n\nbool is_palindrome(const std::string& s) {\n    return std::equal(s.begin(), s.begin() + s.size() / 2, s.rbegin());\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    Search Algorithms

    search\nfind\nfind_if\nfind_if_not\nfind_first_of\nfind_end\nadjacent_find\n\nequal_range\nlower_bound\nupper_bound\n\nmin_element\nmax_element\nminmax_element\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    Find STL Algorithms

    template<class InputIterator, class T>\n  InputIterator find (InputIterator first, InputIterator last, const T& val) {\n  while (first!=last) {\n    if (*first==val) return first;\n    ++first;\n  }\n  return last;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    auto it = std::find_if(begin(g_register_descriptors), end(g_register_descriptors),\n                      [r](auto&& rd) { return rd.r == r; });\n
    1
    2

    Set Algorithms

    set_difference\nset_intersection\nset_union\nset_symmetric_difference\nincludes\nmerge\n
    1
    2
    3
    4
    5
    6

    Mover Algorithms

    copy\ncopy_backward\ncopy_if\nremove_copy\nunique_copy\nreverse_copy\nrotate_copy\nreplace_copy\nreplace_copy_if\npartition_copy\npartial_sort_copy\n\nmove\nmove_backward\nswap_ranges\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    Value Algorithms

    fill\ngenerate\nreplace\nreplace_if\niota\n
    1
    2
    3
    4
    5

    Functional Algorithms

    transform\nfor_each\n
    1
    2

    Awesome Tips and Best Practice

    • 普通函数成员 与 析构函数 全部定义为虚函数
    • 不改变对象实例的函数 全部定义为 const 函数
    • 被改变参数/返回值 全部定义为 引用类型
    • 深拷贝(赋值)函数参数/返回值 全部定义为 引用类型
    • 函数(传值)参数全部定义为 const & 类型: 既减少值的多余复制, 又保证原值不会被误修改

    静态成员 BP

    • 静态函数成员只能直接修改当前对象静态数据成员, 可以通过传参修改参数的普通数据成员
    • 静态函数成员体内实现为 inline 函数, 体外实现不能有 static 关键字
    • 不能在构造函数/析构函数中 创建/释放 静态数据成员的存储单元
    • 在类体内声明静态数据成员, 在类体外定义并初始化静态数据成员 List * List::head = NULL;(包括私有静态数据成员)
    • 局部类/union 类不可定义静态数据成员, 局部类/union 类可以定义静态函数成员

    友元函数

    • 定义友元函数(使用 friend 修饰函数声明)时: 友元函数不是此处的函数成员, 可随意指定 返回类型与访问控制权限

    单继承 BP

    • 只可恢复至基类原权限, 不可随意修改基类成员权限
    • 子类对象地址可以赋值给父类指针, 子类指针可以直接赋值给父类指针
    • 父类对象地址不可以赋值给子类指针, 父类指针即使强制类型转换后也不可以赋值给子类指针

    构造与析构

    • 构造函数体前: 初始化只读成员、引用成员、对象成员、其他数据成员, 初始化顺序以定义顺序为准, 无关构造函数体前出现顺序
    • 构造函数体内: 再次赋值其他数据成员(不可再次只读成员、引用成员、对象成员)
    • 当定义了含参构造函数后, 编译器将不会再为对象自动添加无参构造函数
    • 默认无参构造函数不会初始化只读/引用成员, 且只会调用对象成员的无参构造函数(若对象成员没有无参构造函数,则编译器报错)

    虚函数 BP

    • virtual 关键字只能在 struct/class 体内使用, 在体外实现相应函数成员时, 应去掉 virtual 关键字
    • 当在函数成员中调用虚函数时, 会根据 this 所指真实对象动态调用虚函数(如在父类函数成员中调用虚函数, 可能实际调用的是子类的虚函数)
    • 使用基类指针/基类引用指向派生类时, 只可按基类访问控制权限调用基类拥有的方法
    • 不可以new 抽象类(堆实例)/构造抽象类的栈实例, 函数参数/返回值不可直接定义为抽象类(调用时无法构造栈实例), 但可以定义为抽象类的引用/指针

    Error BP

    • class 体内声明为 friend/static/virtual 方法, class 体外实现时不加 friend/static/virtual 关键字
    • const/static 使用错误
    static int x;\nA(x++, y++); // 若 A 中改变x, 会使得 x++ 无效化\n
    1
    2
    • 不可以new 抽象类(堆实例)/构造抽象类的栈实例, 函数参数/返回值不可直接定义为抽象类(调用时无法构造栈实例), 但可以定义为抽象类的引用/指针
    • 返回类型不匹配错误
    • 初始化构造函数不存在(基类定义有参构造函数, 派生类必须显示调用父类构造函数)错误
    • 引用/const/对象成员初始化错误
    • 访问控制权限错误(e.g 在全局声明一个只有私有构造函数的类实例)
    • 派生控制权限错误(只可恢复原先权限, 不可任意修改父类成员权限)
    • 运算符重载分类错误(不可重载, 只可重载为...)
    • 成员指针与普通指针(静态成员指针)的混用错误
    • 单参数构造函数与强制类型转换重载函数在表达式中的隐式调用错误
    • 指针不可指向引用等引用类型的特性错误
      • 引用变量不分配存储单元: 不能引用 引用变量, 不能作为指针所指对象, 不能作为数组元素
      • 引用变量的值按字节(指针/地址)编码: 不能引用位段(无法按字节编码)
      • 引用变量不能引用引用变量, 只能引用另一个引用变量所引用的变量/地址
      • 引用变量可以引用 register 变量, 编译器会将其自动转为 auto 变量(为其分配地址)

    Inherits Output

    • 每一行输出都为新的派生树(拥有独立的虚基类)
    • 每个对象成员都为新的派生树(拥有独立的虚基类)
    ',256);e.render=function(a,p,e,o,l,c){return n(),s("div",null,[t])};export default e;export{p as __pageData}; diff --git a/assets/language_cpp_cppBasicNotes.md.212edeb8.lean.js b/assets/language_cpp_cppBasicNotes.md.212edeb8.lean.js new file mode 100644 index 00000000000..d4fa5862fa5 --- /dev/null +++ b/assets/language_cpp_cppBasicNotes.md.212edeb8.lean.js @@ -0,0 +1 @@ +import{o as n,c as s,a}from"./app.6dd2a1b7.js";const p='{"title":"C++ Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Basic Workflow","slug":"basic-workflow"},{"level":3,"title":"初始化与回收","slug":"初始化与回收"},{"level":2,"title":"变量","slug":"变量"},{"level":3,"title":"指针","slug":"指针"},{"level":3,"title":"reference (引用类型)","slug":"reference-引用类型"},{"level":3,"title":"volatile 类型","slug":"volatile-类型"},{"level":2,"title":"运算符","slug":"运算符"},{"level":3,"title":"左/右值运算符(运算结果为左/右值)","slug":"左-右值运算符-运算结果为左-右值"},{"level":3,"title":"sizeof","slug":"sizeof"},{"level":2,"title":"Expression (表达式)","slug":"expression-表达式"},{"level":3,"title":"左/右值表达式","slug":"左-右值表达式"},{"level":2,"title":"联合(union)","slug":"联合-union"},{"level":3,"title":"位段","slug":"位段"},{"level":2,"title":"函数","slug":"函数"},{"level":3,"title":"Default Params","slug":"default-params"},{"level":3,"title":"内联函数(inline)","slug":"内联函数-inline"},{"level":2,"title":"类","slug":"类"},{"level":3,"title":"访问控制权限","slug":"访问控制权限"},{"level":3,"title":"构造函数","slug":"构造函数"},{"level":3,"title":"析构函数","slug":"析构函数"},{"level":3,"title":"构造与析构(重点)(P148)","slug":"构造与析构-重点-p148"},{"level":3,"title":"New and Delete","slug":"new-and-delete"},{"level":3,"title":"This Pointer","slug":"this-pointer"},{"level":3,"title":"成员指针 与 指针成员","slug":"成员指针-与-指针成员"},{"level":3,"title":"函数成员","slug":"函数成员"},{"level":3,"title":"静态成员","slug":"静态成员"},{"level":3,"title":"友元","slug":"友元"},{"level":3,"title":"单继承","slug":"单继承"},{"level":3,"title":"虚函数","slug":"虚函数"},{"level":2,"title":"作用域(Scope)","slug":"作用域-scope"},{"level":3,"title":"面向过程的作用域","slug":"面向过程的作用域"},{"level":3,"title":"面向对象的作用域","slug":"面向对象的作用域"},{"level":2,"title":"运算符重载","slug":"运算符重载"},{"level":3,"title":"重载原则","slug":"重载原则"},{"level":3,"title":"自增/减运算符","slug":"自增-减运算符"},{"level":3,"title":"成员运算符","slug":"成员运算符"},{"level":3,"title":"赋值运算符","slug":"赋值运算符"},{"level":3,"title":"强制类型转换","slug":"强制类型转换"},{"level":2,"title":"模板","slug":"模板"},{"level":3,"title":"模板调用形式","slug":"模板调用形式"},{"level":2,"title":"异常","slug":"异常"},{"level":3,"title":"异常对象的析构","slug":"异常对象的析构"},{"level":2,"title":"多态","slug":"多态"},{"level":2,"title":"STL","slug":"stl"},{"level":3,"title":"String","slug":"string"},{"level":3,"title":"Input Output","slug":"input-output"},{"level":3,"title":"Container","slug":"container"},{"level":3,"title":"Heap Algorithm","slug":"heap-algorithm"},{"level":3,"title":"Sorting Algorithms","slug":"sorting-algorithms"},{"level":3,"title":"Partitioning Algorithms","slug":"partitioning-algorithms"},{"level":3,"title":"Permutation Algorithms","slug":"permutation-algorithms"},{"level":3,"title":"Numeric Algorithms","slug":"numeric-algorithms"},{"level":3,"title":"Query Algorithms","slug":"query-algorithms"},{"level":3,"title":"Search Algorithms","slug":"search-algorithms"},{"level":3,"title":"Set Algorithms","slug":"set-algorithms"},{"level":3,"title":"Mover Algorithms","slug":"mover-algorithms"},{"level":3,"title":"Value Algorithms","slug":"value-algorithms"},{"level":3,"title":"Functional Algorithms","slug":"functional-algorithms"},{"level":2,"title":"Awesome Tips and Best Practice","slug":"awesome-tips-and-best-practice"},{"level":3,"title":"静态成员 BP","slug":"静态成员-bp"},{"level":3,"title":"友元函数","slug":"友元函数"},{"level":3,"title":"单继承 BP","slug":"单继承-bp"},{"level":3,"title":"虚函数 BP","slug":"虚函数-bp"},{"level":3,"title":"Error BP","slug":"error-bp"},{"level":3,"title":"Inherits Output","slug":"inherits-output"}],"relativePath":"language/cpp/cppBasicNotes.md","lastUpdated":1627196319000}',e={},t=a('',256);e.render=function(a,p,e,o,l,c){return n(),s("div",null,[t])};export default e;export{p as __pageData}; diff --git a/assets/language_go_goBasicNotes.md.38086837.js b/assets/language_go_goBasicNotes.md.38086837.js new file mode 100644 index 00000000000..610fa8e8202 --- /dev/null +++ b/assets/language_go_goBasicNotes.md.38086837.js @@ -0,0 +1 @@ +import{o as n,c as s,a}from"./app.6dd2a1b7.js";const p='{"title":"Go Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"CLI","slug":"cli"},{"level":3,"title":"Installation","slug":"installation"},{"level":3,"title":"Basic Command","slug":"basic-command"},{"level":2,"title":"Packages","slug":"packages"},{"level":3,"title":"package and import","slug":"package-and-import"},{"level":2,"title":"Variable","slug":"variable"},{"level":3,"title":"Type Declaration","slug":"type-declaration"},{"level":3,"title":"Type conversions","slug":"type-conversions"},{"level":3,"title":"struct","slug":"struct"},{"level":3,"title":"array","slug":"array"},{"level":3,"title":"slice","slug":"slice"},{"level":3,"title":"map","slug":"map"},{"level":2,"title":"Flow Control","slug":"flow-control"},{"level":3,"title":"if","slug":"if"},{"level":3,"title":"for","slug":"for"},{"level":3,"title":"switch","slug":"switch"},{"level":3,"title":"defer","slug":"defer"},{"level":2,"title":"Function","slug":"function"},{"level":3,"title":"Parameters and Return Value","slug":"parameters-and-return-value"},{"level":3,"title":"Methods","slug":"methods"},{"level":3,"title":"Interface","slug":"interface"},{"level":2,"title":"Concurrent","slug":"concurrent"},{"level":3,"title":"goroutine","slug":"goroutine"},{"level":3,"title":"channels","slug":"channels"}],"relativePath":"language/go/goBasicNotes.md","lastUpdated":1627196319000}',t={},e=a('

    Go Basic Notes

    CLI

    Installation

    sudo apt install golang\necho "export GOPATH=$HOME/gopath"\necho "export PATH=$PATH:$GOPATH/bin"\ngo env\n
    1
    2
    3
    4

    Basic Command

    go version\ngo run main.go\ngo fmt /path/to/test\n
    1
    2
    3
    • go 的大部分工具的作用基本单位为 package(directories)

    Build

    # generate library\ngo build path/to/libpack\ngo install path/to/libpack\n\n# generate binary\ngo install path/to/mainpack\n
    1
    2
    3
    4
    5
    6

    Test

    # path/to/pack/demo.go\n# path/to/pack/demo_test.go\ngo test path/to/pack\n
    1
    2
    3

    Clean

    go clean -i path/to/pack\n
    1

    Modules

    • remote packages
    • $GOPATH/bin/hello
    go get github.com/golang/example/hello\n
    1

    Packages

    package and import

    • for path/to/pack:
    package pack\n
    1
    import (\n    "path/to/pack"\n)\n
    1
    2
    3
    • 只有首字母大写的函数才可被成功导出, 首字母小写的函数为文件私有函数

    Variable

    Type Declaration

    • Go 将类型置于变量名后的理由: reads clearly, from left to right
    • := 不可用在函数外
    // 简写类型/赋值\nvar i,j int = 1, 2\n\n// 省略类型\nvar c, python, java = true, false, "no!"\n\n// 省略 var 关键字\njavascript, ruby, cpp:= true, false, "no!"\n\n// 声明块\nimport (\n    "math/cmplx"\n)\n\nvar (\n    ToBe   bool       = false\n    MaxInt uint64     = 1<<64 - 1\n    z      complex128 = cmplx.Sqrt(-5 + 12i)\n)\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    Type conversions

    var x int = 3\nvar y uint = uint(x)\nz := uint(x)\n
    1
    2
    3

    struct

    type Vertex struct {\n    X int\n    Y int\n}\n\nvar (\n    v1 = Vertex{1, 2}\n    v2 = Vertex{X: 1}   // Y: 0\n    v3 = Vertex{}       // X: 0, Y: 0\n    vp = &Vertex{1, 2}  // *Vertex\n)\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    array

    数组的长度是其类型的一部分

    var a [2]string\na[0] = "Hello"\na[1] = "Golang"\n\nfmt.Println(a[0], a[1])\nfmt.Println(a)\n
    1
    2
    3
    4
    5
    6

    slice

    • s[lo:lo] == nil
    p := []int{2, 3, 5, 7, 11, 13}\n\nfmt.Println("p[1:4] ==", p[1:4])\nfmt.Println("p[:3] ==", p[:3])  // p[0:3]        => 0, 1, 2\nfmt.Println("p[4:]" ==, p[4:])  // p[4:len(p)-1] => 4, ..., len(p)-2\n
    1
    2
    3
    4
    5
    • make 函数创建 slice
    a := make([]int, 5)     // len(a) = 5\nb := make([]int, 0, 5)  // len(b) = 0, cap(b) = 5\nb = b[:cap(5)]          // len(b) = 5, cap(b) = 5\n
    1
    2
    3
    • len && cap
    // just shorten/extend, not drop elements\n// change len(p), keep cap(p)\np = p [:0]\np = p[:4]\n\n// drop its elements\n// change len(p) and cap(p)\np = p[2:]\n
    1
    2
    3
    4
    5
    6
    7
    8
    • append
    append(s, 2, 3, 4)\n
    1
    • range(iterator): 返回 2 个值(index int, element copy(s[index]) T), 在每一次迭代 index+=1
    pow := []int{1, 2, 4, 8, 16, 32, 64, 128}\n\nfunc main() {\n    for i := range pow {\n        fmt.Printf("index == %d\\n", i)\n    }\n\n    for _, v := range pow {\n        fmt.Printf("value == %d\\n", v)\n    }\n\n    for i, v := range pow {\n        fmt.Printf("2**%d = %d\\n", i, v)\n    }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    map

    type Vertex struct {\n    Lat, Long float64\n}\n\nvar m map[string]Vertex = make(map[string]Vertex)\nm["Bell Labs"] = Vertex{\n    40.68433, -74.39967\n}\n\nml := map[string]Vertex{\n    "Bell Labs": Vertex{\n        40.68433, -74.39967,\n    },\n    "Google": {37.42202, -122.08408},\n}\n\ndelete(m, "Bell Labs")\n\nelement, ok_flag := m["Google"]\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    Flow Control

    if

    if x < 0 {\n    return true\n}\n\n// scope of v: only in if/else statement\nif v := math.Pow(x, n); v < lim {\n    return v\n} else {\n    fmt.Printf("%g >= %g\\n", v, lim)\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    for

    for sum < 1000 {\n    sum += sum\n}\n\n// scope of i: only in for statement\nfor i := 0; i < 10; i++ {\n    sum += i\n}\n
    1
    2
    3
    4
    5
    6
    7
    8

    switch

    • switch 中的 case 自动 break(除非使用 fallthrough 语句)
    switch time.Saturday {\n    case today+0:\n        fmt.Println("Today.")\n    case today+1:\n        fmt.Println("Tomorrow.")\n    case today+2:\n        fmt.Println("In two days.")\n    default:\n        fmt.Println("Too far away.")\n}\n\n// scope of os: only in switch statement\nswitch os := runtime.GOOS; os {\n    case "darwin":\n        fmt.Println("OS X.")\n    case "linux":\n        fmt.Println("Linux.")\n    default:\n        fmt.Printf("%s", os)\n}\n\n// alias for if-else long chain\nswitch {    // switch true\n    case t.Hour() < 12:\n        fmt.Println("Good morning!")\n    case t.Hour() < 17:\n        fmt.Println("Good afternoon!")\n    default:\n        fmt.Println("Good evening!")\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30

    defer

    defer 语句会将函数执行延迟至上层函数返回处(函数参数会立刻生成):

    执行时机

    函数设置返回值后, 即将返回调用函数前(若 defer 函数修改返回变量, 则会造成返回值与预期不一致)

    func main() {\n    defer fmt.Println("!")\n    defer fmt.Println("world")\n    fmt.Println("hello")\n}\n\n=>\n\nfunc main() {\n    fmt.Println("hello")\n    fmt.Println("world")\n    fmt.Println("!")\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    实质

    return_value = xxx -> invoke defer functions(stack) -> return void

    func f() (result int) {\n    defer func() {\n        result++\n    }()\n\n    return 0\n}\n\n=>\n\nfunc f() (result int) {\n    result = 0\n\n    func() {\n        result++\n    }()\n\n    return\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    应用场景

    • 资源回收
    mu.Lock()\ndefer mu.Unlock()\n
    1
    2
    • panic 异常的捕获
    func f() {\n    defer func() {\n        if r:= recover(); r!= nil {\n            fmt.Println("Recovered in f", r)\n        }\n    }()\n\n    fmt.Println("Calling g.")\n    g()\n    fmt.Println("Returned normally from g.")\n}\n\nfunc g() {\n    panic("ERROR")\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    • 保证语句(在发生异常的情况下)始终会被执行
    • 有意修改返回值

    Function

    Parameters and Return Value

    • 简写参数类型
    • 多值返回函数
    • 命名返回值(注释文档)
    func swap(x, y string) (string, string) {\n    return y, x\n}\n\nfunc swap_(x, y string) (x_, y_ string) {\n    x_, y_ = y, x\n    return\n}\n\nfunc main() {\n    a, b := swap("hello", "golang")\n    a_, b_ := swap_("hello", "golang")\n    fmt.Println(a, b)\n    fmt.Println(a_, b_)\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    Methods

    • Go 中没有 class, 但可以在 struct/同一个包内的 type 上(receiver)定义方法
    type Vertex struct {\n    X, Y float64\n}\n\nfunc (v *Vertex) Abs() float64 {\n    return math.Sqrt(v.X*v.X + v.Y*v.Y)\n}\n\nfunc main() {\n    v := &Vertex{3, 4}\n    fmt.Println(v.Abs())\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    type MyFloat float64\n\nfunc (f MyFloat) Abs() float64 {\n    if f < 0 {\n        return float64(-f)\n    } else {\n        return float64(f)\n    }\n}\n\nfunc main() {\n    f := MyFloat(-math.Sqrt2)\n    fmt.Println(f.Abs())\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    Receiver

    • pointer receiver: 可以改变原值(call by reference)
    • value receive: 不可以改变原值(call by value)
    • 调用 methods 时, 可以不考虑 v 是 value/pointer, go 会自动处理
    func (v *Vertex) changeV() {\n    v.X += 1\n    v.Y += 1\n}\n\nv.changeV() => (&v).changeV()\n
    1
    2
    3
    4
    5
    6
    func (v Vertex) Abs() {\n    return abs(v)\n}\n\n(&v).Abs() => v.Abs()\n
    1
    2
    3
    4
    5
    • Best Practice: 在同一个类型上定义的所有方法最好统一 receiver 类型(全部 value receivers 或 全部 pointer receivers)

    Interface

    (value, type)

    var i I\nvar t *T\ni = t   // => (nil, *T)\n
    1
    2
    3
    var i I     // => (nil, nil)\n
    1

    Type Assertions

    • 单返回值: 断言失败时产生 panic
    • 双返回值: 断言失败时不产生 panic
    // create empty interface, ("hello", string)\nvar i interface{} = "hello"\n\ns := i.(string)\ns, ok := i.(string) // => true\nf, ok := i.(float64)// => false(no panic)\nf := i.(float64)    // => false with panic\n
    1
    2
    3
    4
    5
    6
    7
    • type switches
    switch v := i.(type) {\n    case int;\n        fmt.Println("Int.")\n    case string:\n        fmt.Println("String.")\n    default:\n        fmt.Printf("Other type.")\n}\n
    1
    2
    3
    4
    5
    6
    7
    8

    Concurrent

    goroutine

    go f(x, y, z)   // => execute in a new goroutine with share memory\n
    1

    channels

    • typed conduit(类型管道)
    • block execution
    var c chan int = make(chan int)\n\nc <- sum    // send sum to channel c\nv := <-c    // receive from channel c, assign value to v\n
    1
    2
    3
    4
    func sum(s []int, c chan int) {\n    sum := 0\n\n    for _, v := range s {\n        sum += v\n    }\n\n    c <- sum\n}\n\nfunc main() {\n    s := []int{7, 2, 8, -9, 4, 0}\n\n    c := make(chan int)\n\n    go sum(s[:len(s)/2], c)\n    go sum(s[len(s/2):], c)\n\n    x, y = <-c, <-c\n\n    fmt.Println(x, y, x+y)\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22

    select

    • select(当所有情况都不满足时)可被阻塞
    for {\n    select {\n        case c <- x:\n            x, y = y, x+y\n        case <- quit:\n            fmt.Println("quit")\n            return\n    }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9

    Worker Pools

    package main\n\nimport "fmt"\nimport "time"\n\nfunc worker(id int, jobs <-chan int, results chan<- int) {\n    for j := range jobs {\n        fmt.Println("worker", id, "processing job", j)\n        time.Sleep(time.Second)\n        results <- j * 2\n    }\n}\n\nfunc main() {\n    jobs := make(chan int, 100)\n    results := make(chan int, 100)\n\n    for w := 1; w <= 3; w++ {\n        go worker(w, jobs, results)\n    }\n\n    for j := 1; j <= 9; j++ {\n        jobs <- j\n    }\n\n    close(jobs)\n\n    for a := 1; a <= 9; a++ {\n        <-results\n    }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    ',104);t.render=function(a,p,t,o,c,l){return n(),s("div",null,[e])};export default t;export{p as __pageData}; diff --git a/assets/language_go_goBasicNotes.md.38086837.lean.js b/assets/language_go_goBasicNotes.md.38086837.lean.js new file mode 100644 index 00000000000..04a2dc163bb --- /dev/null +++ b/assets/language_go_goBasicNotes.md.38086837.lean.js @@ -0,0 +1 @@ +import{o as n,c as s,a}from"./app.6dd2a1b7.js";const p='{"title":"Go Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"CLI","slug":"cli"},{"level":3,"title":"Installation","slug":"installation"},{"level":3,"title":"Basic Command","slug":"basic-command"},{"level":2,"title":"Packages","slug":"packages"},{"level":3,"title":"package and import","slug":"package-and-import"},{"level":2,"title":"Variable","slug":"variable"},{"level":3,"title":"Type Declaration","slug":"type-declaration"},{"level":3,"title":"Type conversions","slug":"type-conversions"},{"level":3,"title":"struct","slug":"struct"},{"level":3,"title":"array","slug":"array"},{"level":3,"title":"slice","slug":"slice"},{"level":3,"title":"map","slug":"map"},{"level":2,"title":"Flow Control","slug":"flow-control"},{"level":3,"title":"if","slug":"if"},{"level":3,"title":"for","slug":"for"},{"level":3,"title":"switch","slug":"switch"},{"level":3,"title":"defer","slug":"defer"},{"level":2,"title":"Function","slug":"function"},{"level":3,"title":"Parameters and Return Value","slug":"parameters-and-return-value"},{"level":3,"title":"Methods","slug":"methods"},{"level":3,"title":"Interface","slug":"interface"},{"level":2,"title":"Concurrent","slug":"concurrent"},{"level":3,"title":"goroutine","slug":"goroutine"},{"level":3,"title":"channels","slug":"channels"}],"relativePath":"language/go/goBasicNotes.md","lastUpdated":1627196319000}',t={},e=a('',104);t.render=function(a,p,t,o,c,l){return n(),s("div",null,[e])};export default t;export{p as __pageData}; diff --git a/assets/language_haskell_haskellBasicNotes.md.998a4d73.js b/assets/language_haskell_haskellBasicNotes.md.998a4d73.js new file mode 100644 index 00000000000..a8dc6b533e6 --- /dev/null +++ b/assets/language_haskell_haskellBasicNotes.md.998a4d73.js @@ -0,0 +1 @@ +import{o as n,c as s,b as a,d as e}from"./app.6dd2a1b7.js";const t='{"title":"Haskell Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Platform","slug":"platform"},{"level":3,"title":"ghci","slug":"ghci"},{"level":3,"title":"ghc","slug":"ghc"},{"level":2,"title":"Unique Mark","slug":"unique-mark"},{"level":2,"title":"Expression","slug":"expression"},{"level":2,"title":"Type","slug":"type"},{"level":3,"title":"基本类型","slug":"基本类型"},{"level":3,"title":"List","slug":"list"},{"level":3,"title":"Tuple(原组)","slug":"tuple-原组"},{"level":3,"title":"泛型","slug":"泛型"},{"level":3,"title":"函数类型","slug":"函数类型"},{"level":2,"title":"基本语法","slug":"基本语法"},{"level":3,"title":"名字/函数定义","slug":"名字-函数定义"},{"level":2,"title":"Type Class","slug":"type-class"},{"level":3,"title":"=> 符号","slug":"符号"},{"level":3,"title":"Basic Type Class","slug":"basic-type-class"},{"level":3,"title":"Custom Type Class","slug":"custom-type-class"},{"level":3,"title":"data type","slug":"data-type"},{"level":2,"title":"函数","slug":"函数"},{"level":3,"title":"递归函数","slug":"递归函数"},{"level":3,"title":"高阶函数","slug":"高阶函数"},{"level":3,"title":"常用函数","slug":"常用函数"},{"level":2,"title":"模块","slug":"模块"},{"level":3,"title":"import","slug":"import"},{"level":3,"title":"建立模块","slug":"建立模块"},{"level":3,"title":"常用基础模块","slug":"常用基础模块"},{"level":2,"title":"输入与输出","slug":"输入与输出"},{"level":3,"title":"IO action","slug":"io-action"},{"level":3,"title":"Command Line","slug":"command-line"},{"level":3,"title":"ByteString","slug":"bytestring"},{"level":3,"title":"常用输入输出函数","slug":"常用输入输出函数"},{"level":2,"title":"异常","slug":"异常"},{"level":3,"title":"catch","slug":"catch"},{"level":2,"title":"Advanced Monad","slug":"advanced-monad"},{"level":3,"title":"Writer Monad","slug":"writer-monad"},{"level":3,"title":"Reader Monad","slug":"reader-monad"},{"level":3,"title":"State Monad","slug":"state-monad"},{"level":3,"title":"Error Monad","slug":"error-monad"},{"level":3,"title":"Self-Defined Monad","slug":"self-defined-monad"},{"level":2,"title":"注释","slug":"注释"},{"level":3,"title":"符号","slug":"符号-1"},{"level":2,"title":"Reference","slug":"reference"}],"relativePath":"language/haskell/haskellBasicNotes.md","lastUpdated":1627196319000}',l={},o=a("h1",{id:"haskell-basic-notes"},[a("a",{class:"header-anchor",href:"#haskell-basic-notes","aria-hidden":"true"},"#"),e(" Haskell Basic Notes")],-1),p=a("p",null,[a("div",{class:"table-of-contents"},[a("ul",null,[a("li",null,[a("a",{href:"#haskell-basic-notes"},"Haskell Basic Notes"),a("ul",null,[a("li",null,[a("a",{href:"#platform"},"Platform")]),a("li",null,[a("a",{href:"#unique-mark"},"Unique Mark")]),a("li",null,[a("a",{href:"#expression"},"Expression")]),a("li",null,[a("a",{href:"#type"},"Type")]),a("li",null,[a("a",{href:"#基本语法"},"基本语法")]),a("li",null,[a("a",{href:"#type-class"},"Type Class")]),a("li",null,[a("a",{href:"#函数"},"函数")]),a("li",null,[a("a",{href:"#模块"},"模块")]),a("li",null,[a("a",{href:"#输入与输出"},"输入与输出")]),a("li",null,[a("a",{href:"#异常"},"异常")]),a("li",null,[a("a",{href:"#advanced-monad"},"Advanced Monad")]),a("li",null,[a("a",{href:"#注释"},"注释")]),a("li",null,[a("a",{href:"#reference"},"Reference")])])])])])],-1),c=a("h2",{id:"platform"},[a("a",{class:"header-anchor",href:"#platform","aria-hidden":"true"},"#"),e(" Platform")],-1),r=a("div",{class:"language-bash line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token function"},"apt-get"),e(),a("span",{class:"token function"},"install"),e(" haskell-Platform\n"),a("span",{class:"token function"},"apt-get"),e(),a("span",{class:"token function"},"install"),e(" ghc-mod\natom plugins "),a("span",{class:"token builtin class-name"},":"),e(" language-haskell autocomplete-haskell ide-haskell haskell-ghc-mod\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),u=a("h3",{id:"ghci"},[a("a",{class:"header-anchor",href:"#ghci","aria-hidden":"true"},"#"),e(" ghci")],-1),i=a("ul",null,[a("li",null,":l - load file"),a("li",null,":r - reload file"),a("li",null,":cd"),a("li",null,":edit - $EDITOR"),a("li",null,":m - module"),a("li",null,":q - quit"),a("li",null,":?"),a("li",null,":k - kind"),a("li",null,":t - type function"),a("li",null,":info - data/TypeClass")],-1),k=a("h3",{id:"ghc"},[a("a",{class:"header-anchor",href:"#ghc","aria-hidden":"true"},"#"),e(" ghc")],-1),b=a("div",{class:"language-bash line-numbers-mode"},[a("pre",null,[a("code",null,"runghc *.hs/*.lhs\n")]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),m=a("h2",{id:"unique-mark"},[a("a",{class:"header-anchor",href:"#unique-mark","aria-hidden":"true"},"#"),e(" Unique Mark")],-1),h=a("p",null,[a("code",null,":+")],-1),d=a("p",null,"复数符 - 2 :+ 3 -> 2+3i",-1),v=a("p",null,[a("code",null,"_")],-1),g=a("p",null,"泛匹配符: 表示不关心此部分具体内容",-1),y=a("p",null,[a("code",null,"<-")],-1),f=a("p",null,"属于符号,用于 ListRange 中.",-1),w=a("p",null,[a("code",null,"=>")],-1),x=a("p",null,"类型约束分隔符",-1),S=a("p",null,[a("code",null,"->")],-1),L=a("h2",{id:"expression"},[a("a",{class:"header-anchor",href:"#expression","aria-hidden":"true"},"#"),e(" Expression")],-1),M=a("p",null,"if 语句也是表达式",-1),F=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"doubleSmallNumber"),e("' "),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},">"),e(),a("span",{class:"token number"},"100"),e(),a("span",{class:"token keyword"},"then"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},"*"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token number"},"1"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),T=a("h2",{id:"type"},[a("a",{class:"header-anchor",href:"#type","aria-hidden":"true"},"#"),e(" Type")],-1),I=a("h3",{id:"基本类型"},[a("a",{class:"header-anchor",href:"#基本类型","aria-hidden":"true"},"#"),e(" 基本类型")],-1),A=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token char string"},"'a'"),e("\n"),a("span",{class:"token char string"},"'a'"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Char"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token constant"},"True"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Bool"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token string"},'"HELLO!"'),e("\n"),a("span",{class:"token string"},'"HELLO!"'),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"Char"),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"True"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token char string"},"'a'"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"True"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token char string"},"'a'"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Bool"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Char"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),C=a("h4",{id:"int"},[a("a",{class:"header-anchor",href:"#int","aria-hidden":"true"},"#"),e(" Int")],-1),O=a("p",null,"有限整数",-1),N=a("h4",{id:"integer"},[a("a",{class:"header-anchor",href:"#integer","aria-hidden":"true"},"#"),e(" Integer")],-1),B=a("p",null,"无限整数(效率低)",-1),W=a("h4",{id:"float"},[a("a",{class:"header-anchor",href:"#float","aria-hidden":"true"},"#"),e(" Float")],-1),E=a("p",null,"单精度浮点数",-1),$=a("h4",{id:"double"},[a("a",{class:"header-anchor",href:"#double","aria-hidden":"true"},"#"),e(" Double")],-1),P=a("p",null,"双精度浮点数",-1),q=a("h4",{id:"bool"},[a("a",{class:"header-anchor",href:"#bool","aria-hidden":"true"},"#"),e(" Bool")],-1),R=a("p",null,"True/False",-1),z=a("h4",{id:"char"},[a("a",{class:"header-anchor",href:"#char","aria-hidden":"true"},"#"),e(" Char")],-1),D=a("h4",{id:"string"},[a("a",{class:"header-anchor",href:"#string","aria-hidden":"true"},"#"),e(" String")],-1),J=a("h4",{id:"ordering"},[a("a",{class:"header-anchor",href:"#ordering","aria-hidden":"true"},"#"),e(" Ordering")],-1),G=a("p",null,"LT,GT,EQ",-1),_=a("h4",{id:"word"},[a("a",{class:"header-anchor",href:"#word","aria-hidden":"true"},"#"),e(" Word")],-1),H=a("p",null,"Data.Word - unsigned int",-1),K=a("h4",{id:"rational"},[a("a",{class:"header-anchor",href:"#rational","aria-hidden":"true"},"#"),e(" Rational")],-1),Y=a("p",null,"有理数类型,用于高精度数学运算",-1),V=a("h3",{id:"list"},[a("a",{class:"header-anchor",href:"#list","aria-hidden":"true"},"#"),e(" List")],-1),U=a("h4",{id:"operator"},[a("a",{class:"header-anchor",href:"#operator","aria-hidden":"true"},"#"),e(" Operator")],-1),Z=a("ul",null,[a("li",null,"++"),a("li",null,":"),a("li",null,"!!"),a("li",null,">/"),e(),a("span",{class:"token builtin"},"null"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"False"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"null"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"True"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),en=a("ul",null,[a("li",null,"reverse List 反转"),a("li",null,"take num List 返回 List 前 num 个元素组成的 List")],-1),tn=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"take"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"take"),e(),a("span",{class:"token number"},"5"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"take"),e(),a("span",{class:"token number"},"0"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),ln=a("ul",null,[a("li",null,"drop num List 删除 List 前 num 个元素")],-1),on=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"drop"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"drop"),e(),a("span",{class:"token number"},"0"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"drop"),e(),a("span",{class:"token number"},"100"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),pn=a("ul",null,[a("li",null,[a("p",null,"maximum List 返回最大元素")]),a("li",null,[a("p",null,"minimum List 返回最小元素")]),a("li",null,[a("p",null,"sum List 返回 List 元素和")]),a("li",null,[a("p",null,"product List 返回 List 元素积")]),a("li",null,[a("p",null,[e("elem "),a("code",null,"elem"),e(" List 判断元素存在性")])])],-1),cn=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token number"},"4"),e(" `"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token number"},"10"),e(" `"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"False"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),rn=a("ul",null,[a("li",null,[e("cycle List 返回循环无限数组("),a("em",null,"Haskell 惰性特性"),e(")")]),a("li",null,[e("repeat Elem 返回循环无限数组("),a("em",null,"Haskell 惰性特性"),e(")")]),a("li",null,"replicate num Elem 返回循环无限数组")],-1),un=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"take"),e(),a("span",{class:"token number"},"10"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"cycle"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"take"),e(),a("span",{class:"token number"},"10"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"repeat"),e(),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},")"),e(" "),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"replicate"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token number"},"10"),e(" "),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),kn=a("ul",null,[a("li",null,[e("takeWhile :: (a -> Bool) -> "),a("code",null,"[a]"),e(" -> "),a("code",null,"[a]"),e(" 遇到不符合限制条件的元素便停止遍历 List")])],-1),bn=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"sum"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"takeWhile"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"<"),a("span",{class:"token number"},"10000"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token builtin"},"odd"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"^"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token number"},"166650"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),mn=a("h4",{id:"range"},[a("a",{class:"header-anchor",href:"#range","aria-hidden":"true"},"#"),e(" Range")],-1),hn=a("p",null,"三要素: , 与 ..",-1),dn=a("ul",null,[a("li",null,"上限"),a("li",null,"下限"),a("li",null,[e("步长("),a("em",null,"仅可标明一次"),e(")")])],-1),vn=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[e("上下限"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"20"),a("span",{class:"token punctuation"},"]"),e("\n步长为"),a("span",{class:"token number"},"2"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"20"),a("span",{class:"token punctuation"},"]"),e("\n步长为"),a("span",{class:"token number"},"13"),e("无限"),a("span",{class:"token constant"},"List"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"13"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"26"),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"take"),e(),a("span",{class:"token number"},"24"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"13"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"26"),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},"]"),e("\n\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),gn=a("h4",{id:"list-comprehension-数学定义"},[a("a",{class:"header-anchor",href:"#list-comprehension-数学定义","aria-hidden":"true"},"#"),e(" List Comprehension(数学定义)")],-1),yn=a("p",null,"由类似集合定义的离散数学定义,来定义复杂的 List:",-1),fn=a("p",null,[a("code",null,"[expression | filter]")],-1),wn=a("p",null,[a("code",null,"[expression | x <\\- Range, Predicate(断言/限制条件)]")],-1),xn=a("ul",null,[a("li",null,[e("Range: "),a("code",null,","),e("分隔多个 Range(一般为 List)")]),a("li",null,[e("Predicate: "),a("code",null,","),e("分隔多个断言;每个断言均为 Boolean 表达式")])],-1),Sn=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},"*"),a("span",{class:"token number"},"2"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},"*"),a("span",{class:"token number"},"2"),e(),a("span",{class:"token operator"},">="),e(),a("span",{class:"token number"},"12"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"12"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"14"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"16"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"18"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"20"),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"50"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"x"),e(" `"),a("span",{class:"token builtin"},"mod"),e("` "),a("span",{class:"token number"},"7"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"52"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"59"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"66"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"73"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"80"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"87"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"94"),a("span",{class:"token punctuation"},"]"),e("\n\n\n"),a("span",{class:"token hvariable"},"boomBangs"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),e(),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"<"),e(),a("span",{class:"token number"},"10"),e(),a("span",{class:"token keyword"},"then"),e(),a("span",{class:"token string"},'"BOOM!"'),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token string"},'"BANG!"'),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token builtin"},"odd"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"boomBangs"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"13"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"BOOM!"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"BOOM!"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"BANG!"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"BANG!"'),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),Ln=a("ul",null,[a("li",null,"多个 Range")],-1),Mn=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},"*"),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"11"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"16"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"20"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"22"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"40"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"50"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"55"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"80"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"110"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Fn=a("ul",null,[a("li",null,"嵌套 Comprehension")],-1),Tn=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"xxs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),e(),a("span",{class:"token punctuation"},"["),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token builtin"},"even"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"xxs"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),In=a("h3",{id:"tuple-原组"},[a("a",{class:"header-anchor",href:"#tuple-原组","aria-hidden":"true"},"#"),e(" Tuple(原组)")],-1),An=a("h4",{id:"内部差异性"},[a("a",{class:"header-anchor",href:"#内部差异性","aria-hidden":"true"},"#"),e(" 内部差异性")],-1),Cn=a("ul",null,[a("li",null,"同一 Tuple 里可存放不同 Type 的项")],-1),On=a("h4",{id:"外部差异性"},[a("a",{class:"header-anchor",href:"#外部差异性","aria-hidden":"true"},"#"),e(" 外部差异性")],-1),Nn=a("ul",null,[a("li",null,[e("数目不同或某项不同的 Tuple 属于不同 Type "),a("ul",null,[a("li",null,"不可置于同一 List 中"),a("li",null,"不同长度的 Tuple 不可比较(比较符只可用于相同 Type)")])])],-1),Bn=a("h4",{id:"tuple-function"},[a("a",{class:"header-anchor",href:"#tuple-function","aria-hidden":"true"},"#"),e(" Tuple Function")],-1),Wn=a("h5",{id:"二元组"},[a("a",{class:"header-anchor",href:"#二元组","aria-hidden":"true"},"#"),e(" 二元组")],-1),En=a("p",null,"fst/snd tuple 返回首项/尾项",-1),$n=a("p",null,"zip List1 List2 对应项配对,组成二元组 List",-1),Pn=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"zip"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"im"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"a"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"turtle"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"im"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"a"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"turtle"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"zip"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"apple"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token string"},'"orange"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token string"},'"cherry"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token string"},'"mango"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"apple"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"orange"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"cherry"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"mango"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),qn=a("h5",{id:"三元组"},[a("a",{class:"header-anchor",href:"#三元组","aria-hidden":"true"},"#"),e(" 三元组")],-1),Rn=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"first"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"c"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token hvariable"},"first"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"_"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"_"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"x"),e("\n\n"),a("span",{class:"token hvariable"},"second"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"c"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),e("\n"),a("span",{class:"token hvariable"},"second"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"_"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"_"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"y"),e("\n\n"),a("span",{class:"token hvariable"},"third"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"c"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"c"),e("\n"),a("span",{class:"token hvariable"},"third"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"_"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"_"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"z"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"z"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),zn=a("h3",{id:"泛型"},[a("a",{class:"header-anchor",href:"#泛型","aria-hidden":"true"},"#"),e(" 泛型")],-1),Dn=a("p",null,[e("运用 Type 变量(只可为"),a("em",null,"单字符"),e("), 实现泛型参数与多态函数.")],-1),Jn=a("p",null,"借助 TypeClass 可轻松实现多态函数:",-1),Gn=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token builtin"},"head"),e("\n"),a("span",{class:"token builtin"},"head"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n\n"),a("span",{class:"token comment"},"-- a 和 b 可为同类型"),e("\n"),a("span",{class:"token comment"},"-- 第一个参数与返回值必须同类型"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token builtin"},"fst"),e("\n"),a("span",{class:"token builtin"},"fst"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n\n"),a("span",{class:"token comment"},"-- 所有参数必须同类型,且必须为Num成员"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),_n=a("h3",{id:"函数类型"},[a("a",{class:"header-anchor",href:"#函数类型","aria-hidden":"true"},"#"),e(" 函数类型")],-1),Hn=a("ul",null,[a("li",null,"单个参数")],-1),Kn=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"removeNonUppercase"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"Char"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"Char"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"removeNonUppercase"),e(),a("span",{class:"token hvariable"},"st"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),e(),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"st"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"c"),e(" `"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token punctuation"},"["),a("span",{class:"token char string"},"'A'"),a("span",{class:"token operator"},".."),a("span",{class:"token char string"},"'Z'"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Yn=a("ul",null,[a("li",null,"多个参数")],-1),Vn=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"addThree"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Int"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Int"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Int"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Int"),e("\n"),a("span",{class:"token hvariable"},"addThree"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token hvariable"},"z"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"z"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Un=a("h2",{id:"基本语法"},[a("a",{class:"header-anchor",href:"#基本语法","aria-hidden":"true"},"#"),e(" 基本语法")],-1),Zn=a("h3",{id:"名字-函数定义"},[a("a",{class:"header-anchor",href:"#名字-函数定义","aria-hidden":"true"},"#"),e(" 名字/函数定义")],-1),jn=a("h4",{id:"模式匹配-pattern-matching"},[a("a",{class:"header-anchor",href:"#模式匹配-pattern-matching","aria-hidden":"true"},"#"),e(" 模式匹配(Pattern Matching)")],-1),Qn=a("p",null,"当函数拥有多个函数体(模式)时,会从上至下进行匹配各模式,一旦匹配则只应用这一函数体.",-1),Xn=a("h5",{id:"best-practice"},[a("a",{class:"header-anchor",href:"#best-practice","aria-hidden":"true"},"#"),e(" Best Practice")],-1),ns=a("ul",null,[a("li",null,"代替 if-else/switch 语句"),a("li",null,"递归算法(将递归基础作为首模式,递归函数体作为尾模式)"),a("li",null,"List Range 中亦可使用模式匹配")],-1),ss=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"addVectors"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"addVectors"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x1"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"y1"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x2"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"y2"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x1"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"x2"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"y1"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"y2"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),as=a("h5",{id:"常用模式"},[a("a",{class:"header-anchor",href:"#常用模式","aria-hidden":"true"},"#"),e(" 常用模式")],-1),es=a("h6",{id:"as-模式"},[a("a",{class:"header-anchor",href:"#as-模式","aria-hidden":"true"},"#"),e(" as 模式")],-1),ts=a("p",null,"all@(pattern) - all 为指向 pattern 整体的引用",-1),ls=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"all"),a("span",{class:"token operator"},"@"),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"y"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token comment"},"-- 其中all与(x:y:xs)等价"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),os=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"capital"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token hvariable"},"capital"),e(),a("span",{class:"token string"},'""'),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"Empty string, whoops!"'),e("\n"),a("span",{class:"token hvariable"},"capital"),e(),a("span",{class:"token builtin"},"all"),a("span",{class:"token operator"},"@"),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"The first letter of "'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token builtin"},"all"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token string"},'" is "'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),ps=a("h6",{id:"list-模式"},[a("a",{class:"header-anchor",href:"#list-模式","aria-hidden":"true"},"#"),e(" List 模式")],-1),cs=a("ul",null,[a("li",null,"x:xs"),a("li",null,"x:y:z:xs")],-1),rs=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"head"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token builtin"},"head"),e("' "),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"error"),e(),a("span",{class:"token string"},'"Can\'t call head on an empty list, dummy!"'),e("\n"),a("span",{class:"token builtin"},"head"),e("' "),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"_"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"x"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),us=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"length"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),e("\n"),a("span",{class:"token builtin"},"length"),e("' "),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),e("\n"),a("span",{class:"token builtin"},"length"),e("' "),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"_"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token builtin"},"length"),e("' "),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),is=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"sum"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token builtin"},"sum"),e("' "),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),e("\n"),a("span",{class:"token builtin"},"sum"),e("' "),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token builtin"},"sum"),e("' "),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),ks=a("h6",{id:"tuple"},[a("a",{class:"header-anchor",href:"#tuple","aria-hidden":"true"},"#"),e(" Tuple")],-1),bs=a("ul",null,[a("li",null,"(x, y)"),a("li",null,"(x, y, z)")],-1),ms=a("h4",{id:"guard-模式-与-where-绑定"},[a("a",{class:"header-anchor",href:"#guard-模式-与-where-绑定","aria-hidden":"true"},"#"),e(" guard 模式 与 where 绑定")],-1),hs=a("p",null,"子模式匹配: 运用布尔表达式实现判断,应用对应函数体",-1),ds=a("ul",null,[a("li",null,"关键符号: | 与 where"),a("li",null,"| 分隔函数体"),a("li",null,[e("where "),a("ul",null,[a("li",null,"可见性: 定义只对本模式可见的(私有)名字与(私有)函数"),a("li",null,"where 定义在最外层,使得各模式共享(私有)名字与(私有)函数"),a("li",null,[e("名字定义时可使用模式匹配 "),a("code",null,"where (head:_) = firstName")])])])],-1),vs=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"bmiTell"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"RealFloat"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token hvariable"},"bmiTell"),e(),a("span",{class:"token hvariable"},"weight"),e(),a("span",{class:"token hvariable"},"height"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"bmi"),e(),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token hvariable"},"skinny"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"You\'re underweight, you emo, you!"'),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"bmi"),e(),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token hvariable"},"normal"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},"\"You're supposedly normal. Pet, I bet you're ugly!\""),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"bmi"),e(),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token hvariable"},"fat"),e(" "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"You\'re fat! Lose some weight, fatty!"'),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token builtin"},"otherwise"),e(" "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"You\'re a whale, congratulations!"'),e("\n "),a("span",{class:"token keyword"},"where"),e(),a("span",{class:"token hvariable"},"bmi"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"weight"),e(),a("span",{class:"token operator"},"/"),e(),a("span",{class:"token hvariable"},"height"),e(),a("span",{class:"token operator"},"^"),e(),a("span",{class:"token number"},"2"),e("\n "),a("span",{class:"token hvariable"},"skinny"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"18.5"),e("\n "),a("span",{class:"token hvariable"},"normal"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"25.0"),e("\n "),a("span",{class:"token hvariable"},"fat"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"30.0"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br")])],-1),gs=a("h4",{id:"let-绑定"},[a("a",{class:"header-anchor",href:"#let-绑定","aria-hidden":"true"},"#"),e(" let 绑定")],-1),ys=a("p",null,"类似 where,绑定对象为表达式/函数",-1),fs=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"bindings"),e("\n"),a("span",{class:"token keyword"},"in"),e(" "),a("span",{class:"token hvariable"},"expressions"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),ws=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"sideArea"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"2"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token builtin"},"pi"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token hvariable"},"r"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token hvariable"},"h"),e("\n "),a("span",{class:"token hvariable"},"topArea"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"pi"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token hvariable"},"r"),e(),a("span",{class:"token operator"},"^"),a("span",{class:"token number"},"2"),e("\n"),a("span",{class:"token keyword"},"in"),e(" "),a("span",{class:"token hvariable"},"sideArea"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token number"},"2"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token hvariable"},"topArea"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),xs=a("ul",null,[a("li",null,"可见性:in 作用域,只对本 guard 可见"),a("li",null,"可使用模式匹配"),a("li",null,"可用于 List Range 中")],-1),Ss=a("h4",{id:"case-表达式"},[a("a",{class:"header-anchor",href:"#case-表达式","aria-hidden":"true"},"#"),e(" case 表达式")],-1),Ls=a("ul",null,[a("li",null,"模式匹配是 case 表达式的特殊情况(语法糖:简化写法)"),a("li",null,"在函数中,模式匹配只能用于参数定义中,而 case 表达式可用于其他地方(let/where 绑定 普通表达式 guard 语句)")],-1),Ms=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"case"),e(),a("span",{class:"token hvariable"},"expression"),e(),a("span",{class:"token keyword"},"of"),e(),a("span",{class:"token hvariable"},"pattern"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"result"),e("\n "),a("span",{class:"token hvariable"},"pattern"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"result"),e("\n "),a("span",{class:"token hvariable"},"pattern"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"result"),e("\n "),a("span",{class:"token operator"},"..."),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Fs=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"describeList"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token hvariable"},"describeList"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"The list is "'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token keyword"},"case"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token keyword"},"of"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token string"},'"empty."'),e("\n "),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token string"},'"a singleton list."'),e("\n "),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token string"},'"a longer list."'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Ts=a("h2",{id:"type-class"},[a("a",{class:"header-anchor",href:"#type-class","aria-hidden":"true"},"#"),e(" Type Class")],-1),Is=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"=="),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"=="),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Eq"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Bool"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token builtin"},"fromIntegral"),e("\n"),a("span",{class:"token builtin"},"fromIntegral"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Integral"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),As=a("h3",{id:"符号"},[a("a",{class:"header-anchor",href:"#符号","aria-hidden":"true"},"#"),e(" => 符号")],-1),Cs=a("p",null,"=> 左部: 类约束(Class Constraint) => 右部: 函数类型(参数/返回值类型),其中参数类型同属 Class",-1),Os=a("h3",{id:"basic-type-class"},[a("a",{class:"header-anchor",href:"#basic-type-class","aria-hidden":"true"},"#"),e(" Basic Type Class")],-1),Ns=a("blockquote",null,[a("p",null,"ghci> :info typeClassName")],-1),Bs=a("h4",{id:"eq"},[a("a",{class:"header-anchor",href:"#eq","aria-hidden":"true"},"#"),e(" Eq")],-1),Ws=a("ul",null,[a("li",null,"功能: 成员类型可判断相等性"),a("li",null,"成员: 大部分基本类型(不包含函数类型)"),a("li",null,"方法: == 与 /= 函数")],-1),Es=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token constant"},"Eq"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"=="),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Bool"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"/="),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Bool"),e("\n "),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"not"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"/="),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"/="),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"not"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),$s=a("h4",{id:"ord"},[a("a",{class:"header-anchor",href:"#ord","aria-hidden":"true"},"#"),e(" Ord")],-1),Ps=a("p",null,"Ord 成员必为 Eq 成员: class (Eq a) => Ord a where",-1),qs=a("ul",null,[a("li",null,"功能: 成员类型可排序"),a("li",null,"成员: 大部分基本类型(不包含函数类型)"),a("li",null,[e("方法: "),a("ul",null,[a("li",null,"< > <= >= 函数"),a("li",null,"compare 函数 (Ord a) => a -> a -> Ordering")])])],-1),Rs=a("h4",{id:"show"},[a("a",{class:"header-anchor",href:"#show","aria-hidden":"true"},"#"),e(" Show")],-1),zs=a("ul",null,[a("li",null,"功能: 成员类型可用字符串表示"),a("li",null,"成员: 大部分基本类型(不包含函数类型)"),a("li",null,"方法: show 函数 (Show a) => a -> String")],-1),Ds=a("p",null,[a("em",null,"Tips"),e(": 结合 Read, 可用于字符串与数值之间的转化")],-1),Js=a("h4",{id:"read"},[a("a",{class:"header-anchor",href:"#read","aria-hidden":"true"},"#"),e(" Read")],-1),Gs=a("ul",null,[a("li",null,"功能: 可以将字串转为 Read 某成员类型"),a("li",null,"成员: 大部分基本类型(不包含函数类型)"),a("li",null,"方法: read 函数 (Read a) => String -> a")],-1),_s=a("p",null,[a("em",null,"Tips"),e(": 结合 Show, 可用于字符串与数值之间的转化")],-1),Hs=a("h4",{id:"enum"},[a("a",{class:"header-anchor",href:"#enum","aria-hidden":"true"},"#"),e(" Enum")],-1),Ks=a("ul",null,[a("li",null,[e("功能: 连续性(可枚举), 其成员类型可用于"),a("em",null,"Range"),e("中")]),a("li",null,"成员: () Bool Char Ordering Int Integer Float Double")],-1),Ys=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"Thursday"),e(),a("span",{class:"token operator"},".."),e(),a("span",{class:"token constant"},"Sunday"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),Vs=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"succ"),e(),a("span",{class:"token constant"},"Monday"),e("\n"),a("span",{class:"token constant"},"Tuesday"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"pred"),e(),a("span",{class:"token constant"},"Saturday"),e("\n"),a("span",{class:"token constant"},"Friday"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Us=a("h4",{id:"bounded"},[a("a",{class:"header-anchor",href:"#bounded","aria-hidden":"true"},"#"),e(" Bounded")],-1),Zs=a("ul",null,[a("li",null,"功能: 成员类型具有上下限"),a("li",null,[e("方法: minBound/maxBound 函数 (Bounded a) => a "),a("em",null,"无参多态常量/定义")])],-1),js=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"minBound"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Day"),e("\n"),a("span",{class:"token constant"},"Monday"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"maxBound"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Day"),e("\n"),a("span",{class:"token constant"},"Sunday"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Qs=a("h4",{id:"num"},[a("a",{class:"header-anchor",href:"#num","aria-hidden":"true"},"#"),e(" Num")],-1),Xs=a("ul",null,[a("li",null,"功能: 成员类型具有数字特征"),a("li",null,"成员: 实数 整数 - Int Integer Float Double"),a("li",null,"方法: + - * abs 函数"),a("li",null,"实例: 所有数字都是多态常量/定义(可视为函数)")],-1),na=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token number"},"20"),e("\n"),a("span",{class:"token number"},"20"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"t"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"t"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),sa=a("h4",{id:"integral"},[a("a",{class:"header-anchor",href:"#integral","aria-hidden":"true"},"#"),e(" Integral")],-1),aa=a("ul",null,[a("li",null,"功能: 成员类型具有数字特征"),a("li",null,"成员: 整型 - Int Integer")],-1),ea=a("h4",{id:"floating"},[a("a",{class:"header-anchor",href:"#floating","aria-hidden":"true"},"#"),e(" Floating")],-1),ta=a("ul",null,[a("li",null,"功能: 成员类型具有数字特征"),a("li",null,"成员: 浮点型 - Float Double")],-1),la=a("table",null,[a("thead",null,[a("tr",null,[a("th",{style:{"text-align":"left"}},"TypeClass"),a("th",{style:{"text-align":"left"}},"Method Feature")])]),a("tbody",null,[a("tr",null,[a("td",{style:{"text-align":"left"}},"Functor"),a("td",{style:{"text-align":"left"}},"f a + (a -> b) -> f b")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"Applicative"),a("td",{style:{"text-align":"left"}},"f a + f (a -> b) -> f b")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"Monad"),a("td",{style:{"text-align":"left"}},"m a + (a -> m b) -> m b")])])],-1),oa=a("h4",{id:"functor"},[a("a",{class:"header-anchor",href:"#functor","aria-hidden":"true"},"#"),e(),a("em",null,"Functor")],-1),pa=a("ul",null,[a("li",null,[e("成员: Maybe a, [], Either a, IO "),a("ul",null,[a("li",null,[e("成员 kind 必须为 "),a("code",null,"* -> *")]),a("li",null,[e("f "),a("em",null,"一元类型构造符(type constructor)")])])]),a("li",null,[e("必须遵守准则: "),a("ul",null,[a("li",null,"fmap id = id"),a("li",null,"fmap (f . g) F = fmap f (fmap g F)")])])],-1),ca=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"info"),e(),a("span",{class:"token constant"},"Functor"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token constant"},"Functor"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token builtin"},"fmap"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"b"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"$"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"a"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),ra=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Functor"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token builtin"},"fmap"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"map"),e("\n\n"),a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Functor"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token builtin"},"fmap"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token builtin"},"fmap"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token constant"},"Nothing"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Nothing"),e("\n\n"),a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Functor"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Either"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token builtin"},"fmap"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Right"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Right"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token builtin"},"fmap"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Left"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Left"),e(),a("span",{class:"token hvariable"},"x"),e("\n\n"),a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Functor"),e(),a("span",{class:"token constant"},"IO"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token builtin"},"fmap"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"action"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"result"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"action"),e("\n "),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"result"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br")])],-1),ua=a("h4",{id:"control-applicative"},[a("a",{class:"header-anchor",href:"#control-applicative","aria-hidden":"true"},"#"),e(" Control Applicative")],-1),ia=a("ul",null,[a("li",null,[e("成员: f :: "),a("code",null,"* -> *"),e(),a("em",null,"一元类型构造符(type constructor)")]),a("li",null,"<*>: 参数为 2 个 functor 实例,其中一个包含一个函数")],-1),ka=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"<$>"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Functor"),e(),a("span",{class:"token hvariable"},"f"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"b"),e("\n"),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"<$>"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"fmap"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),ba=a("ul",null,[a("li",null,"作用: 可以用单一一个函数操作多个 functor")],-1),ma=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Functor"),e(),a("span",{class:"token hvariable"},"f"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token constant"},"Applicative"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"pure"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"a"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"<*>"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"b"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),ha=a("h5",{id:"maybe"},[a("a",{class:"header-anchor",href:"#maybe","aria-hidden":"true"},"#"),e(" Maybe")],-1),da=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Applicative"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"pure"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Just"),e("\n "),a("span",{class:"token constant"},"Nothing"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Nothing"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"f"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token hvariable"},"something"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"fmap"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"something"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),va=a("h5",{id:"collection"},[a("a",{class:"header-anchor",href:"#collection","aria-hidden":"true"},"#"),e(" Collection "),a("code",null,"[]")],-1),ga=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Applicative"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"pure"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token hvariable"},"fs"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"fs"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),ya=a("h5",{id:"io"},[a("a",{class:"header-anchor",href:"#io","aria-hidden":"true"},"#"),e(" IO")],-1),fa=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Applicative"),e(),a("span",{class:"token constant"},"IO"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"pure"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"return"),e("\n "),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"a"),e("\n "),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"b"),e("\n "),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),wa=a("h5",{id:"ziplist"},[a("a",{class:"header-anchor",href:"#ziplist","aria-hidden":"true"},"#"),e(" ZipList")],-1),xa=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Applicative"),e(),a("span",{class:"token constant"},"ZipList"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"pure"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"ZipList"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"repeat"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token constant"},"ZipList"),e(),a("span",{class:"token hvariable"},"fs"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token constant"},"ZipList"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"ZipList"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"zipWith"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"fs"),e(),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),Sa=a("h5",{id:"multi-functor"},[a("a",{class:"header-anchor",href:"#multi-functor","aria-hidden":"true"},"#"),e(" Multi Functor")],-1),La=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"pure"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"+"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"5"),e("\n"),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"8"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"pure"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"+"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token constant"},"Nothing"),e("\n"),a("span",{class:"token constant"},"Nothing"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"pure"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"+"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token constant"},"Nothing"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"5"),e("\n"),a("span",{class:"token constant"},"Nothing"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),Ma=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"<$>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"11"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"16"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"20"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"22"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"40"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"50"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"55"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"80"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"110"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Fa=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"myAction"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"IO"),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token hvariable"},"myAction"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"<$>"),e(),a("span",{class:"token builtin"},"getLine"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token builtin"},"getLine"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Ta=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"getZipList"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"max"),e(),a("span",{class:"token operator"},"<$>"),e(),a("span",{class:"token constant"},"ZipList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token constant"},"ZipList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Ia=a("h5",{id:"高度封装函数"},[a("a",{class:"header-anchor",href:"#高度封装函数","aria-hidden":"true"},"#"),e(" 高度封装函数")],-1),Aa=a("p",null,[a("code",null,"liftA2"),e(", 对两个 applicative 运用二元函数:")],-1),Ca=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"liftA2"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Applicative"),e(),a("span",{class:"token hvariable"},"f"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"c"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"c"),e("\n"),a("span",{class:"token hvariable"},"liftA2"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"<$>"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token hvariable"},"b"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"liftA2"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},":"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},":"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"<$>"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),Oa=a("h4",{id:"control-monad"},[a("a",{class:"header-anchor",href:"#control-monad","aria-hidden":"true"},"#"),e(" Control Monad")],-1),Na=a("ul",null,[a("li",null,"成员: 类型构造符(type constructor)")],-1),Ba=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token constant"},"Monad"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token hvariable"},"a"),e("\n\n"),a("span",{class:"token comment"},"{- bind -}"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},">>="),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token hvariable"},"b"),e("\n\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},">>"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token hvariable"},"b"),e("\n "),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},">>"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"y"),e("\n\n "),a("span",{class:"token builtin"},"fail"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token hvariable"},"a"),e("\n "),a("span",{class:"token builtin"},"fail"),e(),a("span",{class:"token hvariable"},"msg"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"error"),e(),a("span",{class:"token hvariable"},"msg"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br")])],-1),Wa=a("ul",null,[a("li",null,"特性: 允许返回值之间具有弹性交互")],-1),Ea=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"{- 当出现异常后,之后所有的值都变为Nothing -}"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"landRight"),e(),a("span",{class:"token number"},"2"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"landLeft"),e(),a("span",{class:"token number"},"2"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"landRight"),e(),a("span",{class:"token number"},"2"),e("\n"),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"landLeft"),e(),a("span",{class:"token number"},"1"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"landRight"),e(),a("span",{class:"token number"},"4"),e("\n "),a("span",{class:"token operator"},"\\"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"landLeft"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"landRight"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token constant"},"Nothing"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),$a=a("p",null,"Monad Laws:",-1),Pa=a("ul",null,[a("li",null,[e("return 满足 Left identity: "),a("code",null,"return x >>= f 等于 f x")]),a("li",null,[e("return 满足 right identity: "),a("code",null,"m >>= return 等于 m")]),a("li",null,[e("Associativity: 结合律 "),a("code",null,"(m >>= f) >>= g 等于 m >>= (\\x -> f x >>= g)")])],-1),qa=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"100000"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"100003"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"100000"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token number"},"3"),e("\n"),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"100003"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token string"},'"move on up"'),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token string"},'"move on up"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"putStrLn"),e(),a("span",{class:"token string"},'"Wah!"'),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token constant"},"Wah"),a("span",{class:"token operator"},"!"),e("\n\n"),a("span",{class:"token comment"},"{-Tips: 利用结合律合并两个 Monadic Function-}"),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"<=<"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Monad"),e(),a("span",{class:"token hvariable"},"m"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token hvariable"},"c"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token hvariable"},"c"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"<=<"),e(),a("span",{class:"token hvariable"},"g"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"g"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"f"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},","),a("span",{class:"token operator"},"-"),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"g"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},"*"),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},"*"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"h"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"<=<"),e(),a("span",{class:"token hvariable"},"g"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"h"),e(),a("span",{class:"token number"},"3"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br")])],-1),Ra=a("h5",{id:"maybe-monad"},[a("a",{class:"header-anchor",href:"#maybe-monad","aria-hidden":"true"},"#"),e(" Maybe Monad")],-1),za=a("p",null,"具有失败可能性的 context 封装,灵活处理异常(返回值为 Nothing)",-1),Da=a("h6",{id:"实现"},[a("a",{class:"header-anchor",href:"#实现","aria-hidden":"true"},"#"),e(" 实现")],-1),Ja=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"applyMaybe"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token hvariable"},"b"),e("\n"),a("span",{class:"token hvariable"},"applyMaybe"),e(),a("span",{class:"token constant"},"Nothing"),e(),a("span",{class:"token hvariable"},"f"),e(" "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Nothing"),e("\n"),a("span",{class:"token hvariable"},"applyMaybe"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),Ga=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Monad"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"x"),e("\n "),a("span",{class:"token constant"},"Nothing"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Nothing"),e("\n "),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"f"),e(" "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),e("\n "),a("span",{class:"token builtin"},"fail"),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Nothing"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),_a=a("h6",{id:"do-表示法"},[a("a",{class:"header-anchor",href:"#do-表示法","aria-hidden":"true"},"#"),e(" do 表示法")],-1),Ha=a("ul",null,[a("li",null,"在 do expression 中,每一行都是一个 monadic value"),a("li",null,"检查返回值,使用 <-")],-1),Ka=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"foo"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token hvariable"},"foo"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"3"),e("\n "),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token string"},'"!"'),e("\n "),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"show"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"foo"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token hvariable"},"foo"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"3"),e(" "),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e("\n "),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token string"},'"!"'),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"->"),e("\n "),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"show"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"routine"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token constant"},"Pole"),e("\n"),a("span",{class:"token hvariable"},"routine"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"start"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token hvariable"},"first"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"landLeft"),e(),a("span",{class:"token number"},"2"),e(),a("span",{class:"token hvariable"},"start"),e("\n "),a("span",{class:"token constant"},"Nothing"),e("\n "),a("span",{class:"token hvariable"},"second"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"landRight"),e(),a("span",{class:"token number"},"2"),e(),a("span",{class:"token hvariable"},"first"),e("\n "),a("span",{class:"token hvariable"},"landLeft"),e(),a("span",{class:"token number"},"1"),e(),a("span",{class:"token hvariable"},"second"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br")])],-1),Ya=a("h5",{id:"list-monad"},[a("a",{class:"header-anchor",href:"#list-monad","aria-hidden":"true"},"#"),e(" List Monad")],-1),Va=a("ul",null,[a("li",null,"non-determinism(不确定性)")],-1),Ua=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"<$>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1000"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1000"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"20"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"200"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2000"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"30"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"300"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3000"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Za=a("ul",null,[a("li",null,"实现")],-1),ja=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Monad"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"concat"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token builtin"},"fail"),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Qa=a("ul",null,[a("li",null,[e("返回值交互: 下例中 n 与 return (n, ch) 进行交互 "),a("ul",null,[a("li",null,"list comprehension 与 do 表示法 均是 >>= 的语法糖")])]),a("li",null,"list comprehension: <- 与 条件表达式"),a("li",null,"do 表示法: <- 与 guard 函数")],-1),Xa=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"n"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token char string"},"'a'"),a("span",{class:"token punctuation"},","),a("span",{class:"token char string"},"'b'"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"ch"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"n"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"ch"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token char string"},"'a'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token char string"},"'b'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token char string"},"'a'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token char string"},"'b'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token comment"},"{- do 表示法 -}"),e("\n"),a("span",{class:"token hvariable"},"listOfTuples"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Int"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Char"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"listOfTuples"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"n"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token hvariable"},"ch"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token char string"},"'a'"),a("span",{class:"token punctuation"},","),a("span",{class:"token char string"},"'b'"),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"n"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"ch"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"sevensOnly"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"Int"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"sevensOnly"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"50"),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token hvariable"},"guard"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token char string"},"'7'"),e(" `"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token builtin"},"show"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token hvariable"},"x"),e("\n\n"),a("span",{class:"token comment"},"{- list comprehension -}"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"n"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"ch"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"n"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"ch"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token char string"},"'a'"),a("span",{class:"token punctuation"},","),a("span",{class:"token char string"},"'b'"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token char string"},"'a'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token char string"},"'b'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token char string"},"'a'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token char string"},"'b'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br")])],-1),ne=a("h5",{id:"monadplus"},[a("a",{class:"header-anchor",href:"#monadplus","aria-hidden":"true"},"#"),e(" MonadPlus")],-1),se=a("p",null,"使 Monad 具有 Monoid 的性质(二元封闭运算)",-1),ae=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"MonadPlus"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"mzero"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token hvariable"},"mplus"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),ee=a("h5",{id:"monad-algorithms"},[a("a",{class:"header-anchor",href:"#monad-algorithms","aria-hidden":"true"},"#"),e(" Monad Algorithms")],-1),te=a("h6",{id:"马走日"},[a("a",{class:"header-anchor",href:"#马走日","aria-hidden":"true"},"#"),e(" 马走日")],-1),le=a("ul",null,[a("li",null,"计算出可移动位置")],-1),oe=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"moveKnight"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"KnightPos"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"KnightPos"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"moveKnight"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"c"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"r"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"c"),e("'"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"r"),e("'"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"c"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"r"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"c"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"r"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"c"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"r"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"c"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"r"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"c"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"r"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"c"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"r"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"c"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"r"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"c"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"r"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token hvariable"},"guard"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"c"),e("' `"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"&&"),e(),a("span",{class:"token hvariable"},"r"),e("' `"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"c"),e("'"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"r"),e("'"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),pe=a("ul",null,[a("li",null,"利用 >>= 向后传递多个可交互的位置")],-1),ce=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"in3"),e(),a("span",{class:"token hvariable"},"start"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token hvariable"},"start"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"moveKnight"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"moveKnight"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"moveKnight"),e("\n\n"),a("span",{class:"token hvariable"},"in3"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"KnightPos"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"KnightPos"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"in3"),e(),a("span",{class:"token hvariable"},"start"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"first"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"moveKnight"),e(),a("span",{class:"token hvariable"},"start"),e("\n "),a("span",{class:"token hvariable"},"second"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"moveKnight"),e(),a("span",{class:"token hvariable"},"first"),e("\n "),a("span",{class:"token hvariable"},"moveKnight"),e(),a("span",{class:"token hvariable"},"second"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),re=a("ul",null,[a("li",null,"最后完成完整函数: 产生所有三步的可能位置,检查其中一个位置是否在里面")],-1),ue=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"canReachIn3"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"KnightPos"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"KnightPos"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Bool"),e("\n"),a("span",{class:"token hvariable"},"canReachIn3"),e(),a("span",{class:"token hvariable"},"start"),e(),a("span",{class:"token hvariable"},"end"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"end"),e(" `"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token hvariable"},"in3"),e(),a("span",{class:"token hvariable"},"start"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),ie=a("h4",{id:"foldable"},[a("a",{class:"header-anchor",href:"#foldable","aria-hidden":"true"},"#"),e(" Foldable")],-1),ke=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(),a("span",{class:"token keyword"},"qualified"),e(" Data.Foldable "),a("span",{class:"token keyword"},"as"),e(" F")]),e("\n\n"),a("span",{class:"token hvariable"},"foldMap"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Monoid"),e(),a("span",{class:"token hvariable"},"m"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Foldable"),e(),a("span",{class:"token hvariable"},"t"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),be=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"F.Foldable"),e(),a("span",{class:"token constant"},"Tree"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"foldMap"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token constant"},"Empty"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"mempty"),e("\n "),a("span",{class:"token hvariable"},"foldMap"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Node"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"l"),e(),a("span",{class:"token hvariable"},"r"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"F.foldMap"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"l"),e(),a("span",{class:"token operator"},"`mappend`"),e("\n "),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),e(" "),a("span",{class:"token operator"},"`mappend`"),e("\n "),a("span",{class:"token hvariable"},"F.foldMap"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"r"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),me=a("h4",{id:"data-monoid"},[a("a",{class:"header-anchor",href:"#data-monoid","aria-hidden":"true"},"#"),e(" Data Monoid")],-1),he=a("ul",null,[a("li",null,"成员: 必须为具体类型(*不可是类型构造符(type constructor))"),a("li",null,[e("准则(Monoid Law): "),a("ul",null,[a("li",null,[a("em",null,"结合律"),e(" a·(b·c) = (a·b)·c")]),a("li",null,[e("无需满足 a "),a("code",null,"mappend"),e(" b == b "),a("code",null,"mappend"),e(" a")])])])],-1),de=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token constant"},"Monoid"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"mempty"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"m"),e(" "),a("span",{class:"token comment"},"-- identity"),e("\n "),a("span",{class:"token hvariable"},"mappend"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),e("\n "),a("span",{class:"token hvariable"},"mconcat"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"m"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),e("\n "),a("span",{class:"token hvariable"},"mconcat"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"foldr"),e(),a("span",{class:"token hvariable"},"mappend"),e(),a("span",{class:"token hvariable"},"mempty"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),ve=a("ul",null,[a("li",null,"实例")],-1),ge=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Monoid"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"mempty"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token hvariable"},"mappend"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),ye=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"newtype"),e(),a("span",{class:"token constant"},"Product"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"="),e(" "),a("span",{class:"token constant"},"Product"),e(),a("span",{class:"token punctuation"},"{"),e(),a("span",{class:"token hvariable"},"getProduct"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token keyword"},"deriving"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Eq"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Ord"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Read"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Show"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Bounded"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token constant"},"Monoid"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Product"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"mempty"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Product"),e(),a("span",{class:"token number"},"1"),e("\n "),a("span",{class:"token constant"},"Product"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token constant"},"Product"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Product"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"getProduct"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token constant"},"Product"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token constant"},"Product"),e(),a("span",{class:"token number"},"4"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token constant"},"Product"),e(),a("span",{class:"token number"},"2"),e("\n"),a("span",{class:"token number"},"24"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br")])],-1),fe=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"newtype"),e(),a("span",{class:"token constant"},"Any"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Any"),e(),a("span",{class:"token punctuation"},"{"),e(),a("span",{class:"token hvariable"},"getAny"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Bool"),e(),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token keyword"},"deriving"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Eq"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Ord"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Read"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Show"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Bounded"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Monoid"),e(),a("span",{class:"token constant"},"Any"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"mempty"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Any"),e(),a("span",{class:"token constant"},"False"),e("\n "),a("span",{class:"token constant"},"Any"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token constant"},"Any"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Any"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"||"),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"getAny"),a("span",{class:"token operator"}," . "),a("span",{class:"token hvariable"},"mconcat"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token constant"},"Any"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"False"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"False"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"False"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"True"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"True"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br")])],-1),we=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"newtype"),e(),a("span",{class:"token constant"},"All"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"All"),e(),a("span",{class:"token punctuation"},"{"),e(),a("span",{class:"token hvariable"},"getAll"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Bool"),e(),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token keyword"},"deriving"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Eq"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Ord"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Read"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Show"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Bounded"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Monoid"),e(),a("span",{class:"token constant"},"All"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"mempty"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"All"),e(),a("span",{class:"token constant"},"True"),e("\n "),a("span",{class:"token constant"},"All"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token constant"},"All"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"All"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"&&"),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"getAll"),a("span",{class:"token operator"}," . "),a("span",{class:"token hvariable"},"mconcat"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token constant"},"All"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"True"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"True"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"False"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"False"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br")])],-1),xe=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Monoid"),e(),a("span",{class:"token constant"},"Ordering"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"mempty"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"EQ"),e("\n "),a("span",{class:"token constant"},"LT"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"LT"),e("\n "),a("span",{class:"token constant"},"EQ"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"y"),e("\n "),a("span",{class:"token constant"},"GT"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"GT"),e("\n\n"),a("span",{class:"token comment"},"-- Tips:"),e("\n"),a("span",{class:"token comment"},"-- mappend 在左边不等于 EQ 的情况下都会回传左边的值。相反地则回传右边的值"),e("\n"),a("span",{class:"token comment"},"-- 可代替多个 if/else 语句"),e("\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Data.Monoid")]),e("\n\n"),a("span",{class:"token hvariable"},"lengthCompare"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Ordering"),e("\n"),a("span",{class:"token hvariable"},"lengthCompare"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"length"),e(),a("span",{class:"token hvariable"},"x"),e(" `"),a("span",{class:"token builtin"},"compare"),e("` "),a("span",{class:"token builtin"},"length"),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"`mappend`"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"vowels"),e(),a("span",{class:"token hvariable"},"x"),e(" `"),a("span",{class:"token builtin"},"compare"),e("` "),a("span",{class:"token hvariable"},"vowels"),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"`mappend`"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),e(" `"),a("span",{class:"token builtin"},"compare"),e("` "),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"where"),e(),a("span",{class:"token hvariable"},"vowels"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"length"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token punctuation"},"("),e("`"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token string"},'"aeiou"'),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br")])],-1),Se=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Monoid"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token constant"},"Monoid"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"mempty"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Nothing"),e("\n "),a("span",{class:"token constant"},"Nothing"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"m"),e("\n "),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token constant"},"Nothing"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"m"),e("\n "),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"m1"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"m2"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"m1"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token hvariable"},"m2"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Monoid"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"First"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"mempty"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"First"),e(),a("span",{class:"token constant"},"Nothing"),e("\n "),a("span",{class:"token constant"},"First"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"First"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token constant"},"First"),e(),a("span",{class:"token constant"},"Nothing"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"x"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"getFirst"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token constant"},"First"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token char string"},"'a'"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token constant"},"First"),e(),a("span",{class:"token constant"},"Nothing"),e("\n"),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token char string"},"'a'"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br")])],-1),Le=a("h3",{id:"custom-type-class"},[a("a",{class:"header-anchor",href:"#custom-type-class","aria-hidden":"true"},"#"),e(" Custom Type Class")],-1),Me=a("ul",null,[a("li",null,[e("创建新类: "),a("em",null,"可以只有声明没有实现")])],-1),Fe=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token constant"},"ClassName"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"defining"),e(),a("span",{class:"token hvariable"},"code"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Te=a("ul",null,[a("li",null,[e("创建已有类的实例: "),a("em",null,"必须实现所有已声明函数"),a("ul",null,[a("li",null,"作用等同于 deriving(自由度更大)"),a("li",null,"可以重写函数,去除默认函数处理,达到特定目的")])])],-1),Ie=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token operator"},"-"),e(" 先创建新类型\n"),a("span",{class:"token keyword"},"data"),e(),a("span",{class:"token constant"},"TrafficLight"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Red"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"Yellow"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"Green"),e("\n\n"),a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Eq"),e(),a("span",{class:"token constant"},"TrafficLight"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token constant"},"Red"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token constant"},"Red"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"True"),e("\n "),a("span",{class:"token constant"},"Green"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token constant"},"Green"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"True"),e("\n "),a("span",{class:"token constant"},"Yellow"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token constant"},"Yellow"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"True"),e("\n "),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"False"),e("\n\n"),a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Show"),e(),a("span",{class:"token constant"},"TrafficLight"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token builtin"},"show"),e(),a("span",{class:"token constant"},"Red"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"Red light"'),e("\n "),a("span",{class:"token builtin"},"show"),e(),a("span",{class:"token constant"},"Yellow"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"Yellow light"'),e("\n "),a("span",{class:"token builtin"},"show"),e(),a("span",{class:"token constant"},"Green"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"Green light"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br")])],-1),Ae=a("ul",null,[a("li",null,[e("创建新类和实现实例时,使用 class constraint "),a("ul",null,[a("li",null,[e("可达到"),a("em",null,"类似于"),e("继承的效果")]),a("li",null,"可达到限制类型的效果")])])],-1),Ce=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Eq"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token operator"},"..."),e("\n\n"),a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Eq"),e(),a("span",{class:"token hvariable"},"m"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token constant"},"Eq"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token hvariable"},"m"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token hvariable"},"y"),e("\n "),a("span",{class:"token constant"},"Nothing"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token constant"},"Nothing"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"True"),e("\n "),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"False"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),Oe=a("h3",{id:"data-type"},[a("a",{class:"header-anchor",href:"#data-type","aria-hidden":"true"},"#"),e(),a("code",null,"data"),e(" type")],-1),Ne=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"data"),e(),a("span",{class:"token constant"},"SelfDefinedTypeName"),e(),a("span",{class:"token operator"},"="),e("\n "),a("span",{class:"token constant"},"ValueConstructorName"),e(),a("span",{class:"token constant"},"ValueType"),e(),a("span",{class:"token operator"},".."),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token operator"},".."),e(),a("span",{class:"token keyword"},"deriving"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"TypeClass"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Be=a("ul",null,[a("li",null,"data 范例")],-1),We=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"data"),e(),a("span",{class:"token constant"},"Point"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Point"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token keyword"},"deriving"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Show"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token keyword"},"data"),e(),a("span",{class:"token constant"},"Shape"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Circle"),e(),a("span",{class:"token constant"},"Point"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"Rectangle"),e(),a("span",{class:"token constant"},"Point"),e(),a("span",{class:"token constant"},"Point"),e(),a("span",{class:"token keyword"},"deriving"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Show"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Ee=a("ul",null,[a("li",null,"导出 data")],-1),$e=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e(),a("span",{class:"token constant"},"Shapes"),e("\n"),a("span",{class:"token punctuation"},"("),e(),a("span",{class:"token constant"},"Point"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Shape"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Pe=a("ul",null,[a("li",null,"后构造器 > 前构造器")],-1),qe=a("blockquote",null,[a("p",null,"e.g True > False")],-1),Re=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"data"),e(),a("span",{class:"token constant"},"Bool"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"False"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"True"),e(),a("span",{class:"token keyword"},"deriving"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Ord"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),ze=a("h4",{id:"函数特性"},[a("a",{class:"header-anchor",href:"#函数特性","aria-hidden":"true"},"#"),e(" 函数特性")],-1),De=a("p",null,"data type 也是函数,若省略参数亦会造成 Curry 化.",-1),Je=a("blockquote",null,[a("p",null,"e.g map fx list")],-1),Ge=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Circle"),e(),a("span",{class:"token number"},"10"),e(),a("span",{class:"token number"},"20"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"Circle"),e(),a("span",{class:"token number"},"10.0"),e(),a("span",{class:"token number"},"20.0"),e(),a("span",{class:"token number"},"4.0"),a("span",{class:"token punctuation"},","),e("\n"),a("span",{class:"token constant"},"Circle"),e(),a("span",{class:"token number"},"10.0"),e(),a("span",{class:"token number"},"20.0"),e(),a("span",{class:"token number"},"5.0"),a("span",{class:"token punctuation"},","),e("\n"),a("span",{class:"token constant"},"Circle"),e(),a("span",{class:"token number"},"10.0"),e(),a("span",{class:"token number"},"20.0"),e(),a("span",{class:"token number"},"6.0"),a("span",{class:"token punctuation"},","),e("\n"),a("span",{class:"token constant"},"Circle"),e(),a("span",{class:"token number"},"10.0"),e(),a("span",{class:"token number"},"20.0"),e(),a("span",{class:"token number"},"6.0"),e("\n"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),_e=a("ul",null,[a("li",null,[e("Value Constructor:使用"),a("code",null,"ValueConstructorName ValueType .."),e("可构造出一个该类型的定义/名字")])],-1),He=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),e(),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Circle"),e(),a("span",{class:"token number"},"10"),e(),a("span",{class:"token number"},"20"),e(),a("span",{class:"token number"},"30"),e("\n"),a("span",{class:"token constant"},"Circle"),e(),a("span",{class:"token number"},"10"),e(),a("span",{class:"token number"},"20"),e(),a("span",{class:"token number"},"30"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Ke=a("h4",{id:"记录语法-record-syntax"},[a("a",{class:"header-anchor",href:"#记录语法-record-syntax","aria-hidden":"true"},"#"),e(" 记录语法(Record Syntax)")],-1),Ye=a("ul",null,[a("li",null,"定义")],-1),Ve=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"data"),e(),a("span",{class:"token constant"},"Person"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Person"),e(),a("span",{class:"token punctuation"},"{"),e(),a("span",{class:"token hvariable"},"firstName"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"String"),e("\n "),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"lastName"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"String"),e("\n "),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"age"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Int"),e("\n "),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"height"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e("\n "),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"phoneNumber"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"String"),e("\n "),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"flavor"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"String"),e("\n "),a("span",{class:"token punctuation"},"}"),e(),a("span",{class:"token keyword"},"deriving"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Show"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),Ue=a("ul",null,[a("li",null,"使用")],-1),Ze=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Car"),e(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token hvariable"},"company"),a("span",{class:"token operator"},"="),a("span",{class:"token string"},'"Ford"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"model"),a("span",{class:"token operator"},"="),a("span",{class:"token string"},'"Mustang"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"year"),a("span",{class:"token operator"},"="),a("span",{class:"token number"},"1967"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token constant"},"Car"),e(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token hvariable"},"company"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"Ford"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"model"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"Mustang"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"year"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1967"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),je=a("h4",{id:"类型参数-type-parameters"},[a("a",{class:"header-anchor",href:"#类型参数-type-parameters","aria-hidden":"true"},"#"),e(" 类型参数(Type Parameters)")],-1),Qe=a("p",null,"提高代码的复用性",-1),Xe=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"data"),e(),a("span",{class:"token constant"},"Car"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Car"),e(),a("span",{class:"token punctuation"},"{"),e(),a("span",{class:"token hvariable"},"company"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"a"),e("\n "),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"model"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"b"),e("\n "),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"year"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"c"),e("\n "),a("span",{class:"token punctuation"},"}"),e(),a("span",{class:"token keyword"},"deriving"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Show"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),nt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"tellCar"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Show"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token constant"},"Car"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token hvariable"},"tellCar"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Car"),e(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token hvariable"},"company"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"c"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"model"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"m"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"year"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e("\n "),a("span",{class:"token string"},'"This "'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token string"},'" "'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token string"},'" was made in "'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token builtin"},"show"),e(),a("span",{class:"token hvariable"},"y"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),st=a("h5",{id:"maybe-value-constructor"},[a("a",{class:"header-anchor",href:"#maybe-value-constructor","aria-hidden":"true"},"#"),e(" Maybe value constructor")],-1),at=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"data"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Nothing"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"a"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),et=a("ul",null,[a("li",null,"Just 可实现转化:")],-1),tt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token hvariable"},"a"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),lt=a("h4",{id:"deriving-派生"},[a("a",{class:"header-anchor",href:"#deriving-派生","aria-hidden":"true"},"#"),e(" Deriving(派生)")],-1),ot=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"data"),e(),a("span",{class:"token constant"},"Day"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Monday"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"Tuesday"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"Wednesday"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"Thursday"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"Friday"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"Saturday"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"Sunday"),e("\n "),a("span",{class:"token keyword"},"deriving"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Eq"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Ord"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Show"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Read"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Bounded"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Enum"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),pt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Wednesday"),e("\n"),a("span",{class:"token constant"},"Wednesday"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"show"),e(),a("span",{class:"token constant"},"Wednesday"),e("\n"),a("span",{class:"token string"},'"Wednesday"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"read"),e(),a("span",{class:"token string"},'"Saturday"'),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Day"),e("\n"),a("span",{class:"token constant"},"Saturday"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Saturday"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token constant"},"Sunday"),e("\n"),a("span",{class:"token constant"},"False"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Saturday"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token constant"},"Saturday"),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Saturday"),e(),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Friday"),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Monday"),e(" `"),a("span",{class:"token builtin"},"compare"),e("` "),a("span",{class:"token constant"},"Wednesday"),e("\n"),a("span",{class:"token constant"},"LT"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"minBound"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Day"),e("\n"),a("span",{class:"token constant"},"Monday"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"maxBound"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Day"),e("\n"),a("span",{class:"token constant"},"Sunday"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"succ"),e(),a("span",{class:"token constant"},"Monday"),e("\n"),a("span",{class:"token constant"},"Tuesday"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"pred"),e(),a("span",{class:"token constant"},"Saturday"),e("\n"),a("span",{class:"token constant"},"Friday"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"Thursday"),e(),a("span",{class:"token operator"},".."),e(),a("span",{class:"token constant"},"Sunday"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"Thursday"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Friday"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Saturday"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Sunday"),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token builtin"},"minBound"),e(),a("span",{class:"token operator"},".."),e(),a("span",{class:"token builtin"},"maxBound"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"Day"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"Monday"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Tuesday"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Wednesday"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Thursday"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Friday"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Saturday"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Sunday"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br")])],-1),ct=a("h4",{id:"type-定义"},[a("a",{class:"header-anchor",href:"#type-定义","aria-hidden":"true"},"#"),e(" type 定义")],-1),rt=a("p",null,[e("为 data 声明别名 - "),a("code",null,"typedef")],-1),ut=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"type"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"Char"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token keyword"},"type"),e(),a("span",{class:"token constant"},"PhoneNumber"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token keyword"},"type"),e(),a("span",{class:"token constant"},"Name"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token keyword"},"type"),e(),a("span",{class:"token constant"},"PhoneBook"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Name"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"PhoneNumber"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),it=a("ul",null,[a("li",null,"type 类型参数: 匹配 data 类型参数")],-1),kt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"type"),e(),a("span",{class:"token constant"},"AssocList"),e(),a("span",{class:"token hvariable"},"k"),e(),a("span",{class:"token hvariable"},"v"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"v"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token keyword"},"type"),e(),a("span",{class:"token constant"},"IntMap"),e(),a("span",{class:"token hvariable"},"v"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Map.Map"),e(),a("span",{class:"token constant"},"Int"),e(),a("span",{class:"token hvariable"},"v"),e("\n"),a("span",{class:"token keyword"},"type"),e(),a("span",{class:"token constant"},"IntMap"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Map.Map"),e(),a("span",{class:"token constant"},"Int"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),bt=a("p",null,"类型别名,只可以在 Haskell 的类型部分中使用:",-1),mt=a("ul",null,[a("li",null,"定义新类型"),a("li",null,"类型声明"),a("li",null,"类型注释(:😃"),a("li",null,[e("禁止: 定义名字/定义 "),a("em",null,"AssocList [(1,2),(4,5),(7,9)]")])],-1),ht=a("h4",{id:"高级数据结构"},[a("a",{class:"header-anchor",href:"#高级数据结构","aria-hidden":"true"},"#"),e(" 高级数据结构")],-1),dt=a("h5",{id:"栈"},[a("a",{class:"header-anchor",href:"#栈","aria-hidden":"true"},"#"),e(" 栈")],-1),vt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"type"),e(),a("span",{class:"token constant"},"Stack"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"Int"),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token hvariable"},"pop"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Stack"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Int"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Stack"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"pop"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"push"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Int"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Stack"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Stack"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"push"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"a"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),gt=a("h5",{id:"链表"},[a("a",{class:"header-anchor",href:"#链表","aria-hidden":"true"},"#"),e(" 链表")],-1),yt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"data"),e(),a("span",{class:"token constant"},"List"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Empty"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"Cons"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"List"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"deriving"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Show"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Read"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Eq"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Ord"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token keyword"},"data"),e(),a("span",{class:"token constant"},"List"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Empty"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"Cons"),e(),a("span",{class:"token punctuation"},"{"),e(),a("span",{class:"token hvariable"},"listHead"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"listTail"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"List"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"}"),e(),a("span",{class:"token keyword"},"deriving"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Show"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Read"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Eq"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Ord"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),ft=a("h5",{id:"二叉树"},[a("a",{class:"header-anchor",href:"#二叉树","aria-hidden":"true"},"#"),e(" 二叉树")],-1),wt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"data"),e(),a("span",{class:"token constant"},"Tree"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"EmptyTree"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"Node"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Tree"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Tree"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"deriving"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Show"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Read"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Eq"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),xt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"singleton"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Tree"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token hvariable"},"singleton"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Node"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token constant"},"EmptyTree"),e(),a("span",{class:"token constant"},"EmptyTree"),e("\n\n"),a("span",{class:"token hvariable"},"treeInsert"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Ord"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Tree"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Tree"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token hvariable"},"treeInsert"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token constant"},"EmptyTree"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"singleton"),e(),a("span",{class:"token hvariable"},"x"),e("\n"),a("span",{class:"token hvariable"},"treeInsert"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Node"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"left"),e(),a("span",{class:"token hvariable"},"right"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Node"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"left"),e(),a("span",{class:"token hvariable"},"right"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"<"),e(),a("span",{class:"token hvariable"},"a"),e(" "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Node"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"treeInsert"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"left"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"right"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"a"),e(" "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Node"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"left"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"treeInsert"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"right"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"treeElem"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Ord"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Tree"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Bool"),e("\n"),a("span",{class:"token hvariable"},"treeElem"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token constant"},"EmptyTree"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"False"),e("\n"),a("span",{class:"token hvariable"},"treeElem"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Node"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"left"),e(),a("span",{class:"token hvariable"},"right"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"True"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"<"),e(),a("span",{class:"token hvariable"},"a"),e(" "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"treeElem"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"left"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"a"),e(" "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"treeElem"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"right"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"nums"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"numsTree"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"foldr"),e(),a("span",{class:"token hvariable"},"treeInsert"),e(),a("span",{class:"token constant"},"EmptyTree"),e(),a("span",{class:"token hvariable"},"nums"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br")])],-1),St=a("h2",{id:"函数"},[a("a",{class:"header-anchor",href:"#函数","aria-hidden":"true"},"#"),e(" 函数")],-1),Lt=a("h3",{id:"递归函数"},[a("a",{class:"header-anchor",href:"#递归函数","aria-hidden":"true"},"#"),e(" 递归函数")],-1),Mt=a("ul",null,[a("li",null,"边界条件"),a("li",null,"递归基础"),a("li",null,"递归函数体")],-1),Ft=a("h4",{id:"list-函数"},[a("a",{class:"header-anchor",href:"#list-函数","aria-hidden":"true"},"#"),e(" List 函数")],-1),Tt=a("ul",null,[a("li",null,"边界条件: 空 List"),a("li",null,"递归函数体: x:xs 取出首元素进行一般操作,对尾部进行递归操作.")],-1),It=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"maximum"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Ord"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token builtin"},"maximum"),e("' "),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"error"),e(),a("span",{class:"token string"},'"maximum of empty list"'),e("\n"),a("span",{class:"token builtin"},"maximum"),e("' "),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"x"),e("\n"),a("span",{class:"token comment"},"{-\nmaximum' (x:xs)\n | x > maxTail = x\n | otherwise = maxTail\n where maxTail = maximum' xs\n-}"),e("\n"),a("span",{class:"token builtin"},"maximum"),e("' "),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"max"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"maximum"),e("' "),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br")])],-1),At=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"replicate"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"i"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Ord"),e(),a("span",{class:"token hvariable"},"i"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"i"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"replicate"),e("' "),a("span",{class:"token hvariable"},"n"),e(),a("span",{class:"token hvariable"},"x"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"n"),e(),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"0"),e(" "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token builtin"},"otherwise"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token builtin"},"replicate"),e("' "),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"n"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"x"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Ct=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"take"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"i"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Ord"),e(),a("span",{class:"token hvariable"},"i"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"i"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"take"),e("' "),a("span",{class:"token hvariable"},"n"),e(),a("span",{class:"token hvariable"},"_"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"n"),e(),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"0"),e(" "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"take"),e("' "),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(" "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"take"),e("' "),a("span",{class:"token hvariable"},"n"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},":"),e(),a("span",{class:"token builtin"},"take"),e("' "),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"n"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),Ot=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"reverse"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"reverse"),e("' "),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"reverse"),e("' "),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"reverse"),e("' "),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),Nt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"repeat"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"repeat"),e("' "),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token builtin"},"repeat"),e("' "),a("span",{class:"token hvariable"},"x"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Bt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"zip"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"zip"),e("' "),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"zip"),e("' "),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"zip"),e("' "),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"y"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"ys"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},":"),a("span",{class:"token builtin"},"zip"),e("' "),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token hvariable"},"ys"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Wt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"elem"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Eq"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Bool"),e("\n"),a("span",{class:"token builtin"},"elem"),e("' "),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"False"),e("\n"),a("span",{class:"token builtin"},"elem"),e("' "),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token hvariable"},"x"),e(" "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"True"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token builtin"},"otherwise"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"a"),e(" `"),a("span",{class:"token builtin"},"elem"),e("'` "),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),Et=a("p",null,"Awesome Quick Sort",-1),$t=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"quicksort"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Ord"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"quicksort"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"quicksort"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e("\n "),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"smallerSorted"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"quicksort"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token hvariable"},"biggerSorted"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"quicksort"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token keyword"},"in"),e(),a("span",{class:"token hvariable"},"smallerSorted"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token hvariable"},"biggerSorted"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),Pt=a("h3",{id:"高阶函数"},[a("a",{class:"header-anchor",href:"#高阶函数","aria-hidden":"true"},"#"),e(" 高阶函数")],-1),qt=a("h4",{id:"curry-化"},[a("a",{class:"header-anchor",href:"#curry-化","aria-hidden":"true"},"#"),e(" Curry 化")],-1),Rt=a("p",null,[e("当传入不全参数时,会改变函数的类型,"),a("em",null,"返回值从单类型变成函数类型"),e(".")],-1),zt=a("ul",null,[a("li",null,"当传入不全参数时:"),a("li",null,"compare 的类型变为 (Ord a) => a -> (a -> Ordering)")],-1),Dt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"compareWithHundred"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Ord"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Ordering"),e("\n"),a("span",{class:"token hvariable"},"compareWithHundred"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"compare"),e(),a("span",{class:"token number"},"100"),e(),a("span",{class:"token hvariable"},"x"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Jt=a("ul",null,[a("li",null,"通过给二元中缀函数传递唯一参数:"),a("li",null,"中缀函数类型由 a -> a -> a 转为 a -> a")],-1),Gt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"divideByTen"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Floating"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token hvariable"},"divideByTen"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"/"),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"/"),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"/"),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Fractional"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),_t=a("ul",null,[a("li",null,[e("包装函数: "),a("ul",null,[a("li",null,"传入一个二元函数作为参数,便可实现 zipWithFunc"),a("li",null,"若在定义时便传入一个函数参数,便可实现 Curry 化")])])],-1),Ht=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"zipWith"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"c"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"c"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"zipWith"),e("' "),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"zipWith"),e("' "),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"zipWith"),e("' "),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"y"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"ys"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},":"),e(),a("span",{class:"token builtin"},"zipWith"),e("' "),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token hvariable"},"ys"),e("\n\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"zipWith"),e("' "),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"+"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"zipWith"),e("' "),a("span",{class:"token builtin"},"max"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"zipWith"),e("' "),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"foo "'),e(","),a("span",{class:"token string"},'"bar "'),e(","),a("span",{class:"token string"},'"baz "'),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"fighters"'),e(","),a("span",{class:"token string"},'"hoppers"'),e(","),a("span",{class:"token string"},'"aldrin"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"foo fighters"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"bar hoppers"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"baz aldrin"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"zipWith"),e("' "),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"replicate"),e(),a("span",{class:"token number"},"5"),e(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"zipWith"),e("' "),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"zipWith"),e("' "),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"20"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"30"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"12"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"12"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br")])],-1),Kt=a("ul",null,[a("li",null,"通过 Curry 化,还可省略参数")],-1),Yt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"foo"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"bar"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e("\n"),a("span",{class:"token hvariable"},"foo"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"bar"),e(),a("span",{class:"token hvariable"},"b"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Vt=a("h4",{id:"map-函数"},[a("a",{class:"header-anchor",href:"#map-函数","aria-hidden":"true"},"#"),e(" map 函数")],-1),Ut=a("p",null,"映射函数 - List Comprehension 的函数化",-1),Zt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},":"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),jt=a("ul",null,[a("li",null,[e("如果 map 传入的函数参数的类型为 a -> a -> a,则返回的 List 类型为"),a("code",null,"[a -> a]"),e("(f x 传参不完全,造成了 Curry 化).")])],-1),Qt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"listOfFun"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"listOfFun"),e(),a("span",{class:"token operator"},"!!"),e(),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token number"},"5"),e("\n"),a("span",{class:"token number"},"20"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),Xt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token string"},'"!"'),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"BIFF"'),e(","),a("span",{class:"token string"},'"BANG"'),e(","),a("span",{class:"token string"},'"POW"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"BIFF!"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"BANG!"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"POW!"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"replicate"),e(),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"^"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"16"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"25"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"36"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"49"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"64"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token builtin"},"fst"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br")])],-1),nl=a("h4",{id:"filter-函数"},[a("a",{class:"header-anchor",href:"#filter-函数","aria-hidden":"true"},"#"),e(" filter 函数")],-1),sl=a("p",null,"过滤函数 - Comprehension 的函数化",-1),al=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Bool"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token hvariable"},"p"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"p"),e(),a("span",{class:"token hvariable"},"x"),e(" "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},":"),e(),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token hvariable"},"p"),e(),a("span",{class:"token hvariable"},"xs"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token builtin"},"otherwise"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token hvariable"},"p"),e(),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),el=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},">"),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"=="),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token builtin"},"even"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"notNull"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"not"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"null"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"in"),e(),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token hvariable"},"notNull"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token punctuation"},"("),e("`"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token punctuation"},"["),a("span",{class:"token char string"},"'a'"),a("span",{class:"token operator"},".."),a("span",{class:"token char string"},"'z'"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"u LaUgH aT mE BeCaUsE I aM diFfeRent"'),e("\n"),a("span",{class:"token string"},'"uagameasadifeent"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token punctuation"},"("),e("`"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token punctuation"},"["),a("span",{class:"token char string"},"'A'"),a("span",{class:"token operator"},".."),a("span",{class:"token char string"},"'Z'"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"i lauGh At You BecAuse u r aLL the Same"'),e("\n"),a("span",{class:"token string"},'"GAYBALLS"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br")])],-1),tl=a("h4",{id:"fold-函数与-scan-函数"},[a("a",{class:"header-anchor",href:"#fold-函数与-scan-函数","aria-hidden":"true"},"#"),e(" fold 函数与 scan 函数")],-1),ll=a("p",null,[a("img",{src:"/awesome-notes/assets/foldl.8f7f9807.png",alt:"折叠函数"})],-1),ol=a("blockquote",null,[a("p",null,"如图中所示,左折叠时将 acc 视为第 0 个元素;右折叠时将 acc 视为最后一个元素.")],-1),pl=a("ul",null,[a("li",null,[e("三要素: "),a("ul",null,[a("li",null,"二元函数 \\acc x -> function 或 \\x acc -> function"),a("li",null,"初始累加值"),a("li",null,"待折叠 List")])]),a("li",null,[e("工作原理: "),a("ul",null,[a("li",null,"不断从 List 中取出元素,进行二元函数调用,直至 List 被取空"),a("li",null,"调用参数分别为 新取出元素 x 与 之前 n 次调用后的累加值 acc"),a("li",null,"返回值作为下次调用的累加值 acc")])]),a("li",null,[e("左折叠函数 "),a("ul",null,[a("li",null,[e("foldl "),a("code",null,"\\acc x ->")]),a("li",null,"foldl1: 取 List 首元素作为初始累加值")])])],-1),cl=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"foldl"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Foldable"),e(),a("span",{class:"token hvariable"},"t"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),rl=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"sum"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token builtin"},"sum"),e("' "),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"foldl"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"acc"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"acc"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token number"},"0"),e(),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),ul=a("ul",null,[a("li",null,[e("右折叠函数 "),a("ul",null,[a("li",null,[e("foldr "),a("code",null,"\\x acc ->")]),a("li",null,"foldr1: 取 List 尾元素作为初始累加值")])])],-1),il=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"foldr"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Foldable"),e(),a("span",{class:"token hvariable"},"t"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),kl=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"map"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"map"),e("' "),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"foldr"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"acc"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},":"),e(),a("span",{class:"token hvariable"},"acc"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),bl=a("ul",null,[a("li",null,"更多范例")],-1),ml=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"maximum"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Ord"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token builtin"},"maximum"),e("' "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"foldr1"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"acc"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"acc"),e(),a("span",{class:"token keyword"},"then"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token hvariable"},"acc"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token builtin"},"reverse"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"reverse"),e("' "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"foldl"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"acc"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},":"),e(),a("span",{class:"token hvariable"},"acc"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token builtin"},"product"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token builtin"},"product"),e("' "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"foldr1"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token builtin"},"filter"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Bool"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"filter"),e("' "),a("span",{class:"token hvariable"},"p"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"foldr"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"acc"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token hvariable"},"p"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token keyword"},"then"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},":"),e(),a("span",{class:"token hvariable"},"acc"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token hvariable"},"acc"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token builtin"},"head"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token builtin"},"head"),e("' "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"foldr1"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token builtin"},"last"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token builtin"},"last"),e("' "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"foldl1"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br")])],-1),hl=a("ul",null,[a("li",null,"scanl/scanr/scanl1/scanr1 函数会将每次折叠的结果都记录在一个 List 中")],-1),dl=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"scanl"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"+"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token number"},"0"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"11"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"scanr"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"+"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token number"},"0"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"11"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"scanl1"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"acc"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"acc"),e(),a("span",{class:"token keyword"},"then"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token hvariable"},"acc"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"scanl"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"flip"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},":"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),vl=a("ul",null,[a("li",null,"逆波兰表达式")],-1),gl=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Data.List")]),e("\n\n"),a("span",{class:"token hvariable"},"solveRPN"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"solveRPN"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"head"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"foldl"),e(),a("span",{class:"token hvariable"},"foldingFunction"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"words"),e("\n"),a("span",{class:"token keyword"},"where"),e(" "),a("span",{class:"token hvariable"},"foldingFunction"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"y"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"ys"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"*"'),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"ys"),e("\n "),a("span",{class:"token hvariable"},"foldingFunction"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"y"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"ys"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"+"'),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"ys"),e("\n "),a("span",{class:"token hvariable"},"foldingFunction"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"y"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"ys"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"-"'),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"-"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"ys"),e("\n "),a("span",{class:"token hvariable"},"foldingFunction"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"y"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"ys"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"/"'),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"/"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"ys"),e("\n "),a("span",{class:"token hvariable"},"foldingFunction"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"y"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"ys"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"^"'),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"**"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"ys"),e("\n "),a("span",{class:"token hvariable"},"foldingFunction"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"ln"'),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"log"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),e("\n "),a("span",{class:"token hvariable"},"foldingFunction"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token string"},'"sum"'),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token builtin"},"sum"),e(),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token hvariable"},"foldingFunction"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token hvariable"},"numberString"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"read"),e(),a("span",{class:"token hvariable"},"numberString"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br")])],-1),yl=a("h4",{id:"lambda-表达式"},[a("a",{class:"header-anchor",href:"#lambda-表达式","aria-hidden":"true"},"#"),e(" lambda 表达式")],-1),fl=a("p",null,[a("code",null,"\\args -> function")],-1),wl=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"zipWith"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token number"},"30"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"/"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"153.0"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"61.5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"31.0"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"15.75"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6.6"),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token builtin"},"flip"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"c"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"c"),e("\n"),a("span",{class:"token builtin"},"flip"),e("' "),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token hvariable"},"x"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),xl=a("h4",{id:"函数-1"},[a("a",{class:"header-anchor",href:"#函数-1","aria-hidden":"true"},"#"),e(" $函数")],-1),Sl=a("p",null,[a("code",null,"($) :: (a -> b) -> a -> b")],-1),Ll=a("ul",null,[a("li",null,"特性: 优先级最低,右结合"),a("li",null,"功能: 改变优先级,相当于在右方添加括号")],-1),Ml=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"g"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"z"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"<->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"g"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"z"),e(),a("span",{class:"token hvariable"},"x"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),Fl=a("h4",{id:"函数与-function-composition-函数组合"},[a("a",{class:"header-anchor",href:"#函数与-function-composition-函数组合","aria-hidden":"true"},"#"),e(" .函数与 Function composition(函数组合)")],-1),Tl=a("p",null,[a("code",null,"(.) :: (b -> c) -> (a -> b) -> a -> c")],-1),Il=a("p",null,[a("code",null,"f . g = \\x -> f (g x)"),e(" - f 的参数类型必须与 g 的返回值类型相同")],-1),Al=a("ul",null,[a("li",null,"功能: 可以去除函数调用括号")],-1),Cl=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"fn"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"ceiling"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"negate"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"tan"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"cos"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"max"),e(),a("span",{class:"token number"},"50"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token operator"},"->"),e(" 去括号"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token hvariable"},"fn"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"ceiling"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"negate"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"tan"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"cos"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"max"),e(),a("span",{class:"token number"},"50"),e(),a("span",{class:"token hvariable"},"x"),e("\n"),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Curry"),e("化"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token hvariable"},"fn"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"ceiling"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"negate"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"tan"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"cos"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"max"),e(),a("span",{class:"token number"},"50"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),Ol=a("ul",null,[a("li",null,"Best Practice: 三种不同的函数写法")],-1),Nl=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"oddSquareSum"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Integer"),e("\n"),a("span",{class:"token hvariable"},"oddSquareSum"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"sum"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"takeWhile"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"<"),a("span",{class:"token number"},"10000"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token builtin"},"odd"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"^"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"oddSquareSum"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Integer"),e("\n"),a("span",{class:"token hvariable"},"oddSquareSum"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"sum"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"takeWhile"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"<"),a("span",{class:"token number"},"10000"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token builtin"},"odd"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"^"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token hvariable"},"oddSquareSum"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Integer"),e("\n"),a("span",{class:"token hvariable"},"oddSquareSum"),e(),a("span",{class:"token operator"},"="),e("\n "),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"oddSquares"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token builtin"},"odd"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"^"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token hvariable"},"belowLimit"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"takeWhile"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"<"),a("span",{class:"token number"},"10000"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"oddSquares"),e("\n "),a("span",{class:"token keyword"},"in"),e(" "),a("span",{class:"token builtin"},"sum"),e(),a("span",{class:"token hvariable"},"belowLimit"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),Bl=a("h3",{id:"常用函数"},[a("a",{class:"header-anchor",href:"#常用函数","aria-hidden":"true"},"#"),e(" 常用函数")],-1),Wl=a("h4",{id:"无参函数"},[a("a",{class:"header-anchor",href:"#无参函数","aria-hidden":"true"},"#"),e(" 无参函数")],-1),El=a("p",null,"“定义”(或者“名字”)",-1),$l=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"sabertaz"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"It\'s a-me, sabertaz!"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),Pl=a("h4",{id:"前缀函数"},[a("a",{class:"header-anchor",href:"#前缀函数","aria-hidden":"true"},"#"),e(" 前缀函数")],-1),ql=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"succ"),e(),a("span",{class:"token number"},"8"),e("\n"),a("span",{class:"token number"},"9"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Rl=a("p",null,"`FunctionName` - 可使前缀函数变为中缀函数",-1),zl=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token operator"},">"),e(),a("span",{class:"token number"},"92"),e(" `"),a("span",{class:"token builtin"},"div"),e("` "),a("span",{class:"token number"},"10"),e("\n"),a("span",{class:"token number"},"9"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Dl=a("h4",{id:"中缀函数"},[a("a",{class:"header-anchor",href:"#中缀函数","aria-hidden":"true"},"#"),e(" 中缀函数")],-1),Jl=a("p",null,[a("code",null,"+"),e(": 从类型定义可以看出,+左右两边参数必须为同类型")],-1),Gl=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"+"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"+"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),_l=a("p",null,[a("code",null,"++"),e(": List 连接符,遍历前一 List")],-1),Hl=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"11"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"12"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"11"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"12"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token string"},'"hello"'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token string"},'" "'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token string"},'"world"'),e("\n"),a("span",{class:"token string"},'"hello world"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Kl=a("p",null,[a("code",null,":"),e(": 连接单个元素")],-1),Yl=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token char string"},"'A'"),a("span",{class:"token operator"},":"),a("span",{class:"token string"},'" SMALL CAT"'),e("\n"),a("span",{class:"token string"},'"A SMALL CAT"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token number"},"5"),a("span",{class:"token operator"},":"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Vl=a("p",null,[a("code",null,"!!"),e(": 引用符")],-1),Ul=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"9.4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"33.2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"96.2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"11.2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"23.25"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"!!"),e(),a("span",{class:"token number"},"1"),e("\n"),a("span",{class:"token number"},"33.2"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Zl=a("h4",{id:"数学函数"},[a("a",{class:"header-anchor",href:"#数学函数","aria-hidden":"true"},"#"),e(" 数学函数")],-1),jl=a("ul",null,[a("li",null,[e("x "),a("code",null,"mod"),e(" y")]),a("li",null,[a("code",null,"even arg")]),a("li",null,[a("code",null,"odd arg")])],-1),Ql=a("h5",{id:"system-random"},[a("a",{class:"header-anchor",href:"#system-random","aria-hidden":"true"},"#"),e(" System Random")],-1),Xl=a("ul",null,[a("li",null,[a("code",null,"random :: (RandomGen g, Random a) => g -> (a, g)")]),a("li",null,"getStdGen"),a("li",null,"newStdGen")],-1),no=a("h4",{id:"数字函数"},[a("a",{class:"header-anchor",href:"#数字函数","aria-hidden":"true"},"#"),e(" 数字函数")],-1),so=a("ul",null,[a("li",null,"fromInteger 函数 (Num a) => Integer -> a"),a("li",null,"fromIntegral 函数 (Integral a, Num b) => a -> b")],-1),ao=a("h2",{id:"模块"},[a("a",{class:"header-anchor",href:"#模块","aria-hidden":"true"},"#"),e(" 模块")],-1),eo=a("h3",{id:"import"},[a("a",{class:"header-anchor",href:"#import","aria-hidden":"true"},"#"),e(" import")],-1),to=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Data.List")]),e("\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Data.List")]),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"nub"),e(","),a("span",{class:"token builtin"},"sort"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Data.List "),a("span",{class:"token keyword"},"hiding")]),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"nub"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),lo=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(),a("span",{class:"token keyword"},"qualified"),e(" Data.Map")]),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),oo=a("p",null,"调用 Map 中的 filter 时,必须使用 Data.Map.filter.",-1),po=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(),a("span",{class:"token keyword"},"qualified"),e(" Data.Map "),a("span",{class:"token keyword"},"as"),e(" M")]),e("\n\n"),a("span",{class:"token constant"},"Data.Map"),a("span",{class:"token punctuation"},"."),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token operator"},"<->"),e(),a("span",{class:"token constant"},"M"),a("span",{class:"token punctuation"},"."),a("span",{class:"token builtin"},"filter"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),co=a("h3",{id:"建立模块"},[a("a",{class:"header-anchor",href:"#建立模块","aria-hidden":"true"},"#"),e(" 建立模块")],-1),ro=a("h4",{id:"单一模块"},[a("a",{class:"header-anchor",href:"#单一模块","aria-hidden":"true"},"#"),e(" 单一模块")],-1),uo=a("p",null,[e("新建一个 "),a("code",null,"Geometry.hs"),e(" 的文件")],-1),io=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e(),a("span",{class:"token constant"},"Geometry"),e("\n"),a("span",{class:"token punctuation"},"("),e(),a("span",{class:"token hvariable"},"sphereVolume"),e("\n,"),a("span",{class:"token hvariable"},"sphereArea"),e("\n,"),a("span",{class:"token hvariable"},"cubeVolume"),e("\n,"),a("span",{class:"token hvariable"},"cubeArea"),e("\n,"),a("span",{class:"token hvariable"},"cuboidArea"),e("\n,"),a("span",{class:"token hvariable"},"cuboidVolume"),e("\n"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n\n"),a("span",{class:"token hvariable"},"sphereVolume"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"sphereVolume"),e(),a("span",{class:"token hvariable"},"radius"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4.0"),e(),a("span",{class:"token operator"},"/"),e(),a("span",{class:"token number"},"3.0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token builtin"},"pi"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"radius"),e(),a("span",{class:"token operator"},"^"),e(),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"sphereArea"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"sphereArea"),e(),a("span",{class:"token hvariable"},"radius"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"4"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token builtin"},"pi"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"radius"),e(),a("span",{class:"token operator"},"^"),e(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"cubeVolume"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"cubeVolume"),e(),a("span",{class:"token hvariable"},"side"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"cuboidVolume"),e(),a("span",{class:"token hvariable"},"side"),e(),a("span",{class:"token hvariable"},"side"),e(),a("span",{class:"token hvariable"},"side"),e("\n\n"),a("span",{class:"token hvariable"},"cubeArea"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"cubeArea"),e(),a("span",{class:"token hvariable"},"side"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"cuboidArea"),e(),a("span",{class:"token hvariable"},"side"),e(),a("span",{class:"token hvariable"},"side"),e(),a("span",{class:"token hvariable"},"side"),e("\n\n"),a("span",{class:"token hvariable"},"cuboidVolume"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"cuboidVolume"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"rectangleArea"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token hvariable"},"c"),e("\n\n"),a("span",{class:"token hvariable"},"cuboidArea"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"cuboidArea"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"="),e("\n "),a("span",{class:"token hvariable"},"rectangleArea"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token number"},"2"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"rectangleArea"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token number"},"2"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"rectangleArea"),e(),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token number"},"2"),e("\n\n"),a("span",{class:"token hvariable"},"rectangleArea"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"rectangleArea"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token hvariable"},"b"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br")])],-1),ko=a("ul",null,[a("li",null,"使用")],-1),bo=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Geometry")]),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),mo=a("h4",{id:"子模块"},[a("a",{class:"header-anchor",href:"#子模块","aria-hidden":"true"},"#"),e(" 子模块")],-1),ho=a("p",null,[e("把 "),a("code",null,"Geometry"),e(" 分成三个子模块")],-1),vo=a("p",null,[e("建立一个 "),a("code",null,"Geometry"),e(" 文件夹(注意"),a("em",null,"首字母"),e("要大写),新建三个文件")],-1),go=a("ul",null,[a("li",null,"sphere.hs")],-1),yo=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e(),a("span",{class:"token constant"},"Geometry.Sphere"),e("\n"),a("span",{class:"token punctuation"},"("),e(),a("span",{class:"token hvariable"},"volume"),e("\n,"),a("span",{class:"token hvariable"},"area"),e("\n"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n\n"),a("span",{class:"token hvariable"},"volume"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"volume"),e(),a("span",{class:"token hvariable"},"radius"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4.0"),e(),a("span",{class:"token operator"},"/"),e(),a("span",{class:"token number"},"3.0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token builtin"},"pi"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"radius"),e(),a("span",{class:"token operator"},"^"),e(),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"area"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"area"),e(),a("span",{class:"token hvariable"},"radius"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"4"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token builtin"},"pi"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"radius"),e(),a("span",{class:"token operator"},"^"),e(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br")])],-1),fo=a("ul",null,[a("li",null,"cuboid.hs")],-1),wo=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e(),a("span",{class:"token constant"},"Geometry.Cuboid"),e("\n"),a("span",{class:"token punctuation"},"("),e(),a("span",{class:"token hvariable"},"volume"),e("\n,"),a("span",{class:"token hvariable"},"area"),e("\n"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n\n"),a("span",{class:"token hvariable"},"volume"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"volume"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"rectangleArea"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token hvariable"},"c"),e("\n\n"),a("span",{class:"token hvariable"},"area"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"area"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"="),e("\n "),a("span",{class:"token hvariable"},"rectangleArea"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token number"},"2"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"rectangleArea"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token number"},"2"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"rectangleArea"),e(),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token number"},"2"),e("\n\n"),a("span",{class:"token hvariable"},"rectangleArea"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"rectangleArea"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token hvariable"},"b"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br")])],-1),xo=a("ul",null,[a("li",null,"cube.hs")],-1),So=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e(),a("span",{class:"token constant"},"Geometry.Cube"),e("\n"),a("span",{class:"token punctuation"},"("),e(),a("span",{class:"token hvariable"},"volume"),e("\n,"),a("span",{class:"token hvariable"},"area"),e("\n"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(),a("span",{class:"token keyword"},"qualified"),e(" Geometry.Cuboid "),a("span",{class:"token keyword"},"as"),e(" Cuboid")]),e("\n\n"),a("span",{class:"token hvariable"},"volume"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"volume"),e(),a("span",{class:"token hvariable"},"side"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"Cuboid.volume"),e(),a("span",{class:"token hvariable"},"side"),e(),a("span",{class:"token hvariable"},"side"),e(),a("span",{class:"token hvariable"},"side"),e("\n\n"),a("span",{class:"token hvariable"},"area"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"area"),e(),a("span",{class:"token hvariable"},"side"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"Cuboid.area"),e(),a("span",{class:"token hvariable"},"side"),e(),a("span",{class:"token hvariable"},"side"),e(),a("span",{class:"token hvariable"},"side"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br")])],-1),Lo=a("ul",null,[a("li",null,"使用")],-1),Mo=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Geometry.Sphere")]),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),Fo=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(),a("span",{class:"token keyword"},"qualified"),e(" Geometry.Sphere "),a("span",{class:"token keyword"},"as"),e(" Sphere")]),e("\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(),a("span",{class:"token keyword"},"qualified"),e(" Geometry.Cuboid "),a("span",{class:"token keyword"},"as"),e(" Cuboid")]),e("\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(),a("span",{class:"token keyword"},"qualified"),e(" Geometry.Cube "),a("span",{class:"token keyword"},"as"),e(" Cube")]),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),To=a("h3",{id:"常用基础模块"},[a("a",{class:"header-anchor",href:"#常用基础模块","aria-hidden":"true"},"#"),e(" 常用基础模块")],-1),Io=a("p",null,[a("a",{href:"https://github.com/MnO2/learnyouahaskell-zh/blob/develop/zh-cn/ch07/module.md",target:"_blank",rel:"noopener noreferrer"},"Learn you a haskell for great good")],-1),Ao=a("h4",{id:"data-list"},[a("a",{class:"header-anchor",href:"#data-list","aria-hidden":"true"},"#"),e(" Data.List")],-1),Co=a("ul",null,[a("li",null,"intersperse"),a("li",null,"intercalate"),a("li",null,"transpose")],-1),Oo=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"transpose"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"transpose"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"hey"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"there"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"guys"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"htg"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"ehu"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"yey"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"rs"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"e"'),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),No=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token builtin"},"sum"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"transpose"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"18"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"17"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Bo=a("p",null,[a("strong",null,"foldl'"),e(" 和 "),a("strong",null,"foldl1'"),e(" 是它们各自惰性实现的严格版本,可"),a("em",null,"防止溢出"),e("问题.")],-1),Wo=a("p",null,[a("strong",null,"concat"),e(" - 移除一级嵌套")],-1),Eo=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"concat"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"foo"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"bar"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"car"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token string"},'"foobarcar"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"concat"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),$o=a("p",null,[a("strong",null,"concatMap"),e(" 函数与 "),a("code",null,"map"),e(" 一个 List 之后再 "),a("code",null,"concat"),e(" 它等价")],-1),Po=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"concatMap"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"replicate"),e(),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),qo=a("p",null,"and",-1),Ro=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"and"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},">"),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"and"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"=="),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"False"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),zo=a("p",null,"or",-1),Do=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"or"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"=="),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"or"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},">"),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"False"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Jo=a("p",null,[a("strong",null,"any"),e(" 和 "),a("strong",null,"all"),e(" 使用 "),a("code",null,"any"),e(" 或 "),a("code",null,"all"),e(" 会更多些")],-1),Go=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"any"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"=="),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"all"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},">"),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"all"),e(),a("span",{class:"token punctuation"},"("),e("`"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token punctuation"},"["),a("span",{class:"token char string"},"'A'"),a("span",{class:"token operator"},".."),a("span",{class:"token char string"},"'Z'"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"HEYGUYSwhatsup"'),e("\n"),a("span",{class:"token constant"},"False"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"any"),e(),a("span",{class:"token punctuation"},"("),e("`"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token punctuation"},"["),a("span",{class:"token char string"},"'A'"),a("span",{class:"token operator"},".."),a("span",{class:"token char string"},"'Z'"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"HEYGUYSwhatsup"'),e("\n"),a("span",{class:"token constant"},"True"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),_o=a("p",null,[a("strong",null,"iterate"),e(" 取一个函数和一个值作参数。它会用该值去调用该函数并用所得的结果再次调用该函数,产生一个无限的 List.")],-1),Ho=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"take"),e(),a("span",{class:"token number"},"10"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"iterate"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token number"},"1"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"16"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"32"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"64"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"128"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"256"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"512"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"take"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"iterate"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token string"},'"haha"'),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"haha"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"haha"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"hahahaha"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"hahahahahaha"'),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Ko=a("p",null,"splitAt",-1),Yo=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"splitAt"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token string"},'"heyman"'),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"hey"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"man"'),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"splitAt"),e(),a("span",{class:"token number"},"100"),e(),a("span",{class:"token string"},'"heyman"'),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"heyman"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'""'),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"splitAt"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"heyman"'),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'""'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"heyman"'),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"splitAt"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token string"},'"foobar"'),e(),a("span",{class:"token keyword"},"in"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token string"},'"barfoo"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),Vo=a("p",null,[a("strong",null,"takeWhile"),e(" 一旦遇到不符合条件的某元素就停止")],-1),Uo=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"takeWhile"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},">"),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"takeWhile"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"/="),a("span",{class:"token char string"},"' '"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"This is a sentence"'),e("\n"),a("span",{class:"token string"},'"This"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Zo=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"sum"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"takeWhile"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"<"),a("span",{class:"token number"},"10000"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"^"),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token number"},"53361"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),jo=a("p",null,[a("strong",null,"dropWhile"),e(" 扔掉符合条件的元素。一旦限制条件返回 "),a("code",null,"False"),e(",它就返回 List 的余下部分")],-1),Qo=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"dropWhile"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"/="),a("span",{class:"token char string"},"' '"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"This is a sentence"'),e("\n"),a("span",{class:"token string"},'" is a sentence"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"dropWhile"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"<"),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Xo=a("p",null,[a("strong",null,"span"),e(" - 扩展"),a("code",null,"takeWhile")],-1),np=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"fw"),e(","),a("span",{class:"token hvariable"},"rest"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"span"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"/="),a("span",{class:"token char string"},"' '"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token operator"},"\\"),e(),a("span",{class:"token string"},'"This is a sentence"'),e(),a("span",{class:"token keyword"},"in"),e(),a("span",{class:"token string"},'"First word:"'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token hvariable"},"fw"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token string"},'",the rest:"'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token hvariable"},"rest"),e("\n"),a("span",{class:"token string"},'"First word: This,the rest: is a sentence"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),sp=a("p",null,[a("strong",null,"break"),e(" - 取反"),a("code",null,"span")],-1),ap=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"break"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"=="),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"span"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"/="),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),ep=a("p",null,"sort",-1),tp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"sort"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"sort"),e(),a("span",{class:"token string"},'"This will be sorted soon"'),e("\n"),a("span",{class:"token string"},'" Tbdeehiillnooorssstw"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),lp=a("p",null,"group",-1),op=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"group"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),pp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"l"),a("span",{class:"token operator"},"@"),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},","),a("span",{class:"token builtin"},"length"),e(),a("span",{class:"token hvariable"},"l"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"group"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"sort"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),cp=a("p",null,[a("strong",null,"inits"),e(" 和 "),a("strong",null,"tails")],-1),rp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"inits"),e(),a("span",{class:"token string"},'"w00t"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'""'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"w"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"w0"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"w00"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"w00t"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"tails"),e(),a("span",{class:"token string"},'"w00t"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"w00t"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"00t"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"0t"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"t"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'""'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"w"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"w00t"'),e(),a("span",{class:"token keyword"},"in"),e(),a("span",{class:"token builtin"},"zip"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"inits"),e(),a("span",{class:"token hvariable"},"w"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"tails"),e(),a("span",{class:"token hvariable"},"w"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'""'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"w00t"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"w"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"00t"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"w0"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"0t"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"w00"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"t"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"w00t"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'""'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),up=a("p",null,[a("strong",null,"isInfixOf"),e(" 从一个 List 中搜索一个子 List")],-1),ip=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"search"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Eq"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Bool"),e("\n"),a("span",{class:"token hvariable"},"search"),e(),a("span",{class:"token hvariable"},"needle"),e(),a("span",{class:"token hvariable"},"haystack"),e(),a("span",{class:"token operator"},"="),e("\n "),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"nLen"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"length"),e(),a("span",{class:"token hvariable"},"needle"),e("\n "),a("span",{class:"token keyword"},"in"),e(),a("span",{class:"token builtin"},"foldl"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"acc"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token builtin"},"take"),e(),a("span",{class:"token hvariable"},"nLen"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token hvariable"},"needle"),e(),a("span",{class:"token keyword"},"then"),e(),a("span",{class:"token constant"},"True"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token hvariable"},"acc"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token constant"},"False"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"tails"),e(),a("span",{class:"token hvariable"},"haystack"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),kp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token string"},'"cat"'),e(),a("span",{class:"token operator"},"`isInfixOf`"),e(),a("span",{class:"token string"},'"im a cat burglar"'),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token string"},'"Cat"'),e(),a("span",{class:"token operator"},"`isInfixOf`"),e(),a("span",{class:"token string"},'"im a cat burglar"'),e("\n"),a("span",{class:"token constant"},"False"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token string"},'"cats"'),e(),a("span",{class:"token operator"},"`isInfixOf`"),e(),a("span",{class:"token string"},'"im a cat burglar"'),e("\n"),a("span",{class:"token constant"},"False"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),bp=a("p",null,[a("strong",null,"isPrefixOf"),e(" 与 "),a("strong",null,"isSuffixOf")],-1),mp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token string"},'"hey"'),e(),a("span",{class:"token operator"},"`isPrefixOf`"),e(),a("span",{class:"token string"},'"hey there!"'),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token string"},'"hey"'),e(),a("span",{class:"token operator"},"`isPrefixOf`"),e(),a("span",{class:"token string"},'"oh hey there!"'),e("\n"),a("span",{class:"token constant"},"False"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token string"},'"there!"'),e(),a("span",{class:"token operator"},"`isSuffixOf`"),e(),a("span",{class:"token string"},'"oh hey there!"'),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token string"},'"there!"'),e(),a("span",{class:"token operator"},"`isSuffixOf`"),e(),a("span",{class:"token string"},'"oh hey there"'),e("\n"),a("span",{class:"token constant"},"False"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),hp=a("p",null,[a("strong",null,"elem"),e(" 与 "),a("strong",null,"notElem")],-1),dp=a("p",null,"partition",-1),vp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"partition"),e(),a("span",{class:"token punctuation"},"("),e("`"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token punctuation"},"["),a("span",{class:"token char string"},"'A'"),a("span",{class:"token operator"},".."),a("span",{class:"token char string"},"'Z'"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"BOBsidneyMORGANeddy"'),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"BOBMORGAN"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"sidneyeddy"'),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"partition"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},">"),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),gp=a("p",null,"find",-1),yp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"find"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},">"),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"5"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"find"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},">"),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"Nothing"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token hvariable"},"find"),e("\n"),a("span",{class:"token hvariable"},"find"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Bool"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token hvariable"},"a"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),fp=a("p",null,[a("strong",null,"elemIndex"),e(" '可能' (Maybe)返回我们找的元素的索引,若这一元素不存在,就返回 "),a("code",null,"Nothing"),e(".")],-1),wp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token hvariable"},"elemIndex"),e("\n"),a("span",{class:"token hvariable"},"elemIndex"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Eq"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token constant"},"Int"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token number"},"4"),e(),a("span",{class:"token operator"},"`elemIndex`"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"3"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token number"},"10"),e(),a("span",{class:"token operator"},"`elemIndex`"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"Nothing"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),xp=a("p",null,[a("strong",null,"elemIndices"),e(" 与"),a("code",null,"elemIndex"),e("相似.")],-1),Sp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token char string"},"' '"),e(),a("span",{class:"token operator"},"`elemIndices`"),e(),a("span",{class:"token string"},'"Where are the spaces?"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"13"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Lp=a("p",null,[a("strong",null,"findIndex"),e(" 与 "),a("code",null,"find"),e(" 相似. "),a("strong",null,"findIndices"),e(" 返回所有符合条件的索引.")],-1),Mp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"findIndex"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"=="),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"5"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"findIndex"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"=="),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"Nothing"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"findIndices"),e(),a("span",{class:"token punctuation"},"("),e("`"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token punctuation"},"["),a("span",{class:"token char string"},"'A'"),a("span",{class:"token operator"},".."),a("span",{class:"token char string"},"'Z'"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"Where Are The Caps?"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"14"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),Fp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"zipWith3"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token hvariable"},"z"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"z"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"zip4"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Tp=a("p",null,[e("在处理来自文件或其它地方的输入时,"),a("strong",null,"lines"),e(" 会非常有用.")],-1),Ip=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"lines"),e(),a("span",{class:"token string"},'"first line\\nsecond line\\nthird line"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"first line"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"second line"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"third line"'),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Ap=a("p",null,[a("strong",null,"unlines"),e(" 是 "),a("code",null,"lines"),e(" 的反函数.")],-1),Cp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"unlines"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"first line"'),e(","),a("span",{class:"token string"},'"second line"'),e(","),a("span",{class:"token string"},'"third line"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token string"},'"first line\\nsecond line\\nthird line\\n"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Op=a("p",null,[a("strong",null,"words"),e(" 和 "),a("strong",null,"unwords"),e(" 可以把一个字串分为一组单词或执行相反的操作.")],-1),Np=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"words"),e(),a("span",{class:"token string"},'"hey these are the words in this sentence"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"hey"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"these"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"are"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"the"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"words"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"in"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"this"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"sentence"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"words"),e(),a("span",{class:"token string"},'"hey these are the words in this\\nsentence"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"hey"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"these"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"are"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"the"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"words"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"in"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"this"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"sentence"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"unwords"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"hey"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"there"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"mate"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token string"},'"hey there mate"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),Bp=a("p",null,[a("strong",null,"nub"),e(" 可以将一个 List 中的重复元素全部筛掉.")],-1),Wp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"nub"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"nub"),e(),a("span",{class:"token string"},'"Lots of words and stuff"'),e("\n"),a("span",{class:"token string"},'"Lots fwrdanu"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Ep=a("p",null,"delete",-1),$p=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"delete"),e(),a("span",{class:"token char string"},"'h'"),e(),a("span",{class:"token string"},'"hey there ghang!"'),e("\n"),a("span",{class:"token string"},'"ey there ghang!"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"delete"),e(),a("span",{class:"token char string"},"'h'"),a("span",{class:"token operator"}," . "),a("span",{class:"token hvariable"},"delete"),e(),a("span",{class:"token char string"},"'h'"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token string"},'"hey there ghang!"'),e("\n"),a("span",{class:"token string"},'"ey tere ghang!"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"delete"),e(),a("span",{class:"token char string"},"'h'"),a("span",{class:"token operator"}," . "),a("span",{class:"token hvariable"},"delete"),e(),a("span",{class:"token char string"},"'h'"),a("span",{class:"token operator"}," . "),a("span",{class:"token hvariable"},"delete"),e(),a("span",{class:"token char string"},"'h'"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token string"},'"hey there ghang!"'),e("\n"),a("span",{class:"token string"},'"ey tere gang!"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),Pp=a("p",null,[a("strong",null,"\\"),e(" 差集")],-1),qp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"\\\\"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token string"},'"Im a big baby"'),e(),a("span",{class:"token operator"},"\\\\"),e(),a("span",{class:"token string"},'"big"'),e("\n"),a("span",{class:"token string"},'"Im a baby"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Rp=a("p",null,[a("strong",null,"union"),e(" 并集")],-1),zp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token string"},'"hey man"'),e(),a("span",{class:"token operator"},"`union`"),e(),a("span",{class:"token string"},'"man what\'s up"'),e("\n"),a("span",{class:"token string"},'"hey manwt\'sup"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"`union`"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Dp=a("p",null,[a("strong",null,"intersection"),e(" 交集")],-1),Jp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"`intersect`"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Gp=a("p",null,"insert",-1),_p=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"insert"),e(),a("span",{class:"token number"},"4"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"insert"),e(),a("span",{class:"token char string"},"'g'"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token char string"},"'a'"),a("span",{class:"token operator"},".."),a("span",{class:"token char string"},"'f'"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token char string"},"'h'"),a("span",{class:"token operator"},".."),a("span",{class:"token char string"},"'z'"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token string"},'"abcdefghijklmnopqrstuvwxyz"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"insert"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),Hp=a("h5",{id:"修正-prelude-模块"},[a("a",{class:"header-anchor",href:"#修正-prelude-模块","aria-hidden":"true"},"#"),e(" 修正 Prelude 模块")],-1),Kp=a("p",null,[a("code",null,"length"),e(","),a("code",null,"take"),e(","),a("code",null,"drop"),e(","),a("code",null,"splitAt"),e(","),a("code",null,"!!"),e(" 和 "),a("code",null,"replicate"),a("code",null,"Data.List"),e(" 中包含了更通用的替代版,如: "),a("code",null,"genericLength,genericTake,genericDrop,genericSplitAt,genericIndex"),e(" 和 "),a("code",null,"genericReplicate")],-1),Yp=a("p",null,[a("code",null,"nub"),e(", "),a("code",null,"delete"),e(", "),a("code",null,"union"),e(", "),a("code",null,"intsect"),e(" 和 "),a("code",null,"group"),e(" 函数 也有各自的通用替代版 "),a("code",null,"nubBy"),e(","),a("code",null,"deleteBy"),e(","),a("code",null,"unionBy"),e(","),a("code",null,"intersectBy"),e(" 和 "),a("code",null,"groupBy"),e(", 它们的区别就是前一组函数使用 "),a("code",null,"(==)"),e(" 来测试是否相等,而带 "),a("code",null,"By"),e(" 的那组则取一个函数作参数来判定相等性.")],-1),Vp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"values"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"4.3"),e(","),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"2.4"),e(","),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1.2"),e(","),a("span",{class:"token number"},"0.4"),e(","),a("span",{class:"token number"},"2.3"),e(","),a("span",{class:"token number"},"5.9"),e(","),a("span",{class:"token number"},"10.5"),e(","),a("span",{class:"token number"},"29.1"),e(","),a("span",{class:"token number"},"5.3"),e(","),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"2.4"),e(","),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"14.5"),e(","),a("span",{class:"token number"},"2.9"),e(","),a("span",{class:"token number"},"2.3"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"groupBy"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},">"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},">"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"values"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"4.3"),a("span",{class:"token punctuation"},","),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"2.4"),a("span",{class:"token punctuation"},","),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1.2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0.4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2.3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5.9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10.5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"29.1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5.3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"2.4"),a("span",{class:"token punctuation"},","),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"14.5"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2.9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2.3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),Up=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"on"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"c"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"c"),e("\n"),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"`on`"),e(),a("span",{class:"token hvariable"},"g"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"g"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"g"),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Zp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"groupBy"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"=="),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"`on`"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},">"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"values"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"4.3"),a("span",{class:"token punctuation"},","),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"2.4"),a("span",{class:"token punctuation"},","),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1.2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0.4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2.3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5.9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10.5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"29.1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5.3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"2.4"),a("span",{class:"token punctuation"},","),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"14.5"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2.9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2.3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),jp=a("p",null,[a("code",null,"sort"),e(","),a("code",null,"insert"),e(","),a("code",null,"maximum"),e(" 和 "),a("code",null,"min"),e(" 都有各自的通用版本。 如 "),a("code",null,"groupBy"),e(" 类似,"),a("strong",null,"sortBy"),e(","),a("strong",null,"insertBy"),e(","),a("strong",null,"maximumBy"),e(" 和 "),a("strong",null,"minimumBy"),e(" 都取一个函数来比较两个元素的大小.")],-1),Qp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"sortBy"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"compare"),e(),a("span",{class:"token operator"},"`on`"),e(),a("span",{class:"token builtin"},"length"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"xs"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),Xp=a("h4",{id:"data-char"},[a("a",{class:"header-anchor",href:"#data-char","aria-hidden":"true"},"#"),e(" Data Char")],-1),nc=a("ul",null,[a("li",null,[a("strong",null,"isControl"),e(" 判断一个字符是否是控制字符。")]),a("li",null,[a("strong",null,"isSpace"),e(" 判断一个字符是否是空格字符,包括空格,tab,换行符等.")]),a("li",null,[a("strong",null,"isLower"),e(" 判断一个字符是否为小写.")]),a("li",null,[a("strong",null,"isUpper"),e(" 判断一个字符是否为大写。")]),a("li",null,[a("strong",null,"isAlpha"),e(" 判断一个字符是否为字母.")]),a("li",null,[a("strong",null,"isAlphaNum"),e(" 判断一个字符是否为字母或数字.")]),a("li",null,[a("strong",null,"isPrint"),e(" 判断一个字符是否是可打印的.")]),a("li",null,[a("strong",null,"isDigit"),e(" 判断一个字符是否为数字.")]),a("li",null,[a("strong",null,"isOctDigit"),e(" 判断一个字符是否为八进制数字.")]),a("li",null,[a("strong",null,"isHexDigit"),e(" 判断一个字符是否为十六进制数字.")]),a("li",null,[a("strong",null,"isLetter"),e(" 判断一个字符是否为字母.")]),a("li",null,[a("strong",null,"isMark"),e(" 判断是否为 unicode 注音字符,你如果是法国人就会经常用到的.")]),a("li",null,[a("strong",null,"isNumber"),e(" 判断一个字符是否为数字.")]),a("li",null,[a("strong",null,"isPunctuation"),e(" 判断一个字符是否为标点符号.")]),a("li",null,[a("strong",null,"isSymbol"),e("判断一个字符是否为货币符号.")]),a("li",null,[a("strong",null,"isSeparator"),e(" 判断一个字符是否为 unicode 空格或分隔符.")]),a("li",null,[a("strong",null,"isAscii"),e(" 判断一个字符是否在 unicode 字母表的前 128 位。")]),a("li",null,[a("strong",null,"isLatin1"),e(" 判断一个字符是否在 unicode 字母表的前 256 位.")]),a("li",null,[a("strong",null,"isAsciiUpper"),e(" 判断一个字符是否为大写的 ascii 字符.")]),a("li",null,[a("strong",null,"isAsciiLower"),e(" 判断一个字符是否为小写的 ascii 字符.")])],-1),sc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"all"),e(),a("span",{class:"token builtin"},"isAlphaNum"),e(),a("span",{class:"token string"},'"bobby283"'),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"all"),e(),a("span",{class:"token builtin"},"isAlphaNum"),e(),a("span",{class:"token string"},'"eddy the fish!"'),e("\n"),a("span",{class:"token constant"},"False"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),ac=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"words"),e(),a("span",{class:"token string"},'"hey guys its me"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"hey"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"guys"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"its"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"me"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"groupBy"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"=="),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"`on`"),e(),a("span",{class:"token builtin"},"isSpace"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"hey guys its me"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"hey"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'" "'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"guys"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'" "'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"its"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'" "'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"me"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),ec=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"not"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"any"),e(),a("span",{class:"token builtin"},"isSpace"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"}," . "),a("span",{class:"token hvariable"},"groupBy"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"=="),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"`on`"),e(),a("span",{class:"token builtin"},"isSpace"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token string"},'"hey guys its me"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"hey"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"guys"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"its"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"me"'),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),tc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"generalCategory"),e(),a("span",{class:"token char string"},"' '"),e("\n"),a("span",{class:"token constant"},"Space"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"generalCategory"),e(),a("span",{class:"token char string"},"'A'"),e("\n"),a("span",{class:"token constant"},"UppercaseLetter"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"generalCategory"),e(),a("span",{class:"token char string"},"'a'"),e("\n"),a("span",{class:"token constant"},"LowercaseLetter"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"generalCategory"),e(),a("span",{class:"token char string"},"'.'"),e("\n"),a("span",{class:"token constant"},"OtherPunctuation"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"generalCategory"),e(),a("span",{class:"token char string"},"'9'"),e("\n"),a("span",{class:"token constant"},"DecimalNumber"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token hvariable"},"generalCategory"),e(),a("span",{class:"token string"},'" \\t\\nA9?|"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"Space"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Control"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Control"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"UppercaseLetter"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"DecimalNumber"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"OtherPunctuation"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"MathSymbol"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br")])],-1),lc=a("ul",null,[a("li",null,[a("strong",null,"toUpper"),e(" 将一个字符转为大写字母,若该字符不是小写字母,就按原值返回.")]),a("li",null,[a("strong",null,"toLower"),e(" 将一个字符转为小写字母,若该字符不是大写字母,就按原值返回.")]),a("li",null,[a("strong",null,"toTitle"),e(" 将一个字符转为 title-case,对大多数字元而言,title-case 就是大写.")]),a("li",null,[a("strong",null,"digitToInt"),e(" 将一个字符转为 Int 值,而这一字符必须得在 "),a("code",null,"'1'..'9','a'..'f'"),e("或"),a("code",null,"'A'..'F'"),e(" 的范围之内.")])],-1),oc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token builtin"},"digitToInt"),e(),a("span",{class:"token string"},'"34538"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token builtin"},"digitToInt"),e(),a("span",{class:"token string"},'"FF85AB"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"15"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"15"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"11"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),pc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"intToDigit"),e(),a("span",{class:"token number"},"15"),e("\n"),a("span",{class:"token char string"},"'f'"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"intToDigit"),e(),a("span",{class:"token number"},"5"),e("\n"),a("span",{class:"token char string"},"'5'"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),cc=a("p",null,[a("strong",null,"ord"),e(" 与 "),a("strong",null,"char"),e(" 函数可以将字符与其对应的数字相互转换.")],-1),rc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"ord"),e(),a("span",{class:"token char string"},"'a'"),e("\n"),a("span",{class:"token number"},"97"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"chr"),e(),a("span",{class:"token number"},"97"),e("\n"),a("span",{class:"token char string"},"'a'"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token builtin"},"ord"),e(),a("span",{class:"token string"},'"abcdefgh"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"97"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"98"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"99"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"101"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"102"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"103"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"104"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),uc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"encode"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Int"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token hvariable"},"encode"),e(),a("span",{class:"token hvariable"},"shift"),e(),a("span",{class:"token hvariable"},"msg"),e(),a("span",{class:"token operator"},"="),e("\n "),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"ords"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token builtin"},"ord"),e(),a("span",{class:"token hvariable"},"msg"),e("\n "),a("span",{class:"token hvariable"},"shifted"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"shift"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"ords"),e("\n "),a("span",{class:"token keyword"},"in"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token builtin"},"chr"),e(),a("span",{class:"token hvariable"},"shifted"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),ic=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"decode"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Int"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token hvariable"},"decode"),e(),a("span",{class:"token hvariable"},"shift"),e(),a("span",{class:"token hvariable"},"msg"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"encode"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"negate"),e(),a("span",{class:"token hvariable"},"shift"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"msg"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),kc=a("h4",{id:"data-map"},[a("a",{class:"header-anchor",href:"#data-map","aria-hidden":"true"},"#"),e(" Data Map")],-1),bc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"findKey"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Eq"),e(),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"k"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"v"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"v"),e("\n"),a("span",{class:"token hvariable"},"findKey"),e(),a("span",{class:"token hvariable"},"key"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"snd"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"head"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"v"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"key"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),mc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"findKey"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Eq"),e(),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"k"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"v"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token hvariable"},"v"),e("\n"),a("span",{class:"token hvariable"},"findKey"),e(),a("span",{class:"token hvariable"},"key"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Nothing"),e("\n"),a("span",{class:"token hvariable"},"findKey"),e(),a("span",{class:"token hvariable"},"key"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"v"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token hvariable"},"key"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token hvariable"},"k"),e(),a("span",{class:"token keyword"},"then"),e("\n "),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"v"),e("\n "),a("span",{class:"token keyword"},"else"),e("\n "),a("span",{class:"token hvariable"},"findKey"),e(),a("span",{class:"token hvariable"},"key"),e(),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),hc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"findKey"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Eq"),e(),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"k"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"v"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token hvariable"},"v"),e("\n"),a("span",{class:"token hvariable"},"findKey"),e(),a("span",{class:"token hvariable"},"key"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"foldr"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"v"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"acc"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token hvariable"},"key"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token hvariable"},"k"),e(),a("span",{class:"token keyword"},"then"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"v"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token hvariable"},"acc"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token constant"},"Nothing"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),dc=a("p",null,[a("strong",null,"fromList"),e(" 取一个关联列表,返回一个与之等价的 Map。")],-1),vc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"Map.fromList"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Ord"),e(),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),e(","),a("span",{class:"token hvariable"},"v"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Map.Map"),e(),a("span",{class:"token hvariable"},"k"),e(),a("span",{class:"token hvariable"},"v"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),gc=a("p",null,"若其中存在重复的键,就将其忽略.",-1),yc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Map.empty"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),fc=a("p",null,"insert",-1),wc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Map.insert"),e(),a("span",{class:"token number"},"5"),e(),a("span",{class:"token number"},"600"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"Map.insert"),e(),a("span",{class:"token number"},"4"),e(),a("span",{class:"token number"},"200"),e(),a("span",{class:"token punctuation"},"("),e(),a("span",{class:"token hvariable"},"Map.insert"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token number"},"100"),e(" "),a("span",{class:"token hvariable"},"Map.empty"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"200"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"600"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Map.insert"),e(),a("span",{class:"token number"},"5"),e(),a("span",{class:"token number"},"600"),a("span",{class:"token operator"}," . "),a("span",{class:"token hvariable"},"Map.insert"),e(),a("span",{class:"token number"},"4"),e(),a("span",{class:"token number"},"200"),a("span",{class:"token operator"}," . "),a("span",{class:"token hvariable"},"Map.insert"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token number"},"100"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Map.empty"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"200"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"600"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),xc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"fromList"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Ord"),e(),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"v"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Map.Map"),e(),a("span",{class:"token hvariable"},"k"),e(),a("span",{class:"token hvariable"},"v"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e("' "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"foldr"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"v"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"acc"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"Map.insert"),e(),a("span",{class:"token hvariable"},"k"),e(),a("span",{class:"token hvariable"},"v"),e(),a("span",{class:"token hvariable"},"acc"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"Map.empty"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Sc=a("p",null,"null",-1),Lc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Map"),a("span",{class:"token punctuation"},"."),a("span",{class:"token builtin"},"null"),e(),a("span",{class:"token hvariable"},"Map.empty"),e("\n"),a("span",{class:"token constant"},"True"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Mc=a("p",null,"size",-1),Fc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Map.size"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Map.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token number"},"5"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Tc=a("p",null,"singleton",-1),Ic=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Map.singleton"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token number"},"9"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Map.insert"),e(),a("span",{class:"token number"},"5"),e(),a("span",{class:"token number"},"9"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Map.singleton"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token number"},"9"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Ac=a("p",null,"lookup",-1),Cc=a("p",null,"member",-1),Oc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Map.member"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Map.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Map.member"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Map.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"False"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Nc=a("p",null,[a("strong",null,"map"),e(" 与 "),a("strong",null,"filter"),e(" 与其对应的 "),a("code",null,"List"),e(" 版本相似")],-1),Bc=a("p",null,[a("code",null,"toList"),e(" 是 "),a("code",null,"fromList"),e(" 的反函数")],-1),Wc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Map.toList"),a("span",{class:"token operator"}," . "),a("span",{class:"token hvariable"},"Map.insert"),e(),a("span",{class:"token number"},"9"),e(),a("span",{class:"token number"},"2"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Map.singleton"),e(),a("span",{class:"token number"},"4"),e(),a("span",{class:"token number"},"3"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Ec=a("p",null,[a("strong",null,"keys"),e(" 与 "),a("strong",null,"elems")],-1),$c=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"phoneBook"),e(),a("span",{class:"token operator"},"="),e("\n "),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"betty"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"555-2938"'),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"betty"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"342-2492"'),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"bonnie"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"452-2928"'),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"patsy"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"493-2928"'),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"patsy"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"943-2929"'),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"patsy"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"827-9162"'),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"lucille"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"205-2928"'),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"wendy"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"939-8282"'),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"penny"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"853-2492"'),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"penny"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"555-2111"'),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br")])],-1),Pc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"phoneBookToMap"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Ord"),e(),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"String"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Map.Map"),e(),a("span",{class:"token hvariable"},"k"),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token hvariable"},"phoneBookToMap"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"Map.fromListWith"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"number1"),e(),a("span",{class:"token hvariable"},"number2"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"number1"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token string"},'", "'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token hvariable"},"number2"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),qc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Map"),a("span",{class:"token punctuation"},"."),a("span",{class:"token builtin"},"lookup"),e(),a("span",{class:"token string"},'"patsy"'),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"phoneBookToMap"),e(),a("span",{class:"token hvariable"},"phoneBook"),e("\n"),a("span",{class:"token string"},'"827-9162, 943-2929, 493-2928"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Map"),a("span",{class:"token punctuation"},"."),a("span",{class:"token builtin"},"lookup"),e(),a("span",{class:"token string"},'"wendy"'),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"phoneBookToMap"),e(),a("span",{class:"token hvariable"},"phoneBook"),e("\n"),a("span",{class:"token string"},'"939-8282"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Map"),a("span",{class:"token punctuation"},"."),a("span",{class:"token builtin"},"lookup"),e(),a("span",{class:"token string"},'"betty"'),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"phoneBookToMap"),e(),a("span",{class:"token hvariable"},"phoneBook"),e("\n"),a("span",{class:"token string"},'"342-2492,555-2938"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),Rc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"phoneBookToMap"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Ord"),e(),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),e(","),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Map.Map"),e(),a("span",{class:"token hvariable"},"k"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"phoneBookToMap"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"Map.fromListWith"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"v"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"v"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"xs"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Map"),a("span",{class:"token punctuation"},"."),a("span",{class:"token builtin"},"lookup"),e(),a("span",{class:"token string"},'"patsy"'),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"phoneBookToMap"),e(),a("span",{class:"token hvariable"},"phoneBook"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"827-9162"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"943-2929"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"493-2928"'),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),zc=a("p",null,"在遇到重复元素时,单选最大的那个值.",-1),Dc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Map.fromListWith"),e(),a("span",{class:"token builtin"},"max"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"29"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"22"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"11"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"22"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"15"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"29"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"22"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Jc=a("p",null,"将相同键的值都加在一起.",-1),Gc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Map.fromListWith"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"+"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"29"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"22"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"11"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"22"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"15"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"108"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"62"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"37"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),_c=a("p",null,"insertWith",-1),Hc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Map.insertWith"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"+"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token number"},"100"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Map.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"103"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"339"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"104"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"103"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"339"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Kc=a("h4",{id:"data-set"},[a("a",{class:"header-anchor",href:"#data-set","aria-hidden":"true"},"#"),e(" Data Set")],-1),Yc=a("p",null,"内部元素排序且唯一",-1),Vc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(),a("span",{class:"token keyword"},"qualified"),e(" Data.Set "),a("span",{class:"token keyword"},"as"),e(" Set")]),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),Uc=a("p",null,"fromList",-1),Zc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"set1"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token hvariable"},"text1"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"set2"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token hvariable"},"text2"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"set1"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token string"},'" .?AIRadefhijlmnorstuy"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"set2"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token string"},'" !Tabcdefghilmnorstuvwy"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),jc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Set.intersection"),e(),a("span",{class:"token hvariable"},"set1"),e(),a("span",{class:"token hvariable"},"set2"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token string"},'" adefhilmnorstuy"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Qc=a("p",null,[a("strong",null,"difference"),e(" 差集")],-1),Xc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Set.difference"),e(),a("span",{class:"token hvariable"},"set1"),e(),a("span",{class:"token hvariable"},"set2"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token string"},'".?AIRj"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Set.difference"),e(),a("span",{class:"token hvariable"},"set2"),e(),a("span",{class:"token hvariable"},"set1"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token string"},'"!Tbcgvw"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),nr=a("p",null,[a("code",null,"union"),e(" 并集")],-1),sr=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Set.union"),e(),a("span",{class:"token hvariable"},"set1"),e(),a("span",{class:"token hvariable"},"set2"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token string"},'" !.?AIRTabcdefghijlmnorstuvwy"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),ar=a("p",null,[a("code",null,"null"),e(","),a("code",null,"size"),e(","),a("code",null,"member"),e(","),a("code",null,"empty"),e(","),a("code",null,"singleton"),e(","),a("code",null,"insert"),e(","),a("code",null,"delete")],-1),er=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Set"),a("span",{class:"token punctuation"},"."),a("span",{class:"token builtin"},"null"),e(),a("span",{class:"token hvariable"},"Set.empty"),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Set"),a("span",{class:"token punctuation"},"."),a("span",{class:"token builtin"},"null"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"False"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Set.size"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token number"},"3"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Set.singleton"),e(),a("span",{class:"token number"},"9"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Set.insert"),e(),a("span",{class:"token number"},"4"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Set.insert"),e(),a("span",{class:"token number"},"8"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Set.delete"),e(),a("span",{class:"token number"},"4"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br")])],-1),tr=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"`Set.isSubsetOf`"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"`Set.isSubsetOf`"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"`Set.isProperSubsetOf`"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"False"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"`Set.isSubsetOf`"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"False"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),lr=a("p",null,[e("执行 "),a("code",null,"map"),e(" 和 "),a("code",null,"filter"),e(":")],-1),or=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Set"),a("span",{class:"token punctuation"},"."),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token builtin"},"odd"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Set"),a("span",{class:"token punctuation"},"."),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),pr=a("ul",null,[a("li",null,"删除重复元素")],-1),cr=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"setNub"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"Set.toList"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token hvariable"},"xs"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"setNub"),e(),a("span",{class:"token string"},'"HEY WHATS CRACKALACKIN"'),e("\n"),a("span",{class:"token string"},'" ACEHIKLNRSTWY"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"nub"),e(),a("span",{class:"token string"},'"HEY WHATS CRACKALACKIN"'),e("\n"),a("span",{class:"token string"},'"HEY WATSCRKLIN"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),rr=a("h2",{id:"输入与输出"},[a("a",{class:"header-anchor",href:"#输入与输出","aria-hidden":"true"},"#"),e(" 输入与输出")],-1),ur=a("h3",{id:"io-action"},[a("a",{class:"header-anchor",href:"#io-action","aria-hidden":"true"},"#"),e(" IO action")],-1),ir=a("p",null,[a("code",null,"name <- IO action"),e(": 将 action 绑定至名字上,IO String -> String")],-1),kr=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"name"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"getLine"),e("\n"),a("span",{class:"token hvariable"},"name"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token constant"},"String"),e("\n\n"),a("span",{class:"token hvariable"},"name"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"putStrLn"),e(),a("span",{class:"token constant"},"String"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),br=a("p",null,[e("在一个"),a("code",null,"do block"),e("中,最后一个"),a("code",null,"action"),e("不能绑定任何名字,它会被绑定成为"),a("code",null,"do block"),e("的结果值.")],-1),mr=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"foo"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"putStrLn"),e(),a("span",{class:"token string"},'"Hello, what\'s your name?"'),e("\n "),a("span",{class:"token hvariable"},"name"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"getLine"),e("\n "),a("span",{class:"token builtin"},"putStrLn"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"Hey "'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token hvariable"},"name"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token string"},'", you rock!"'),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),hr=a("h4",{id:"return"},[a("a",{class:"header-anchor",href:"#return","aria-hidden":"true"},"#"),e(" return")],-1),dr=a("ul",null,[a("li",null,"return 功能:将 pure value 包成 I/O actions,不会终止函数/程序"),a("li",null,[e("return 作用: "),a("ul",null,[a("li",null,"if condition then I/O action else I/O action"),a("li",null,[e("改变"),a("code",null,"do block形成的I/O action"),e("的结果值: otherIOAction -> return pureValue")])])])],-1),vr=a("blockquote",null,[a("p",null,'e.g return "haha" - String -> IO String')],-1),gr=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"line"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"getLine"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token builtin"},"null"),e(),a("span",{class:"token hvariable"},"line"),e("\n "),a("span",{class:"token keyword"},"then"),e(),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token builtin"},"putStrLn"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"reverseWords"),e(),a("span",{class:"token hvariable"},"line"),e("\n "),a("span",{class:"token hvariable"},"main"),e("\n\n"),a("span",{class:"token hvariable"},"reverseWords"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token hvariable"},"reverseWords"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"unwords"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token builtin"},"reverse"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"words"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br")])],-1),yr=a("h3",{id:"command-line"},[a("a",{class:"header-anchor",href:"#command-line","aria-hidden":"true"},"#"),e(" Command Line")],-1),fr=a("blockquote",null,[a("p",null,"System.Environment")],-1),wr=a("ul",null,[a("li",null,[e("getArgs: "),a("code",null,"getArgs :: IO [String]")]),a("li",null,[e("getProgName: "),a("code",null,"getProgName :: IO String")])],-1),xr=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" System.Environment")]),e("\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Data.List")]),e("\n\n"),a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"args"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"getArgs"),e("\n "),a("span",{class:"token hvariable"},"progName"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"getProgName"),e("\n "),a("span",{class:"token builtin"},"mapM"),e(),a("span",{class:"token builtin"},"putStrLn"),e(),a("span",{class:"token hvariable"},"args"),e("\n "),a("span",{class:"token builtin"},"putStrLn"),e(),a("span",{class:"token hvariable"},"progName"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),Sr=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" System.Environment")]),e("\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" System.Directory")]),e("\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" System.IO")]),e("\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Data.List")]),e("\n\n"),a("span",{class:"token hvariable"},"dispatch"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"String"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"String"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"IO"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"dispatch"),e(),a("span",{class:"token operator"},"="),e(" "),a("span",{class:"token punctuation"},"["),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"add"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"add"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"view"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"view"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"remove"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"remove"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"command"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"args"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"getArgs"),e("\n "),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"action"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"lookup"),e(),a("span",{class:"token hvariable"},"command"),e(),a("span",{class:"token hvariable"},"dispatch"),e("\n "),a("span",{class:"token hvariable"},"action"),e(),a("span",{class:"token hvariable"},"args"),e("\n\n"),a("span",{class:"token hvariable"},"add"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"String"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"IO"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"add"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"fileName"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"todoItem"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"appendFile"),e(),a("span",{class:"token hvariable"},"fileName"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"todoItem"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token string"},'"\\n"'),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"view"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"String"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"IO"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"view"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"fileName"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"contents"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"readFile"),e(),a("span",{class:"token hvariable"},"fileName"),e("\n "),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"todoTasks"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"lines"),e(),a("span",{class:"token hvariable"},"contents"),e("\n "),a("span",{class:"token hvariable"},"numberedTasks"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"zipWith"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"n"),e(),a("span",{class:"token hvariable"},"line"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token builtin"},"show"),e(),a("span",{class:"token hvariable"},"n"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token string"},'" - "'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token hvariable"},"line"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token hvariable"},"todoTasks"),e("\n "),a("span",{class:"token builtin"},"putStr"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"unlines"),e(),a("span",{class:"token hvariable"},"numberedTasks"),e("\n\n"),a("span",{class:"token hvariable"},"remove"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"String"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"IO"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"remove"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"fileName"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"numberString"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"handle"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"openFile"),e(),a("span",{class:"token hvariable"},"fileName"),e(),a("span",{class:"token constant"},"ReadMode"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"tempName"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"tempHandle"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"openTempFile"),e(),a("span",{class:"token string"},'"."'),e(),a("span",{class:"token string"},'"temp"'),e("\n "),a("span",{class:"token hvariable"},"contents"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"hGetContents"),e(),a("span",{class:"token hvariable"},"handle"),e("\n "),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"number"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"read"),e(),a("span",{class:"token hvariable"},"numberString"),e("\n "),a("span",{class:"token hvariable"},"todoTasks"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"lines"),e(),a("span",{class:"token hvariable"},"contents"),e("\n "),a("span",{class:"token hvariable"},"newTodoItems"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"delete"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"todoTasks"),e(),a("span",{class:"token operator"},"!!"),e(),a("span",{class:"token hvariable"},"number"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"todoTasks"),e("\n "),a("span",{class:"token hvariable"},"hPutStr"),e(),a("span",{class:"token hvariable"},"tempHandle"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"unlines"),e(),a("span",{class:"token hvariable"},"newTodoItems"),e("\n "),a("span",{class:"token hvariable"},"hClose"),e(),a("span",{class:"token hvariable"},"handle"),e("\n "),a("span",{class:"token hvariable"},"hClose"),e(),a("span",{class:"token hvariable"},"tempHandle"),e("\n "),a("span",{class:"token hvariable"},"removeFile"),e(),a("span",{class:"token hvariable"},"fileName"),e("\n "),a("span",{class:"token hvariable"},"renameFile"),e(),a("span",{class:"token hvariable"},"tempName"),e(),a("span",{class:"token hvariable"},"fileName"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br")])],-1),Lr=a("h3",{id:"bytestring"},[a("a",{class:"header-anchor",href:"#bytestring","aria-hidden":"true"},"#"),e(" ByteString")],-1),Mr=a("ul",null,[a("li",null,[a("code",null,"Data.ByteString")]),a("li",null,[a("code",null,"Data.ByteString.Lazy")])],-1),Fr=a("p",null,"lazy byteStrings 像装了一堆大小为 64K 的 strict byteStrings 的 list",-1),Tr=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(),a("span",{class:"token keyword"},"qualified"),e(" Data.ByteString.Lazy "),a("span",{class:"token keyword"},"as"),e(" B")]),e("\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(),a("span",{class:"token keyword"},"qualified"),e(" Data.ByteString "),a("span",{class:"token keyword"},"as"),e(" S")]),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Ir=a("ul",null,[a("li",null,"pack/unpack"),a("li",null,"fromChunks/toChunks"),a("li",null,"cons/empty/head/tail/init/null/length/map/reverse/foldl/foldr/concat/takeWhile/filter")],-1),Ar=a("h3",{id:"常用输入输出函数"},[a("a",{class:"header-anchor",href:"#常用输入输出函数","aria-hidden":"true"},"#"),e(" 常用输入输出函数")],-1),Cr=a("h4",{id:"输出"},[a("a",{class:"header-anchor",href:"#输出","aria-hidden":"true"},"#"),e(" 输出")],-1),Or=a("h5",{id:"output-string"},[a("a",{class:"header-anchor",href:"#output-string","aria-hidden":"true"},"#"),e(" Output String")],-1),Nr=a("p",null,[a("code",null,"putChar"),e("/"),a("code",null,"putStr"),e("/"),a("code",null,"putStrLn"),e(":")],-1),Br=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"putStr"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"IO"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token builtin"},"putStr"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token builtin"},"putStr"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token builtin"},"putChar"),e(),a("span",{class:"token hvariable"},"x"),e("\n "),a("span",{class:"token builtin"},"putStr"),e(),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),Wr=a("h5",{id:"print"},[a("a",{class:"header-anchor",href:"#print","aria-hidden":"true"},"#"),e(" print")],-1),Er=a("p",null,"print = putStrLn . show",-1),$r=a("h5",{id:"file-system-io"},[a("a",{class:"header-anchor",href:"#file-system-io","aria-hidden":"true"},"#"),e(" File System IO")],-1),Pr=a("ul",null,[a("li",null,[a("code",null,"hPutStr")]),a("li",null,[a("code",null,"hPutStrLn")])],-1),qr=a("h6",{id:"write-file"},[a("a",{class:"header-anchor",href:"#write-file","aria-hidden":"true"},"#"),e(" Write File")],-1),Rr=a("p",null,[a("code",null,"writefile :: FilePath -> String -> IO ()"),e(" - WriteMode, not AppendMode")],-1),zr=a("h6",{id:"append-file"},[a("a",{class:"header-anchor",href:"#append-file","aria-hidden":"true"},"#"),e(" Append File")],-1),Dr=a("h4",{id:"输入"},[a("a",{class:"header-anchor",href:"#输入","aria-hidden":"true"},"#"),e(" 输入")],-1),Jr=a("h5",{id:"getchar-io-char"},[a("a",{class:"header-anchor",href:"#getchar-io-char","aria-hidden":"true"},"#"),e(" getChar :: IO Char")],-1),Gr=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"getChar"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"/="),e(),a("span",{class:"token char string"},"' '"),e("\n "),a("span",{class:"token keyword"},"then"),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token builtin"},"putChar"),e(),a("span",{class:"token hvariable"},"c"),e("\n "),a("span",{class:"token hvariable"},"main"),e("\n "),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),_r=a("h5",{id:"get-contents"},[a("a",{class:"header-anchor",href:"#get-contents","aria-hidden":"true"},"#"),e(" Get Contents")],-1),Hr=a("p",null,"getContents :: IO String (Lazy I/O) - 内容暂存在文件,需要使用时读取至内存区",-1),Kr=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Data.Char")]),e("\n\n"),a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"contents"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"getContents"),e("\n "),a("span",{class:"token builtin"},"putStr"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token builtin"},"toUpper"),e(),a("span",{class:"token hvariable"},"contents"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),Yr=a("h5",{id:"file"},[a("a",{class:"header-anchor",href:"#file","aria-hidden":"true"},"#"),e(" File")],-1),Vr=a("h6",{id:"handle"},[a("a",{class:"header-anchor",href:"#handle","aria-hidden":"true"},"#"),e(" handle")],-1),Ur=a("ul",null,[a("li",null,[a("p",null,[a("code",null,"data IOMode = ReadMode | WriteMode | AppendMode | ReadWriteMode")])]),a("li",null,[a("p",null,[a("code",null,"openFile :: FilePath(String) -> IOMode -> IO Handle")])]),a("li",null,[a("p",null,[a("code",null,"hGetContents :: Handle -> IO String")])]),a("li",null,[a("p",null,[a("code",null,"hClose :: Handle -> IO ()")])]),a("li",null,[a("p",null,[a("code",null,"hGetChar")])]),a("li",null,[a("p",null,[a("code",null,"hGetLine")])])],-1),Zr=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" System.IO")]),e("\n\n"),a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"handle"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"openFile"),e(),a("span",{class:"token string"},'"girlfriend.txt"'),e(),a("span",{class:"token constant"},"ReadMode"),e("\n "),a("span",{class:"token hvariable"},"contents"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"hGetContents"),e(),a("span",{class:"token hvariable"},"handle"),e("\n "),a("span",{class:"token builtin"},"putStr"),e(),a("span",{class:"token hvariable"},"contents"),e("\n "),a("span",{class:"token hvariable"},"hClose"),e(),a("span",{class:"token hvariable"},"handle"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),jr=a("h6",{id:"with-file"},[a("a",{class:"header-anchor",href:"#with-file","aria-hidden":"true"},"#"),e(" With File")],-1),Qr=a("p",null,[a("code",null,"withFile :: FilePath -> IOMode -> (Handle -> IO a) -> IO a")],-1),Xr=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" System.IO")]),e("\n\n"),a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"withFile"),e(),a("span",{class:"token string"},'"girlfriend.txt"'),e(),a("span",{class:"token constant"},"ReadMode"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"handle"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"contents"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"hGetContents"),e(),a("span",{class:"token hvariable"},"handle"),e("\n "),a("span",{class:"token builtin"},"putStr"),e(),a("span",{class:"token hvariable"},"contents"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),nu=a("h6",{id:"read-file"},[a("a",{class:"header-anchor",href:"#read-file","aria-hidden":"true"},"#"),e(" Read File")],-1),su=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"contents"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"readFile"),e(),a("span",{class:"token string"},'"girlfriend.txt"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),au=a("h4",{id:"action"},[a("a",{class:"header-anchor",href:"#action","aria-hidden":"true"},"#"),e(" Action")],-1),eu=a("h5",{id:"when"},[a("a",{class:"header-anchor",href:"#when","aria-hidden":"true"},"#"),e(" When")],-1),tu=a("p",null,"Control.Monad.when :: (Applicative f) => Bool -> f () -> f ()",-1),lu=a("p",null,[a("code",null,"when bool表达式 I/O-Action"),e(" - 真时返回 Action,假时"),a("code",null,"return ()")],-1),ou=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Control.Monad")]),e("\n\n"),a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"getChar"),e("\n "),a("span",{class:"token hvariable"},"when"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"/="),e(),a("span",{class:"token char string"},"' '"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token builtin"},"putChar"),e(),a("span",{class:"token hvariable"},"c"),e("\n "),a("span",{class:"token hvariable"},"main"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),pu=a("h5",{id:"sequence"},[a("a",{class:"header-anchor",href:"#sequence","aria-hidden":"true"},"#"),e(" sequence")],-1),cu=a("p",null,[e("sequence :: "),a("code",null,"[IO a]"),e(" -> IO "),a("code",null,"[a]")],-1),ru=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"rs"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"sequence"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token builtin"},"getLine"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token builtin"},"getLine"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token builtin"},"getLine"),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token builtin"},"print"),e(),a("span",{class:"token hvariable"},"rs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),uu=a("h5",{id:"map"},[a("a",{class:"header-anchor",href:"#map","aria-hidden":"true"},"#"),e(" Map")],-1),iu=a("p",null,"mapM, Control.Monad.forM:",-1),ku=a("p",null,"= sequence . map",-1),bu=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"mapM"),e(),a("span",{class:"token builtin"},"print"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token number"},"1"),e("\n"),a("span",{class:"token number"},"2"),e("\n"),a("span",{class:"token number"},"3"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"mapM_"),e(),a("span",{class:"token builtin"},"print"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token number"},"1"),e("\n"),a("span",{class:"token number"},"2"),e("\n"),a("span",{class:"token number"},"3"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br")])],-1),mu=a("h5",{id:"control-monad-forever"},[a("a",{class:"header-anchor",href:"#control-monad-forever","aria-hidden":"true"},"#"),e(" Control Monad forever")],-1),hu=a("p",null,"接受一个 I/O action 并回传一个永远作同一件事的 I/O action",-1),du=a("p",null,"以下代码实现了循环结构:",-1),vu=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Control.Monad")]),e("\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Data.Char")]),e("\n\n"),a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"forever"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token builtin"},"putStr"),e(),a("span",{class:"token string"},'"Give me some input: "'),e("\n "),a("span",{class:"token hvariable"},"l"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"getLine"),e("\n "),a("span",{class:"token builtin"},"putStrLn"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token builtin"},"toUpper"),e(),a("span",{class:"token hvariable"},"l"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),gu=a("h5",{id:"hsetbuffering"},[a("a",{class:"header-anchor",href:"#hsetbuffering","aria-hidden":"true"},"#"),e(" hSetBuffering")],-1),yu=a("p",null,[a("code",null,"data BufferMode = NoBuffering | LineBuffering | BlockBuffering (Maybe Int)"),a("code",null,"hSetBuffering :: Handle -> BufferMode -> IO ()")],-1),fu=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"withFile"),e(),a("span",{class:"token string"},'"something.txt"'),e(),a("span",{class:"token constant"},"ReadMode"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"handle"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"hSetBuffering"),e(),a("span",{class:"token hvariable"},"handle"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token constant"},"BlockBuffering"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"2048"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token hvariable"},"contents"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"hGetContents"),e(),a("span",{class:"token hvariable"},"handle"),e("\n "),a("span",{class:"token builtin"},"putStr"),e(),a("span",{class:"token hvariable"},"contents"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),wu=a("h5",{id:"hflush"},[a("a",{class:"header-anchor",href:"#hflush","aria-hidden":"true"},"#"),e(" hFlush")],-1),xu=a("h4",{id:"other"},[a("a",{class:"header-anchor",href:"#other","aria-hidden":"true"},"#"),e(" Other")],-1),Su=a("h5",{id:"lines"},[a("a",{class:"header-anchor",href:"#lines","aria-hidden":"true"},"#"),e(" lines")],-1),Lu=a("p",null,[a("code",null,"lines :: String -> [String]"),e(" - 按换行符将段落切割成句子")],-1),Mu=a("h5",{id:"interact"},[a("a",{class:"header-anchor",href:"#interact","aria-hidden":"true"},"#"),e(" interact")],-1),Fu=a("ul",null,[a("li",null,"arguments: String -> String 的函数"),a("li",null,"return: 一个 I/O action"),a("li",null,"function: I/O action 会读取输入,调用提供的函数,然后把函数的结果打印出来")],-1),Tu=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"interact"),e(),a("span",{class:"token hvariable"},"shortLinesOnly"),e("\n\n"),a("span",{class:"token hvariable"},"shortLinesOnly"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token hvariable"},"shortLinesOnly"),e(),a("span",{class:"token hvariable"},"input"),e(),a("span",{class:"token operator"},"="),e("\n "),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"allLines"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"lines"),e(),a("span",{class:"token hvariable"},"input"),e("\n "),a("span",{class:"token hvariable"},"shortLines"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"line"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token builtin"},"length"),e(),a("span",{class:"token hvariable"},"line"),e(),a("span",{class:"token operator"},"<"),e(),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"allLines"),e("\n "),a("span",{class:"token hvariable"},"result"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"unlines"),e(),a("span",{class:"token hvariable"},"shortLines"),e("\n "),a("span",{class:"token keyword"},"in"),e(),a("span",{class:"token hvariable"},"result"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),Iu=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"interact"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"unlines"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"<"),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"length"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"lines"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),Au=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"respondPalindromes"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"unlines"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"->"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token hvariable"},"isPalindrome"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token keyword"},"then"),e(),a("span",{class:"token string"},'"palindrome"'),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token string"},'"not a palindrome"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"lines"),e("\n "),a("span",{class:"token keyword"},"where"),e(),a("span",{class:"token hvariable"},"isPalindrome"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token builtin"},"reverse"),e(),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),Cu=a("h5",{id:"system-directory"},[a("a",{class:"header-anchor",href:"#system-directory","aria-hidden":"true"},"#"),e(" System Directory")],-1),Ou=a("ul",null,[a("li",null,"removeFile"),a("li",null,"renameFile")],-1),Nu=a("h2",{id:"异常"},[a("a",{class:"header-anchor",href:"#异常","aria-hidden":"true"},"#"),e(" 异常")],-1),Bu=a("p",null,"System.IO.Error",-1),Wu=a("h3",{id:"catch"},[a("a",{class:"header-anchor",href:"#catch","aria-hidden":"true"},"#"),e(" catch")],-1),Eu=a("p",null,"catch :: IO a -> (IOError -> IO a) -> IO a",-1),$u=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" System.Environment")]),e("\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" System.IO")]),e("\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" System.IO.Error")]),e("\n\n"),a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"toTry"),e(" `"),a("span",{class:"token builtin"},"catch"),e("` "),a("span",{class:"token hvariable"},"handler"),e("\n\n"),a("span",{class:"token hvariable"},"toTry"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"IO"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"toTry"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"fileName"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"_"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"getArgs"),e("\n "),a("span",{class:"token hvariable"},"contents"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"readFile"),e(),a("span",{class:"token hvariable"},"fileName"),e("\n "),a("span",{class:"token builtin"},"putStrLn"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token string"},'"The file has "'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token builtin"},"show"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"length"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"lines"),e(),a("span",{class:"token hvariable"},"contents"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token string"},'" lines!"'),e("\n\n"),a("span",{class:"token hvariable"},"handler"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"IOError"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"IO"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"handler"),e(),a("span",{class:"token hvariable"},"e"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"isDoesNotExistError"),e(),a("span",{class:"token hvariable"},"e"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"putStrLn"),e(),a("span",{class:"token string"},'"The file doesn\'t exist!"'),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"isFullError"),e(),a("span",{class:"token hvariable"},"e"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"freeSomeSpace"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"isIllegalOperation"),e(),a("span",{class:"token hvariable"},"e"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"notifyCops"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token builtin"},"otherwise"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"ioError"),e(),a("span",{class:"token hvariable"},"e"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br")])],-1),Pu=a("h2",{id:"advanced-monad"},[a("a",{class:"header-anchor",href:"#advanced-monad","aria-hidden":"true"},"#"),e(" Advanced Monad")],-1),qu=a("h3",{id:"writer-monad"},[a("a",{class:"header-anchor",href:"#writer-monad","aria-hidden":"true"},"#"),e(" Writer Monad")],-1),Ru=a("p",null,"Writer 可以让我们在计算的同时搜集所有 log 纪录,并汇集成一个 log 并附加在结果上",-1),zu=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"applyLog"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"String"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"String"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"String"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"applyLog"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},","),a("span",{class:"token builtin"},"log"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"newLog"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token keyword"},"in"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},","),a("span",{class:"token builtin"},"log"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token hvariable"},"newLog"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Du=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"30"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token string"},'"A freaking platoon."'),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"`applyLog`"),e(),a("span",{class:"token hvariable"},"isBigGang"),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"True"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"A freaking platoon.Compared gang size to 9"'),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"BathCat"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"Got outlaw name."'),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"`applyLog`"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"length"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token string"},'"Applied length"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"Got outlaw name.Applied length"'),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Ju=a("h4",{id:"control-monad-writer"},[a("a",{class:"header-anchor",href:"#control-monad-writer","aria-hidden":"true"},"#"),e(" Control Monad Writer")],-1),Gu=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Monoid"),e(),a("span",{class:"token hvariable"},"w"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token constant"},"Monad"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Writer"),e(),a("span",{class:"token hvariable"},"w"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Writer"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"mempty"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Writer"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"v"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Writer"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"v"),e("'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token keyword"},"in"),e(),a("span",{class:"token constant"},"Writer"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"v"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token hvariable"},"v"),e("'"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),_u=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Control.Monad.Writer")]),e("\n\n"),a("span",{class:"token hvariable"},"logNumber"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Int"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Writer"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"String"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token constant"},"Int"),e("\n"),a("span",{class:"token hvariable"},"logNumber"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Writer"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"Got number: "'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token builtin"},"show"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"multiWithLog"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Writer"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"String"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token constant"},"Int"),e("\n"),a("span",{class:"token hvariable"},"multiWithLog"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"logNumber"),e(),a("span",{class:"token number"},"3"),e("\n "),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"logNumber"),e(),a("span",{class:"token number"},"5"),e("\n "),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token operator"},"*"),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br")])],-1),Hu=a("h3",{id:"reader-monad"},[a("a",{class:"header-anchor",href:"#reader-monad","aria-hidden":"true"},"#"),e(" Reader Monad")],-1),Ku=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Monad"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"->"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"r"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"x"),e("\n "),a("span",{class:"token hvariable"},"h"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"w"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"h"),e(),a("span",{class:"token hvariable"},"w"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"w"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),Yu=a("h3",{id:"state-monad"},[a("a",{class:"header-anchor",href:"#state-monad","aria-hidden":"true"},"#"),e(" State Monad")],-1),Vu=a("h4",{id:"control-monad-state"},[a("a",{class:"header-anchor",href:"#control-monad-state","aria-hidden":"true"},"#"),e(" Control Monad State")],-1),Uu=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"newtype"),e(),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token hvariable"},"s"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token punctuation"},"{"),e(),a("span",{class:"token hvariable"},"runState"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"s"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"s"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"}"),e("\n\n"),a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Monad"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token hvariable"},"s"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"s"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"s"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token hvariable"},"h"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"s"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"newState"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"h"),e(),a("span",{class:"token hvariable"},"s"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token hvariable"},"g"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"a"),e("\n "),a("span",{class:"token keyword"},"in"),e(" "),a("span",{class:"token hvariable"},"g"),e(),a("span",{class:"token hvariable"},"newState"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),Zu=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"get"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"s"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"s"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"s"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"put"),e(),a("span",{class:"token hvariable"},"newState"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"s"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"newState"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),ju=a("h4",{id:"state-monad-case"},[a("a",{class:"header-anchor",href:"#state-monad-case","aria-hidden":"true"},"#"),e(" State Monad Case")],-1),Qu=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Control.Monad.State")]),e("\n\n"),a("span",{class:"token hvariable"},"pop"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token constant"},"Stack"),e(),a("span",{class:"token constant"},"Int"),e("\n"),a("span",{class:"token hvariable"},"pop"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token operator"},"\\"),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"push"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Int"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token constant"},"Stack"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"push"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"a"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"stackManipulation"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token constant"},"Stack"),e(),a("span",{class:"token constant"},"Int"),e("\n"),a("span",{class:"token hvariable"},"stackManipulation"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"push"),e(),a("span",{class:"token number"},"3"),e("\n "),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"pop"),e("\n "),a("span",{class:"token hvariable"},"pop"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br")])],-1),Xu=a("h3",{id:"error-monad"},[a("a",{class:"header-anchor",href:"#error-monad","aria-hidden":"true"},"#"),e(" Error Monad")],-1),ni=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Error"),e(),a("span",{class:"token hvariable"},"e"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token constant"},"Monad"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Either"),e(),a("span",{class:"token hvariable"},"e"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Right"),e(),a("span",{class:"token hvariable"},"x"),e("\n "),a("span",{class:"token constant"},"Right"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),e("\n "),a("span",{class:"token constant"},"Left"),e(),a("span",{class:"token hvariable"},"err"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Left"),e(),a("span",{class:"token hvariable"},"err"),e("\n "),a("span",{class:"token builtin"},"fail"),e(),a("span",{class:"token hvariable"},"msg"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Left"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"strMsg"),e(),a("span",{class:"token hvariable"},"msg"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),si=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token hvariable"},"strMsg"),e("\n"),a("span",{class:"token hvariable"},"strMsg"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Error"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"strMsg"),e(),a("span",{class:"token string"},'"boom!"'),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token string"},'"boom!"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),ai=a("h4",{id:"liftm"},[a("a",{class:"header-anchor",href:"#liftm","aria-hidden":"true"},"#"),e(" liftM")],-1),ei=a("h4",{id:"join"},[a("a",{class:"header-anchor",href:"#join","aria-hidden":"true"},"#"),e(" join")],-1),ti=a("h4",{id:"filterm"},[a("a",{class:"header-anchor",href:"#filterm","aria-hidden":"true"},"#"),e(" filterM")],-1),li=a("h4",{id:"foldm"},[a("a",{class:"header-anchor",href:"#foldm","aria-hidden":"true"},"#"),e(" foldM")],-1),oi=a("h4",{id:"组合函数"},[a("a",{class:"header-anchor",href:"#组合函数","aria-hidden":"true"},"#"),e(),a("code",null,"<=<"),e("(组合函数)")],-1),pi=a("h3",{id:"self-defined-monad"},[a("a",{class:"header-anchor",href:"#self-defined-monad","aria-hidden":"true"},"#"),e(" Self-Defined Monad")],-1),ci=a("h2",{id:"注释"},[a("a",{class:"header-anchor",href:"#注释","aria-hidden":"true"},"#"),e(" 注释")],-1),ri=a("h3",{id:"符号-1"},[a("a",{class:"header-anchor",href:"#符号-1","aria-hidden":"true"},"#"),e(" 符号")],-1),ui=a("ul",null,[a("li",null,[a("code",null,"--"),e(" 单行注释")]),a("li",null,[a("code",null,"{- -}"),e(" 块注释")]),a("li",null,[a("code",null,"{-# #-}"),e(" (文件头部)编译器参数")])],-1),ii=a("h2",{id:"reference"},[a("a",{class:"header-anchor",href:"#reference","aria-hidden":"true"},"#"),e(" Reference")],-1),ki=a("ul",null,[a("li",null,[a("a",{href:"https://github.com/MnO2/learnyouahaskell-zh",target:"_blank",rel:"noopener noreferrer"},"Haskell Book")])],-1);l.render=function(a,e,t,l,bi,mi){return n(),s("div",null,[o,p,c,r,u,i,k,b,m,h,d,v,g,y,f,w,x,S,L,M,F,T,I,A,C,O,N,B,W,E,$,P,q,R,z,D,J,G,_,H,K,Y,V,U,Z,j,Q,X,nn,sn,an,en,tn,ln,on,pn,cn,rn,un,kn,bn,mn,hn,dn,vn,gn,yn,fn,wn,xn,Sn,Ln,Mn,Fn,Tn,In,An,Cn,On,Nn,Bn,Wn,En,$n,Pn,qn,Rn,zn,Dn,Jn,Gn,_n,Hn,Kn,Yn,Vn,Un,Zn,jn,Qn,Xn,ns,ss,as,es,ts,ls,os,ps,cs,rs,us,is,ks,bs,ms,hs,ds,vs,gs,ys,fs,ws,xs,Ss,Ls,Ms,Fs,Ts,Is,As,Cs,Os,Ns,Bs,Ws,Es,$s,Ps,qs,Rs,zs,Ds,Js,Gs,_s,Hs,Ks,Ys,Vs,Us,Zs,js,Qs,Xs,na,sa,aa,ea,ta,la,oa,pa,ca,ra,ua,ia,ka,ba,ma,ha,da,va,ga,ya,fa,wa,xa,Sa,La,Ma,Fa,Ta,Ia,Aa,Ca,Oa,Na,Ba,Wa,Ea,$a,Pa,qa,Ra,za,Da,Ja,Ga,_a,Ha,Ka,Ya,Va,Ua,Za,ja,Qa,Xa,ne,se,ae,ee,te,le,oe,pe,ce,re,ue,ie,ke,be,me,he,de,ve,ge,ye,fe,we,xe,Se,Le,Me,Fe,Te,Ie,Ae,Ce,Oe,Ne,Be,We,Ee,$e,Pe,qe,Re,ze,De,Je,Ge,_e,He,Ke,Ye,Ve,Ue,Ze,je,Qe,Xe,nt,st,at,et,tt,lt,ot,pt,ct,rt,ut,it,kt,bt,mt,ht,dt,vt,gt,yt,ft,wt,xt,St,Lt,Mt,Ft,Tt,It,At,Ct,Ot,Nt,Bt,Wt,Et,$t,Pt,qt,Rt,zt,Dt,Jt,Gt,_t,Ht,Kt,Yt,Vt,Ut,Zt,jt,Qt,Xt,nl,sl,al,el,tl,ll,ol,pl,cl,rl,ul,il,kl,bl,ml,hl,dl,vl,gl,yl,fl,wl,xl,Sl,Ll,Ml,Fl,Tl,Il,Al,Cl,Ol,Nl,Bl,Wl,El,$l,Pl,ql,Rl,zl,Dl,Jl,Gl,_l,Hl,Kl,Yl,Vl,Ul,Zl,jl,Ql,Xl,no,so,ao,eo,to,lo,oo,po,co,ro,uo,io,ko,bo,mo,ho,vo,go,yo,fo,wo,xo,So,Lo,Mo,Fo,To,Io,Ao,Co,Oo,No,Bo,Wo,Eo,$o,Po,qo,Ro,zo,Do,Jo,Go,_o,Ho,Ko,Yo,Vo,Uo,Zo,jo,Qo,Xo,np,sp,ap,ep,tp,lp,op,pp,cp,rp,up,ip,kp,bp,mp,hp,dp,vp,gp,yp,fp,wp,xp,Sp,Lp,Mp,Fp,Tp,Ip,Ap,Cp,Op,Np,Bp,Wp,Ep,$p,Pp,qp,Rp,zp,Dp,Jp,Gp,_p,Hp,Kp,Yp,Vp,Up,Zp,jp,Qp,Xp,nc,sc,ac,ec,tc,lc,oc,pc,cc,rc,uc,ic,kc,bc,mc,hc,dc,vc,gc,yc,fc,wc,xc,Sc,Lc,Mc,Fc,Tc,Ic,Ac,Cc,Oc,Nc,Bc,Wc,Ec,$c,Pc,qc,Rc,zc,Dc,Jc,Gc,_c,Hc,Kc,Yc,Vc,Uc,Zc,jc,Qc,Xc,nr,sr,ar,er,tr,lr,or,pr,cr,rr,ur,ir,kr,br,mr,hr,dr,vr,gr,yr,fr,wr,xr,Sr,Lr,Mr,Fr,Tr,Ir,Ar,Cr,Or,Nr,Br,Wr,Er,$r,Pr,qr,Rr,zr,Dr,Jr,Gr,_r,Hr,Kr,Yr,Vr,Ur,Zr,jr,Qr,Xr,nu,su,au,eu,tu,lu,ou,pu,cu,ru,uu,iu,ku,bu,mu,hu,du,vu,gu,yu,fu,wu,xu,Su,Lu,Mu,Fu,Tu,Iu,Au,Cu,Ou,Nu,Bu,Wu,Eu,$u,Pu,qu,Ru,zu,Du,Ju,Gu,_u,Hu,Ku,Yu,Vu,Uu,Zu,ju,Qu,Xu,ni,si,ai,ei,ti,li,oi,pi,ci,ri,ui,ii,ki])};export default l;export{t as __pageData}; diff --git a/assets/language_haskell_haskellBasicNotes.md.998a4d73.lean.js b/assets/language_haskell_haskellBasicNotes.md.998a4d73.lean.js new file mode 100644 index 00000000000..a8dc6b533e6 --- /dev/null +++ b/assets/language_haskell_haskellBasicNotes.md.998a4d73.lean.js @@ -0,0 +1 @@ +import{o as n,c as s,b as a,d as e}from"./app.6dd2a1b7.js";const t='{"title":"Haskell Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Platform","slug":"platform"},{"level":3,"title":"ghci","slug":"ghci"},{"level":3,"title":"ghc","slug":"ghc"},{"level":2,"title":"Unique Mark","slug":"unique-mark"},{"level":2,"title":"Expression","slug":"expression"},{"level":2,"title":"Type","slug":"type"},{"level":3,"title":"基本类型","slug":"基本类型"},{"level":3,"title":"List","slug":"list"},{"level":3,"title":"Tuple(原组)","slug":"tuple-原组"},{"level":3,"title":"泛型","slug":"泛型"},{"level":3,"title":"函数类型","slug":"函数类型"},{"level":2,"title":"基本语法","slug":"基本语法"},{"level":3,"title":"名字/函数定义","slug":"名字-函数定义"},{"level":2,"title":"Type Class","slug":"type-class"},{"level":3,"title":"=> 符号","slug":"符号"},{"level":3,"title":"Basic Type Class","slug":"basic-type-class"},{"level":3,"title":"Custom Type Class","slug":"custom-type-class"},{"level":3,"title":"data type","slug":"data-type"},{"level":2,"title":"函数","slug":"函数"},{"level":3,"title":"递归函数","slug":"递归函数"},{"level":3,"title":"高阶函数","slug":"高阶函数"},{"level":3,"title":"常用函数","slug":"常用函数"},{"level":2,"title":"模块","slug":"模块"},{"level":3,"title":"import","slug":"import"},{"level":3,"title":"建立模块","slug":"建立模块"},{"level":3,"title":"常用基础模块","slug":"常用基础模块"},{"level":2,"title":"输入与输出","slug":"输入与输出"},{"level":3,"title":"IO action","slug":"io-action"},{"level":3,"title":"Command Line","slug":"command-line"},{"level":3,"title":"ByteString","slug":"bytestring"},{"level":3,"title":"常用输入输出函数","slug":"常用输入输出函数"},{"level":2,"title":"异常","slug":"异常"},{"level":3,"title":"catch","slug":"catch"},{"level":2,"title":"Advanced Monad","slug":"advanced-monad"},{"level":3,"title":"Writer Monad","slug":"writer-monad"},{"level":3,"title":"Reader Monad","slug":"reader-monad"},{"level":3,"title":"State Monad","slug":"state-monad"},{"level":3,"title":"Error Monad","slug":"error-monad"},{"level":3,"title":"Self-Defined Monad","slug":"self-defined-monad"},{"level":2,"title":"注释","slug":"注释"},{"level":3,"title":"符号","slug":"符号-1"},{"level":2,"title":"Reference","slug":"reference"}],"relativePath":"language/haskell/haskellBasicNotes.md","lastUpdated":1627196319000}',l={},o=a("h1",{id:"haskell-basic-notes"},[a("a",{class:"header-anchor",href:"#haskell-basic-notes","aria-hidden":"true"},"#"),e(" Haskell Basic Notes")],-1),p=a("p",null,[a("div",{class:"table-of-contents"},[a("ul",null,[a("li",null,[a("a",{href:"#haskell-basic-notes"},"Haskell Basic Notes"),a("ul",null,[a("li",null,[a("a",{href:"#platform"},"Platform")]),a("li",null,[a("a",{href:"#unique-mark"},"Unique Mark")]),a("li",null,[a("a",{href:"#expression"},"Expression")]),a("li",null,[a("a",{href:"#type"},"Type")]),a("li",null,[a("a",{href:"#基本语法"},"基本语法")]),a("li",null,[a("a",{href:"#type-class"},"Type Class")]),a("li",null,[a("a",{href:"#函数"},"函数")]),a("li",null,[a("a",{href:"#模块"},"模块")]),a("li",null,[a("a",{href:"#输入与输出"},"输入与输出")]),a("li",null,[a("a",{href:"#异常"},"异常")]),a("li",null,[a("a",{href:"#advanced-monad"},"Advanced Monad")]),a("li",null,[a("a",{href:"#注释"},"注释")]),a("li",null,[a("a",{href:"#reference"},"Reference")])])])])])],-1),c=a("h2",{id:"platform"},[a("a",{class:"header-anchor",href:"#platform","aria-hidden":"true"},"#"),e(" Platform")],-1),r=a("div",{class:"language-bash line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token function"},"apt-get"),e(),a("span",{class:"token function"},"install"),e(" haskell-Platform\n"),a("span",{class:"token function"},"apt-get"),e(),a("span",{class:"token function"},"install"),e(" ghc-mod\natom plugins "),a("span",{class:"token builtin class-name"},":"),e(" language-haskell autocomplete-haskell ide-haskell haskell-ghc-mod\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),u=a("h3",{id:"ghci"},[a("a",{class:"header-anchor",href:"#ghci","aria-hidden":"true"},"#"),e(" ghci")],-1),i=a("ul",null,[a("li",null,":l - load file"),a("li",null,":r - reload file"),a("li",null,":cd"),a("li",null,":edit - $EDITOR"),a("li",null,":m - module"),a("li",null,":q - quit"),a("li",null,":?"),a("li",null,":k - kind"),a("li",null,":t - type function"),a("li",null,":info - data/TypeClass")],-1),k=a("h3",{id:"ghc"},[a("a",{class:"header-anchor",href:"#ghc","aria-hidden":"true"},"#"),e(" ghc")],-1),b=a("div",{class:"language-bash line-numbers-mode"},[a("pre",null,[a("code",null,"runghc *.hs/*.lhs\n")]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),m=a("h2",{id:"unique-mark"},[a("a",{class:"header-anchor",href:"#unique-mark","aria-hidden":"true"},"#"),e(" Unique Mark")],-1),h=a("p",null,[a("code",null,":+")],-1),d=a("p",null,"复数符 - 2 :+ 3 -> 2+3i",-1),v=a("p",null,[a("code",null,"_")],-1),g=a("p",null,"泛匹配符: 表示不关心此部分具体内容",-1),y=a("p",null,[a("code",null,"<-")],-1),f=a("p",null,"属于符号,用于 ListRange 中.",-1),w=a("p",null,[a("code",null,"=>")],-1),x=a("p",null,"类型约束分隔符",-1),S=a("p",null,[a("code",null,"->")],-1),L=a("h2",{id:"expression"},[a("a",{class:"header-anchor",href:"#expression","aria-hidden":"true"},"#"),e(" Expression")],-1),M=a("p",null,"if 语句也是表达式",-1),F=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"doubleSmallNumber"),e("' "),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},">"),e(),a("span",{class:"token number"},"100"),e(),a("span",{class:"token keyword"},"then"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},"*"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token number"},"1"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),T=a("h2",{id:"type"},[a("a",{class:"header-anchor",href:"#type","aria-hidden":"true"},"#"),e(" Type")],-1),I=a("h3",{id:"基本类型"},[a("a",{class:"header-anchor",href:"#基本类型","aria-hidden":"true"},"#"),e(" 基本类型")],-1),A=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token char string"},"'a'"),e("\n"),a("span",{class:"token char string"},"'a'"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Char"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token constant"},"True"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Bool"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token string"},'"HELLO!"'),e("\n"),a("span",{class:"token string"},'"HELLO!"'),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"Char"),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"True"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token char string"},"'a'"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"True"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token char string"},"'a'"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Bool"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Char"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),C=a("h4",{id:"int"},[a("a",{class:"header-anchor",href:"#int","aria-hidden":"true"},"#"),e(" Int")],-1),O=a("p",null,"有限整数",-1),N=a("h4",{id:"integer"},[a("a",{class:"header-anchor",href:"#integer","aria-hidden":"true"},"#"),e(" Integer")],-1),B=a("p",null,"无限整数(效率低)",-1),W=a("h4",{id:"float"},[a("a",{class:"header-anchor",href:"#float","aria-hidden":"true"},"#"),e(" Float")],-1),E=a("p",null,"单精度浮点数",-1),$=a("h4",{id:"double"},[a("a",{class:"header-anchor",href:"#double","aria-hidden":"true"},"#"),e(" Double")],-1),P=a("p",null,"双精度浮点数",-1),q=a("h4",{id:"bool"},[a("a",{class:"header-anchor",href:"#bool","aria-hidden":"true"},"#"),e(" Bool")],-1),R=a("p",null,"True/False",-1),z=a("h4",{id:"char"},[a("a",{class:"header-anchor",href:"#char","aria-hidden":"true"},"#"),e(" Char")],-1),D=a("h4",{id:"string"},[a("a",{class:"header-anchor",href:"#string","aria-hidden":"true"},"#"),e(" String")],-1),J=a("h4",{id:"ordering"},[a("a",{class:"header-anchor",href:"#ordering","aria-hidden":"true"},"#"),e(" Ordering")],-1),G=a("p",null,"LT,GT,EQ",-1),_=a("h4",{id:"word"},[a("a",{class:"header-anchor",href:"#word","aria-hidden":"true"},"#"),e(" Word")],-1),H=a("p",null,"Data.Word - unsigned int",-1),K=a("h4",{id:"rational"},[a("a",{class:"header-anchor",href:"#rational","aria-hidden":"true"},"#"),e(" Rational")],-1),Y=a("p",null,"有理数类型,用于高精度数学运算",-1),V=a("h3",{id:"list"},[a("a",{class:"header-anchor",href:"#list","aria-hidden":"true"},"#"),e(" List")],-1),U=a("h4",{id:"operator"},[a("a",{class:"header-anchor",href:"#operator","aria-hidden":"true"},"#"),e(" Operator")],-1),Z=a("ul",null,[a("li",null,"++"),a("li",null,":"),a("li",null,"!!"),a("li",null,">/"),e(),a("span",{class:"token builtin"},"null"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"False"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"null"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"True"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),en=a("ul",null,[a("li",null,"reverse List 反转"),a("li",null,"take num List 返回 List 前 num 个元素组成的 List")],-1),tn=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"take"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"take"),e(),a("span",{class:"token number"},"5"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"take"),e(),a("span",{class:"token number"},"0"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),ln=a("ul",null,[a("li",null,"drop num List 删除 List 前 num 个元素")],-1),on=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"drop"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"drop"),e(),a("span",{class:"token number"},"0"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"drop"),e(),a("span",{class:"token number"},"100"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),pn=a("ul",null,[a("li",null,[a("p",null,"maximum List 返回最大元素")]),a("li",null,[a("p",null,"minimum List 返回最小元素")]),a("li",null,[a("p",null,"sum List 返回 List 元素和")]),a("li",null,[a("p",null,"product List 返回 List 元素积")]),a("li",null,[a("p",null,[e("elem "),a("code",null,"elem"),e(" List 判断元素存在性")])])],-1),cn=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token number"},"4"),e(" `"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token number"},"10"),e(" `"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"False"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),rn=a("ul",null,[a("li",null,[e("cycle List 返回循环无限数组("),a("em",null,"Haskell 惰性特性"),e(")")]),a("li",null,[e("repeat Elem 返回循环无限数组("),a("em",null,"Haskell 惰性特性"),e(")")]),a("li",null,"replicate num Elem 返回循环无限数组")],-1),un=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"take"),e(),a("span",{class:"token number"},"10"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"cycle"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"take"),e(),a("span",{class:"token number"},"10"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"repeat"),e(),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},")"),e(" "),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"replicate"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token number"},"10"),e(" "),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),kn=a("ul",null,[a("li",null,[e("takeWhile :: (a -> Bool) -> "),a("code",null,"[a]"),e(" -> "),a("code",null,"[a]"),e(" 遇到不符合限制条件的元素便停止遍历 List")])],-1),bn=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"sum"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"takeWhile"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"<"),a("span",{class:"token number"},"10000"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token builtin"},"odd"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"^"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token number"},"166650"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),mn=a("h4",{id:"range"},[a("a",{class:"header-anchor",href:"#range","aria-hidden":"true"},"#"),e(" Range")],-1),hn=a("p",null,"三要素: , 与 ..",-1),dn=a("ul",null,[a("li",null,"上限"),a("li",null,"下限"),a("li",null,[e("步长("),a("em",null,"仅可标明一次"),e(")")])],-1),vn=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[e("上下限"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"20"),a("span",{class:"token punctuation"},"]"),e("\n步长为"),a("span",{class:"token number"},"2"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"20"),a("span",{class:"token punctuation"},"]"),e("\n步长为"),a("span",{class:"token number"},"13"),e("无限"),a("span",{class:"token constant"},"List"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"13"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"26"),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"take"),e(),a("span",{class:"token number"},"24"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"13"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"26"),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},"]"),e("\n\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),gn=a("h4",{id:"list-comprehension-数学定义"},[a("a",{class:"header-anchor",href:"#list-comprehension-数学定义","aria-hidden":"true"},"#"),e(" List Comprehension(数学定义)")],-1),yn=a("p",null,"由类似集合定义的离散数学定义,来定义复杂的 List:",-1),fn=a("p",null,[a("code",null,"[expression | filter]")],-1),wn=a("p",null,[a("code",null,"[expression | x <\\- Range, Predicate(断言/限制条件)]")],-1),xn=a("ul",null,[a("li",null,[e("Range: "),a("code",null,","),e("分隔多个 Range(一般为 List)")]),a("li",null,[e("Predicate: "),a("code",null,","),e("分隔多个断言;每个断言均为 Boolean 表达式")])],-1),Sn=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},"*"),a("span",{class:"token number"},"2"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},"*"),a("span",{class:"token number"},"2"),e(),a("span",{class:"token operator"},">="),e(),a("span",{class:"token number"},"12"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"12"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"14"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"16"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"18"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"20"),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"50"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"x"),e(" `"),a("span",{class:"token builtin"},"mod"),e("` "),a("span",{class:"token number"},"7"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"52"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"59"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"66"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"73"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"80"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"87"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"94"),a("span",{class:"token punctuation"},"]"),e("\n\n\n"),a("span",{class:"token hvariable"},"boomBangs"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),e(),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"<"),e(),a("span",{class:"token number"},"10"),e(),a("span",{class:"token keyword"},"then"),e(),a("span",{class:"token string"},'"BOOM!"'),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token string"},'"BANG!"'),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token builtin"},"odd"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"boomBangs"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"13"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"BOOM!"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"BOOM!"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"BANG!"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"BANG!"'),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),Ln=a("ul",null,[a("li",null,"多个 Range")],-1),Mn=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},"*"),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"11"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"16"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"20"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"22"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"40"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"50"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"55"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"80"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"110"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Fn=a("ul",null,[a("li",null,"嵌套 Comprehension")],-1),Tn=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"xxs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),e(),a("span",{class:"token punctuation"},"["),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token builtin"},"even"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"xxs"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),In=a("h3",{id:"tuple-原组"},[a("a",{class:"header-anchor",href:"#tuple-原组","aria-hidden":"true"},"#"),e(" Tuple(原组)")],-1),An=a("h4",{id:"内部差异性"},[a("a",{class:"header-anchor",href:"#内部差异性","aria-hidden":"true"},"#"),e(" 内部差异性")],-1),Cn=a("ul",null,[a("li",null,"同一 Tuple 里可存放不同 Type 的项")],-1),On=a("h4",{id:"外部差异性"},[a("a",{class:"header-anchor",href:"#外部差异性","aria-hidden":"true"},"#"),e(" 外部差异性")],-1),Nn=a("ul",null,[a("li",null,[e("数目不同或某项不同的 Tuple 属于不同 Type "),a("ul",null,[a("li",null,"不可置于同一 List 中"),a("li",null,"不同长度的 Tuple 不可比较(比较符只可用于相同 Type)")])])],-1),Bn=a("h4",{id:"tuple-function"},[a("a",{class:"header-anchor",href:"#tuple-function","aria-hidden":"true"},"#"),e(" Tuple Function")],-1),Wn=a("h5",{id:"二元组"},[a("a",{class:"header-anchor",href:"#二元组","aria-hidden":"true"},"#"),e(" 二元组")],-1),En=a("p",null,"fst/snd tuple 返回首项/尾项",-1),$n=a("p",null,"zip List1 List2 对应项配对,组成二元组 List",-1),Pn=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"zip"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"im"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"a"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"turtle"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"im"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"a"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"turtle"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"zip"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"apple"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token string"},'"orange"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token string"},'"cherry"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token string"},'"mango"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"apple"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"orange"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"cherry"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"mango"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),qn=a("h5",{id:"三元组"},[a("a",{class:"header-anchor",href:"#三元组","aria-hidden":"true"},"#"),e(" 三元组")],-1),Rn=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"first"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"c"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token hvariable"},"first"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"_"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"_"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"x"),e("\n\n"),a("span",{class:"token hvariable"},"second"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"c"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),e("\n"),a("span",{class:"token hvariable"},"second"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"_"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"_"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"y"),e("\n\n"),a("span",{class:"token hvariable"},"third"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"c"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"c"),e("\n"),a("span",{class:"token hvariable"},"third"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"_"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"_"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"z"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"z"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),zn=a("h3",{id:"泛型"},[a("a",{class:"header-anchor",href:"#泛型","aria-hidden":"true"},"#"),e(" 泛型")],-1),Dn=a("p",null,[e("运用 Type 变量(只可为"),a("em",null,"单字符"),e("), 实现泛型参数与多态函数.")],-1),Jn=a("p",null,"借助 TypeClass 可轻松实现多态函数:",-1),Gn=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token builtin"},"head"),e("\n"),a("span",{class:"token builtin"},"head"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n\n"),a("span",{class:"token comment"},"-- a 和 b 可为同类型"),e("\n"),a("span",{class:"token comment"},"-- 第一个参数与返回值必须同类型"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token builtin"},"fst"),e("\n"),a("span",{class:"token builtin"},"fst"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n\n"),a("span",{class:"token comment"},"-- 所有参数必须同类型,且必须为Num成员"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),_n=a("h3",{id:"函数类型"},[a("a",{class:"header-anchor",href:"#函数类型","aria-hidden":"true"},"#"),e(" 函数类型")],-1),Hn=a("ul",null,[a("li",null,"单个参数")],-1),Kn=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"removeNonUppercase"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"Char"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"Char"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"removeNonUppercase"),e(),a("span",{class:"token hvariable"},"st"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),e(),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"st"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"c"),e(" `"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token punctuation"},"["),a("span",{class:"token char string"},"'A'"),a("span",{class:"token operator"},".."),a("span",{class:"token char string"},"'Z'"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Yn=a("ul",null,[a("li",null,"多个参数")],-1),Vn=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"addThree"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Int"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Int"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Int"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Int"),e("\n"),a("span",{class:"token hvariable"},"addThree"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token hvariable"},"z"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"z"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Un=a("h2",{id:"基本语法"},[a("a",{class:"header-anchor",href:"#基本语法","aria-hidden":"true"},"#"),e(" 基本语法")],-1),Zn=a("h3",{id:"名字-函数定义"},[a("a",{class:"header-anchor",href:"#名字-函数定义","aria-hidden":"true"},"#"),e(" 名字/函数定义")],-1),jn=a("h4",{id:"模式匹配-pattern-matching"},[a("a",{class:"header-anchor",href:"#模式匹配-pattern-matching","aria-hidden":"true"},"#"),e(" 模式匹配(Pattern Matching)")],-1),Qn=a("p",null,"当函数拥有多个函数体(模式)时,会从上至下进行匹配各模式,一旦匹配则只应用这一函数体.",-1),Xn=a("h5",{id:"best-practice"},[a("a",{class:"header-anchor",href:"#best-practice","aria-hidden":"true"},"#"),e(" Best Practice")],-1),ns=a("ul",null,[a("li",null,"代替 if-else/switch 语句"),a("li",null,"递归算法(将递归基础作为首模式,递归函数体作为尾模式)"),a("li",null,"List Range 中亦可使用模式匹配")],-1),ss=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"addVectors"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"addVectors"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x1"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"y1"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x2"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"y2"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x1"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"x2"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"y1"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"y2"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),as=a("h5",{id:"常用模式"},[a("a",{class:"header-anchor",href:"#常用模式","aria-hidden":"true"},"#"),e(" 常用模式")],-1),es=a("h6",{id:"as-模式"},[a("a",{class:"header-anchor",href:"#as-模式","aria-hidden":"true"},"#"),e(" as 模式")],-1),ts=a("p",null,"all@(pattern) - all 为指向 pattern 整体的引用",-1),ls=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"all"),a("span",{class:"token operator"},"@"),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"y"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token comment"},"-- 其中all与(x:y:xs)等价"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),os=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"capital"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token hvariable"},"capital"),e(),a("span",{class:"token string"},'""'),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"Empty string, whoops!"'),e("\n"),a("span",{class:"token hvariable"},"capital"),e(),a("span",{class:"token builtin"},"all"),a("span",{class:"token operator"},"@"),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"The first letter of "'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token builtin"},"all"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token string"},'" is "'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),ps=a("h6",{id:"list-模式"},[a("a",{class:"header-anchor",href:"#list-模式","aria-hidden":"true"},"#"),e(" List 模式")],-1),cs=a("ul",null,[a("li",null,"x:xs"),a("li",null,"x:y:z:xs")],-1),rs=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"head"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token builtin"},"head"),e("' "),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"error"),e(),a("span",{class:"token string"},'"Can\'t call head on an empty list, dummy!"'),e("\n"),a("span",{class:"token builtin"},"head"),e("' "),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"_"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"x"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),us=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"length"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),e("\n"),a("span",{class:"token builtin"},"length"),e("' "),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),e("\n"),a("span",{class:"token builtin"},"length"),e("' "),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"_"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token builtin"},"length"),e("' "),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),is=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"sum"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token builtin"},"sum"),e("' "),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),e("\n"),a("span",{class:"token builtin"},"sum"),e("' "),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token builtin"},"sum"),e("' "),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),ks=a("h6",{id:"tuple"},[a("a",{class:"header-anchor",href:"#tuple","aria-hidden":"true"},"#"),e(" Tuple")],-1),bs=a("ul",null,[a("li",null,"(x, y)"),a("li",null,"(x, y, z)")],-1),ms=a("h4",{id:"guard-模式-与-where-绑定"},[a("a",{class:"header-anchor",href:"#guard-模式-与-where-绑定","aria-hidden":"true"},"#"),e(" guard 模式 与 where 绑定")],-1),hs=a("p",null,"子模式匹配: 运用布尔表达式实现判断,应用对应函数体",-1),ds=a("ul",null,[a("li",null,"关键符号: | 与 where"),a("li",null,"| 分隔函数体"),a("li",null,[e("where "),a("ul",null,[a("li",null,"可见性: 定义只对本模式可见的(私有)名字与(私有)函数"),a("li",null,"where 定义在最外层,使得各模式共享(私有)名字与(私有)函数"),a("li",null,[e("名字定义时可使用模式匹配 "),a("code",null,"where (head:_) = firstName")])])])],-1),vs=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"bmiTell"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"RealFloat"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token hvariable"},"bmiTell"),e(),a("span",{class:"token hvariable"},"weight"),e(),a("span",{class:"token hvariable"},"height"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"bmi"),e(),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token hvariable"},"skinny"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"You\'re underweight, you emo, you!"'),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"bmi"),e(),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token hvariable"},"normal"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},"\"You're supposedly normal. Pet, I bet you're ugly!\""),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"bmi"),e(),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token hvariable"},"fat"),e(" "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"You\'re fat! Lose some weight, fatty!"'),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token builtin"},"otherwise"),e(" "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"You\'re a whale, congratulations!"'),e("\n "),a("span",{class:"token keyword"},"where"),e(),a("span",{class:"token hvariable"},"bmi"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"weight"),e(),a("span",{class:"token operator"},"/"),e(),a("span",{class:"token hvariable"},"height"),e(),a("span",{class:"token operator"},"^"),e(),a("span",{class:"token number"},"2"),e("\n "),a("span",{class:"token hvariable"},"skinny"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"18.5"),e("\n "),a("span",{class:"token hvariable"},"normal"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"25.0"),e("\n "),a("span",{class:"token hvariable"},"fat"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"30.0"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br")])],-1),gs=a("h4",{id:"let-绑定"},[a("a",{class:"header-anchor",href:"#let-绑定","aria-hidden":"true"},"#"),e(" let 绑定")],-1),ys=a("p",null,"类似 where,绑定对象为表达式/函数",-1),fs=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"bindings"),e("\n"),a("span",{class:"token keyword"},"in"),e(" "),a("span",{class:"token hvariable"},"expressions"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),ws=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"sideArea"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"2"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token builtin"},"pi"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token hvariable"},"r"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token hvariable"},"h"),e("\n "),a("span",{class:"token hvariable"},"topArea"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"pi"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token hvariable"},"r"),e(),a("span",{class:"token operator"},"^"),a("span",{class:"token number"},"2"),e("\n"),a("span",{class:"token keyword"},"in"),e(" "),a("span",{class:"token hvariable"},"sideArea"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token number"},"2"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token hvariable"},"topArea"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),xs=a("ul",null,[a("li",null,"可见性:in 作用域,只对本 guard 可见"),a("li",null,"可使用模式匹配"),a("li",null,"可用于 List Range 中")],-1),Ss=a("h4",{id:"case-表达式"},[a("a",{class:"header-anchor",href:"#case-表达式","aria-hidden":"true"},"#"),e(" case 表达式")],-1),Ls=a("ul",null,[a("li",null,"模式匹配是 case 表达式的特殊情况(语法糖:简化写法)"),a("li",null,"在函数中,模式匹配只能用于参数定义中,而 case 表达式可用于其他地方(let/where 绑定 普通表达式 guard 语句)")],-1),Ms=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"case"),e(),a("span",{class:"token hvariable"},"expression"),e(),a("span",{class:"token keyword"},"of"),e(),a("span",{class:"token hvariable"},"pattern"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"result"),e("\n "),a("span",{class:"token hvariable"},"pattern"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"result"),e("\n "),a("span",{class:"token hvariable"},"pattern"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"result"),e("\n "),a("span",{class:"token operator"},"..."),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Fs=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"describeList"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token hvariable"},"describeList"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"The list is "'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token keyword"},"case"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token keyword"},"of"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token string"},'"empty."'),e("\n "),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token string"},'"a singleton list."'),e("\n "),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token string"},'"a longer list."'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Ts=a("h2",{id:"type-class"},[a("a",{class:"header-anchor",href:"#type-class","aria-hidden":"true"},"#"),e(" Type Class")],-1),Is=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"=="),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"=="),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Eq"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Bool"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token builtin"},"fromIntegral"),e("\n"),a("span",{class:"token builtin"},"fromIntegral"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Integral"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),As=a("h3",{id:"符号"},[a("a",{class:"header-anchor",href:"#符号","aria-hidden":"true"},"#"),e(" => 符号")],-1),Cs=a("p",null,"=> 左部: 类约束(Class Constraint) => 右部: 函数类型(参数/返回值类型),其中参数类型同属 Class",-1),Os=a("h3",{id:"basic-type-class"},[a("a",{class:"header-anchor",href:"#basic-type-class","aria-hidden":"true"},"#"),e(" Basic Type Class")],-1),Ns=a("blockquote",null,[a("p",null,"ghci> :info typeClassName")],-1),Bs=a("h4",{id:"eq"},[a("a",{class:"header-anchor",href:"#eq","aria-hidden":"true"},"#"),e(" Eq")],-1),Ws=a("ul",null,[a("li",null,"功能: 成员类型可判断相等性"),a("li",null,"成员: 大部分基本类型(不包含函数类型)"),a("li",null,"方法: == 与 /= 函数")],-1),Es=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token constant"},"Eq"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"=="),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Bool"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"/="),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Bool"),e("\n "),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"not"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"/="),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"/="),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"not"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),$s=a("h4",{id:"ord"},[a("a",{class:"header-anchor",href:"#ord","aria-hidden":"true"},"#"),e(" Ord")],-1),Ps=a("p",null,"Ord 成员必为 Eq 成员: class (Eq a) => Ord a where",-1),qs=a("ul",null,[a("li",null,"功能: 成员类型可排序"),a("li",null,"成员: 大部分基本类型(不包含函数类型)"),a("li",null,[e("方法: "),a("ul",null,[a("li",null,"< > <= >= 函数"),a("li",null,"compare 函数 (Ord a) => a -> a -> Ordering")])])],-1),Rs=a("h4",{id:"show"},[a("a",{class:"header-anchor",href:"#show","aria-hidden":"true"},"#"),e(" Show")],-1),zs=a("ul",null,[a("li",null,"功能: 成员类型可用字符串表示"),a("li",null,"成员: 大部分基本类型(不包含函数类型)"),a("li",null,"方法: show 函数 (Show a) => a -> String")],-1),Ds=a("p",null,[a("em",null,"Tips"),e(": 结合 Read, 可用于字符串与数值之间的转化")],-1),Js=a("h4",{id:"read"},[a("a",{class:"header-anchor",href:"#read","aria-hidden":"true"},"#"),e(" Read")],-1),Gs=a("ul",null,[a("li",null,"功能: 可以将字串转为 Read 某成员类型"),a("li",null,"成员: 大部分基本类型(不包含函数类型)"),a("li",null,"方法: read 函数 (Read a) => String -> a")],-1),_s=a("p",null,[a("em",null,"Tips"),e(": 结合 Show, 可用于字符串与数值之间的转化")],-1),Hs=a("h4",{id:"enum"},[a("a",{class:"header-anchor",href:"#enum","aria-hidden":"true"},"#"),e(" Enum")],-1),Ks=a("ul",null,[a("li",null,[e("功能: 连续性(可枚举), 其成员类型可用于"),a("em",null,"Range"),e("中")]),a("li",null,"成员: () Bool Char Ordering Int Integer Float Double")],-1),Ys=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"Thursday"),e(),a("span",{class:"token operator"},".."),e(),a("span",{class:"token constant"},"Sunday"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),Vs=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"succ"),e(),a("span",{class:"token constant"},"Monday"),e("\n"),a("span",{class:"token constant"},"Tuesday"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"pred"),e(),a("span",{class:"token constant"},"Saturday"),e("\n"),a("span",{class:"token constant"},"Friday"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Us=a("h4",{id:"bounded"},[a("a",{class:"header-anchor",href:"#bounded","aria-hidden":"true"},"#"),e(" Bounded")],-1),Zs=a("ul",null,[a("li",null,"功能: 成员类型具有上下限"),a("li",null,[e("方法: minBound/maxBound 函数 (Bounded a) => a "),a("em",null,"无参多态常量/定义")])],-1),js=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"minBound"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Day"),e("\n"),a("span",{class:"token constant"},"Monday"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"maxBound"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Day"),e("\n"),a("span",{class:"token constant"},"Sunday"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Qs=a("h4",{id:"num"},[a("a",{class:"header-anchor",href:"#num","aria-hidden":"true"},"#"),e(" Num")],-1),Xs=a("ul",null,[a("li",null,"功能: 成员类型具有数字特征"),a("li",null,"成员: 实数 整数 - Int Integer Float Double"),a("li",null,"方法: + - * abs 函数"),a("li",null,"实例: 所有数字都是多态常量/定义(可视为函数)")],-1),na=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token number"},"20"),e("\n"),a("span",{class:"token number"},"20"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"t"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"t"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),sa=a("h4",{id:"integral"},[a("a",{class:"header-anchor",href:"#integral","aria-hidden":"true"},"#"),e(" Integral")],-1),aa=a("ul",null,[a("li",null,"功能: 成员类型具有数字特征"),a("li",null,"成员: 整型 - Int Integer")],-1),ea=a("h4",{id:"floating"},[a("a",{class:"header-anchor",href:"#floating","aria-hidden":"true"},"#"),e(" Floating")],-1),ta=a("ul",null,[a("li",null,"功能: 成员类型具有数字特征"),a("li",null,"成员: 浮点型 - Float Double")],-1),la=a("table",null,[a("thead",null,[a("tr",null,[a("th",{style:{"text-align":"left"}},"TypeClass"),a("th",{style:{"text-align":"left"}},"Method Feature")])]),a("tbody",null,[a("tr",null,[a("td",{style:{"text-align":"left"}},"Functor"),a("td",{style:{"text-align":"left"}},"f a + (a -> b) -> f b")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"Applicative"),a("td",{style:{"text-align":"left"}},"f a + f (a -> b) -> f b")]),a("tr",null,[a("td",{style:{"text-align":"left"}},"Monad"),a("td",{style:{"text-align":"left"}},"m a + (a -> m b) -> m b")])])],-1),oa=a("h4",{id:"functor"},[a("a",{class:"header-anchor",href:"#functor","aria-hidden":"true"},"#"),e(),a("em",null,"Functor")],-1),pa=a("ul",null,[a("li",null,[e("成员: Maybe a, [], Either a, IO "),a("ul",null,[a("li",null,[e("成员 kind 必须为 "),a("code",null,"* -> *")]),a("li",null,[e("f "),a("em",null,"一元类型构造符(type constructor)")])])]),a("li",null,[e("必须遵守准则: "),a("ul",null,[a("li",null,"fmap id = id"),a("li",null,"fmap (f . g) F = fmap f (fmap g F)")])])],-1),ca=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"info"),e(),a("span",{class:"token constant"},"Functor"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token constant"},"Functor"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token builtin"},"fmap"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"b"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"$"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"a"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),ra=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Functor"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token builtin"},"fmap"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"map"),e("\n\n"),a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Functor"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token builtin"},"fmap"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token builtin"},"fmap"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token constant"},"Nothing"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Nothing"),e("\n\n"),a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Functor"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Either"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token builtin"},"fmap"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Right"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Right"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token builtin"},"fmap"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Left"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Left"),e(),a("span",{class:"token hvariable"},"x"),e("\n\n"),a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Functor"),e(),a("span",{class:"token constant"},"IO"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token builtin"},"fmap"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"action"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"result"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"action"),e("\n "),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"result"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br")])],-1),ua=a("h4",{id:"control-applicative"},[a("a",{class:"header-anchor",href:"#control-applicative","aria-hidden":"true"},"#"),e(" Control Applicative")],-1),ia=a("ul",null,[a("li",null,[e("成员: f :: "),a("code",null,"* -> *"),e(),a("em",null,"一元类型构造符(type constructor)")]),a("li",null,"<*>: 参数为 2 个 functor 实例,其中一个包含一个函数")],-1),ka=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"<$>"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Functor"),e(),a("span",{class:"token hvariable"},"f"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"b"),e("\n"),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"<$>"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"fmap"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),ba=a("ul",null,[a("li",null,"作用: 可以用单一一个函数操作多个 functor")],-1),ma=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Functor"),e(),a("span",{class:"token hvariable"},"f"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token constant"},"Applicative"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"pure"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"a"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"<*>"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"b"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),ha=a("h5",{id:"maybe"},[a("a",{class:"header-anchor",href:"#maybe","aria-hidden":"true"},"#"),e(" Maybe")],-1),da=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Applicative"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"pure"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Just"),e("\n "),a("span",{class:"token constant"},"Nothing"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Nothing"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"f"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token hvariable"},"something"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"fmap"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"something"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),va=a("h5",{id:"collection"},[a("a",{class:"header-anchor",href:"#collection","aria-hidden":"true"},"#"),e(" Collection "),a("code",null,"[]")],-1),ga=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Applicative"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"pure"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token hvariable"},"fs"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"fs"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),ya=a("h5",{id:"io"},[a("a",{class:"header-anchor",href:"#io","aria-hidden":"true"},"#"),e(" IO")],-1),fa=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Applicative"),e(),a("span",{class:"token constant"},"IO"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"pure"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"return"),e("\n "),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"a"),e("\n "),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"b"),e("\n "),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),wa=a("h5",{id:"ziplist"},[a("a",{class:"header-anchor",href:"#ziplist","aria-hidden":"true"},"#"),e(" ZipList")],-1),xa=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Applicative"),e(),a("span",{class:"token constant"},"ZipList"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"pure"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"ZipList"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"repeat"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token constant"},"ZipList"),e(),a("span",{class:"token hvariable"},"fs"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token constant"},"ZipList"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"ZipList"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"zipWith"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"fs"),e(),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),Sa=a("h5",{id:"multi-functor"},[a("a",{class:"header-anchor",href:"#multi-functor","aria-hidden":"true"},"#"),e(" Multi Functor")],-1),La=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"pure"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"+"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"5"),e("\n"),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"8"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"pure"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"+"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token constant"},"Nothing"),e("\n"),a("span",{class:"token constant"},"Nothing"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"pure"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"+"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token constant"},"Nothing"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"5"),e("\n"),a("span",{class:"token constant"},"Nothing"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),Ma=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"<$>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"11"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"16"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"20"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"22"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"40"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"50"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"55"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"80"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"110"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Fa=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"myAction"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"IO"),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token hvariable"},"myAction"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"<$>"),e(),a("span",{class:"token builtin"},"getLine"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token builtin"},"getLine"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Ta=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"getZipList"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"max"),e(),a("span",{class:"token operator"},"<$>"),e(),a("span",{class:"token constant"},"ZipList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token constant"},"ZipList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Ia=a("h5",{id:"高度封装函数"},[a("a",{class:"header-anchor",href:"#高度封装函数","aria-hidden":"true"},"#"),e(" 高度封装函数")],-1),Aa=a("p",null,[a("code",null,"liftA2"),e(", 对两个 applicative 运用二元函数:")],-1),Ca=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"liftA2"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Applicative"),e(),a("span",{class:"token hvariable"},"f"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"c"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"c"),e("\n"),a("span",{class:"token hvariable"},"liftA2"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"<$>"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token hvariable"},"b"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"liftA2"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},":"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},":"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"<$>"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),Oa=a("h4",{id:"control-monad"},[a("a",{class:"header-anchor",href:"#control-monad","aria-hidden":"true"},"#"),e(" Control Monad")],-1),Na=a("ul",null,[a("li",null,"成员: 类型构造符(type constructor)")],-1),Ba=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token constant"},"Monad"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token hvariable"},"a"),e("\n\n"),a("span",{class:"token comment"},"{- bind -}"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},">>="),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token hvariable"},"b"),e("\n\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},">>"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token hvariable"},"b"),e("\n "),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},">>"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"y"),e("\n\n "),a("span",{class:"token builtin"},"fail"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token hvariable"},"a"),e("\n "),a("span",{class:"token builtin"},"fail"),e(),a("span",{class:"token hvariable"},"msg"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"error"),e(),a("span",{class:"token hvariable"},"msg"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br")])],-1),Wa=a("ul",null,[a("li",null,"特性: 允许返回值之间具有弹性交互")],-1),Ea=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"{- 当出现异常后,之后所有的值都变为Nothing -}"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"landRight"),e(),a("span",{class:"token number"},"2"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"landLeft"),e(),a("span",{class:"token number"},"2"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"landRight"),e(),a("span",{class:"token number"},"2"),e("\n"),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"landLeft"),e(),a("span",{class:"token number"},"1"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"landRight"),e(),a("span",{class:"token number"},"4"),e("\n "),a("span",{class:"token operator"},"\\"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"landLeft"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"landRight"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token constant"},"Nothing"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),$a=a("p",null,"Monad Laws:",-1),Pa=a("ul",null,[a("li",null,[e("return 满足 Left identity: "),a("code",null,"return x >>= f 等于 f x")]),a("li",null,[e("return 满足 right identity: "),a("code",null,"m >>= return 等于 m")]),a("li",null,[e("Associativity: 结合律 "),a("code",null,"(m >>= f) >>= g 等于 m >>= (\\x -> f x >>= g)")])],-1),qa=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"100000"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"100003"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"100000"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token number"},"3"),e("\n"),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"100003"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token string"},'"move on up"'),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token string"},'"move on up"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"putStrLn"),e(),a("span",{class:"token string"},'"Wah!"'),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token constant"},"Wah"),a("span",{class:"token operator"},"!"),e("\n\n"),a("span",{class:"token comment"},"{-Tips: 利用结合律合并两个 Monadic Function-}"),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"<=<"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Monad"),e(),a("span",{class:"token hvariable"},"m"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token hvariable"},"c"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token hvariable"},"c"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"<=<"),e(),a("span",{class:"token hvariable"},"g"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"g"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"f"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},","),a("span",{class:"token operator"},"-"),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"g"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},"*"),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},"*"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"h"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"<=<"),e(),a("span",{class:"token hvariable"},"g"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"h"),e(),a("span",{class:"token number"},"3"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br")])],-1),Ra=a("h5",{id:"maybe-monad"},[a("a",{class:"header-anchor",href:"#maybe-monad","aria-hidden":"true"},"#"),e(" Maybe Monad")],-1),za=a("p",null,"具有失败可能性的 context 封装,灵活处理异常(返回值为 Nothing)",-1),Da=a("h6",{id:"实现"},[a("a",{class:"header-anchor",href:"#实现","aria-hidden":"true"},"#"),e(" 实现")],-1),Ja=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"applyMaybe"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token hvariable"},"b"),e("\n"),a("span",{class:"token hvariable"},"applyMaybe"),e(),a("span",{class:"token constant"},"Nothing"),e(),a("span",{class:"token hvariable"},"f"),e(" "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Nothing"),e("\n"),a("span",{class:"token hvariable"},"applyMaybe"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),Ga=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Monad"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"x"),e("\n "),a("span",{class:"token constant"},"Nothing"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Nothing"),e("\n "),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"f"),e(" "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),e("\n "),a("span",{class:"token builtin"},"fail"),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Nothing"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),_a=a("h6",{id:"do-表示法"},[a("a",{class:"header-anchor",href:"#do-表示法","aria-hidden":"true"},"#"),e(" do 表示法")],-1),Ha=a("ul",null,[a("li",null,"在 do expression 中,每一行都是一个 monadic value"),a("li",null,"检查返回值,使用 <-")],-1),Ka=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"foo"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token hvariable"},"foo"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"3"),e("\n "),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token string"},'"!"'),e("\n "),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"show"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"foo"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token hvariable"},"foo"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"3"),e(" "),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e("\n "),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token string"},'"!"'),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"->"),e("\n "),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"show"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"routine"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token constant"},"Pole"),e("\n"),a("span",{class:"token hvariable"},"routine"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"start"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token hvariable"},"first"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"landLeft"),e(),a("span",{class:"token number"},"2"),e(),a("span",{class:"token hvariable"},"start"),e("\n "),a("span",{class:"token constant"},"Nothing"),e("\n "),a("span",{class:"token hvariable"},"second"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"landRight"),e(),a("span",{class:"token number"},"2"),e(),a("span",{class:"token hvariable"},"first"),e("\n "),a("span",{class:"token hvariable"},"landLeft"),e(),a("span",{class:"token number"},"1"),e(),a("span",{class:"token hvariable"},"second"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br")])],-1),Ya=a("h5",{id:"list-monad"},[a("a",{class:"header-anchor",href:"#list-monad","aria-hidden":"true"},"#"),e(" List Monad")],-1),Va=a("ul",null,[a("li",null,"non-determinism(不确定性)")],-1),Ua=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"<$>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"<*>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1000"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1000"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"20"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"200"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2000"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"30"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"300"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3000"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Za=a("ul",null,[a("li",null,"实现")],-1),ja=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Monad"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"concat"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token builtin"},"fail"),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Qa=a("ul",null,[a("li",null,[e("返回值交互: 下例中 n 与 return (n, ch) 进行交互 "),a("ul",null,[a("li",null,"list comprehension 与 do 表示法 均是 >>= 的语法糖")])]),a("li",null,"list comprehension: <- 与 条件表达式"),a("li",null,"do 表示法: <- 与 guard 函数")],-1),Xa=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"n"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token char string"},"'a'"),a("span",{class:"token punctuation"},","),a("span",{class:"token char string"},"'b'"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"ch"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"n"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"ch"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token char string"},"'a'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token char string"},"'b'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token char string"},"'a'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token char string"},"'b'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token comment"},"{- do 表示法 -}"),e("\n"),a("span",{class:"token hvariable"},"listOfTuples"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Int"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Char"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"listOfTuples"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"n"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token hvariable"},"ch"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token char string"},"'a'"),a("span",{class:"token punctuation"},","),a("span",{class:"token char string"},"'b'"),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"n"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"ch"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"sevensOnly"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"Int"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"sevensOnly"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"50"),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token hvariable"},"guard"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token char string"},"'7'"),e(" `"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token builtin"},"show"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token hvariable"},"x"),e("\n\n"),a("span",{class:"token comment"},"{- list comprehension -}"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"n"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"ch"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"n"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"ch"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token char string"},"'a'"),a("span",{class:"token punctuation"},","),a("span",{class:"token char string"},"'b'"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token char string"},"'a'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token char string"},"'b'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token char string"},"'a'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token char string"},"'b'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br")])],-1),ne=a("h5",{id:"monadplus"},[a("a",{class:"header-anchor",href:"#monadplus","aria-hidden":"true"},"#"),e(" MonadPlus")],-1),se=a("p",null,"使 Monad 具有 Monoid 的性质(二元封闭运算)",-1),ae=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"MonadPlus"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"mzero"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token hvariable"},"mplus"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),ee=a("h5",{id:"monad-algorithms"},[a("a",{class:"header-anchor",href:"#monad-algorithms","aria-hidden":"true"},"#"),e(" Monad Algorithms")],-1),te=a("h6",{id:"马走日"},[a("a",{class:"header-anchor",href:"#马走日","aria-hidden":"true"},"#"),e(" 马走日")],-1),le=a("ul",null,[a("li",null,"计算出可移动位置")],-1),oe=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"moveKnight"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"KnightPos"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"KnightPos"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"moveKnight"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"c"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"r"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"c"),e("'"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"r"),e("'"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"c"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"r"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"c"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"r"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"c"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"r"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"c"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"r"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"c"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"r"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"c"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"r"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"c"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"r"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"c"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"r"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token hvariable"},"guard"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"c"),e("' `"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"&&"),e(),a("span",{class:"token hvariable"},"r"),e("' `"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"c"),e("'"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"r"),e("'"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),pe=a("ul",null,[a("li",null,"利用 >>= 向后传递多个可交互的位置")],-1),ce=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"in3"),e(),a("span",{class:"token hvariable"},"start"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token hvariable"},"start"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"moveKnight"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"moveKnight"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"moveKnight"),e("\n\n"),a("span",{class:"token hvariable"},"in3"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"KnightPos"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"KnightPos"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"in3"),e(),a("span",{class:"token hvariable"},"start"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"first"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"moveKnight"),e(),a("span",{class:"token hvariable"},"start"),e("\n "),a("span",{class:"token hvariable"},"second"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"moveKnight"),e(),a("span",{class:"token hvariable"},"first"),e("\n "),a("span",{class:"token hvariable"},"moveKnight"),e(),a("span",{class:"token hvariable"},"second"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),re=a("ul",null,[a("li",null,"最后完成完整函数: 产生所有三步的可能位置,检查其中一个位置是否在里面")],-1),ue=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"canReachIn3"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"KnightPos"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"KnightPos"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Bool"),e("\n"),a("span",{class:"token hvariable"},"canReachIn3"),e(),a("span",{class:"token hvariable"},"start"),e(),a("span",{class:"token hvariable"},"end"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"end"),e(" `"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token hvariable"},"in3"),e(),a("span",{class:"token hvariable"},"start"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),ie=a("h4",{id:"foldable"},[a("a",{class:"header-anchor",href:"#foldable","aria-hidden":"true"},"#"),e(" Foldable")],-1),ke=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(),a("span",{class:"token keyword"},"qualified"),e(" Data.Foldable "),a("span",{class:"token keyword"},"as"),e(" F")]),e("\n\n"),a("span",{class:"token hvariable"},"foldMap"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Monoid"),e(),a("span",{class:"token hvariable"},"m"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Foldable"),e(),a("span",{class:"token hvariable"},"t"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),be=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"F.Foldable"),e(),a("span",{class:"token constant"},"Tree"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"foldMap"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token constant"},"Empty"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"mempty"),e("\n "),a("span",{class:"token hvariable"},"foldMap"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Node"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"l"),e(),a("span",{class:"token hvariable"},"r"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"F.foldMap"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"l"),e(),a("span",{class:"token operator"},"`mappend`"),e("\n "),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),e(" "),a("span",{class:"token operator"},"`mappend`"),e("\n "),a("span",{class:"token hvariable"},"F.foldMap"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"r"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),me=a("h4",{id:"data-monoid"},[a("a",{class:"header-anchor",href:"#data-monoid","aria-hidden":"true"},"#"),e(" Data Monoid")],-1),he=a("ul",null,[a("li",null,"成员: 必须为具体类型(*不可是类型构造符(type constructor))"),a("li",null,[e("准则(Monoid Law): "),a("ul",null,[a("li",null,[a("em",null,"结合律"),e(" a·(b·c) = (a·b)·c")]),a("li",null,[e("无需满足 a "),a("code",null,"mappend"),e(" b == b "),a("code",null,"mappend"),e(" a")])])])],-1),de=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token constant"},"Monoid"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"mempty"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"m"),e(" "),a("span",{class:"token comment"},"-- identity"),e("\n "),a("span",{class:"token hvariable"},"mappend"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),e("\n "),a("span",{class:"token hvariable"},"mconcat"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"m"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"m"),e("\n "),a("span",{class:"token hvariable"},"mconcat"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"foldr"),e(),a("span",{class:"token hvariable"},"mappend"),e(),a("span",{class:"token hvariable"},"mempty"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),ve=a("ul",null,[a("li",null,"实例")],-1),ge=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Monoid"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"mempty"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token hvariable"},"mappend"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),ye=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"newtype"),e(),a("span",{class:"token constant"},"Product"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"="),e(" "),a("span",{class:"token constant"},"Product"),e(),a("span",{class:"token punctuation"},"{"),e(),a("span",{class:"token hvariable"},"getProduct"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token keyword"},"deriving"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Eq"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Ord"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Read"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Show"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Bounded"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token constant"},"Monoid"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Product"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"mempty"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Product"),e(),a("span",{class:"token number"},"1"),e("\n "),a("span",{class:"token constant"},"Product"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token constant"},"Product"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Product"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"getProduct"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token constant"},"Product"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token constant"},"Product"),e(),a("span",{class:"token number"},"4"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token constant"},"Product"),e(),a("span",{class:"token number"},"2"),e("\n"),a("span",{class:"token number"},"24"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br")])],-1),fe=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"newtype"),e(),a("span",{class:"token constant"},"Any"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Any"),e(),a("span",{class:"token punctuation"},"{"),e(),a("span",{class:"token hvariable"},"getAny"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Bool"),e(),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token keyword"},"deriving"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Eq"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Ord"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Read"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Show"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Bounded"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Monoid"),e(),a("span",{class:"token constant"},"Any"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"mempty"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Any"),e(),a("span",{class:"token constant"},"False"),e("\n "),a("span",{class:"token constant"},"Any"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token constant"},"Any"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Any"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"||"),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"getAny"),a("span",{class:"token operator"}," . "),a("span",{class:"token hvariable"},"mconcat"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token constant"},"Any"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"False"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"False"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"False"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"True"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"True"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br")])],-1),we=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"newtype"),e(),a("span",{class:"token constant"},"All"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"All"),e(),a("span",{class:"token punctuation"},"{"),e(),a("span",{class:"token hvariable"},"getAll"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Bool"),e(),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token keyword"},"deriving"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Eq"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Ord"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Read"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Show"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Bounded"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Monoid"),e(),a("span",{class:"token constant"},"All"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"mempty"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"All"),e(),a("span",{class:"token constant"},"True"),e("\n "),a("span",{class:"token constant"},"All"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token constant"},"All"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"All"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"&&"),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"getAll"),a("span",{class:"token operator"}," . "),a("span",{class:"token hvariable"},"mconcat"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token constant"},"All"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"True"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"True"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"False"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"False"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br")])],-1),xe=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Monoid"),e(),a("span",{class:"token constant"},"Ordering"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"mempty"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"EQ"),e("\n "),a("span",{class:"token constant"},"LT"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"LT"),e("\n "),a("span",{class:"token constant"},"EQ"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"y"),e("\n "),a("span",{class:"token constant"},"GT"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"GT"),e("\n\n"),a("span",{class:"token comment"},"-- Tips:"),e("\n"),a("span",{class:"token comment"},"-- mappend 在左边不等于 EQ 的情况下都会回传左边的值。相反地则回传右边的值"),e("\n"),a("span",{class:"token comment"},"-- 可代替多个 if/else 语句"),e("\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Data.Monoid")]),e("\n\n"),a("span",{class:"token hvariable"},"lengthCompare"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Ordering"),e("\n"),a("span",{class:"token hvariable"},"lengthCompare"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"length"),e(),a("span",{class:"token hvariable"},"x"),e(" `"),a("span",{class:"token builtin"},"compare"),e("` "),a("span",{class:"token builtin"},"length"),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"`mappend`"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"vowels"),e(),a("span",{class:"token hvariable"},"x"),e(" `"),a("span",{class:"token builtin"},"compare"),e("` "),a("span",{class:"token hvariable"},"vowels"),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"`mappend`"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),e(" `"),a("span",{class:"token builtin"},"compare"),e("` "),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"where"),e(),a("span",{class:"token hvariable"},"vowels"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"length"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token punctuation"},"("),e("`"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token string"},'"aeiou"'),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br")])],-1),Se=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Monoid"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token constant"},"Monoid"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"mempty"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Nothing"),e("\n "),a("span",{class:"token constant"},"Nothing"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"m"),e("\n "),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token constant"},"Nothing"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"m"),e("\n "),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"m1"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"m2"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"m1"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token hvariable"},"m2"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Monoid"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"First"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"mempty"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"First"),e(),a("span",{class:"token constant"},"Nothing"),e("\n "),a("span",{class:"token constant"},"First"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"First"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token constant"},"First"),e(),a("span",{class:"token constant"},"Nothing"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"x"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"getFirst"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token constant"},"First"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token char string"},"'a'"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token constant"},"First"),e(),a("span",{class:"token constant"},"Nothing"),e("\n"),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token char string"},"'a'"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br")])],-1),Le=a("h3",{id:"custom-type-class"},[a("a",{class:"header-anchor",href:"#custom-type-class","aria-hidden":"true"},"#"),e(" Custom Type Class")],-1),Me=a("ul",null,[a("li",null,[e("创建新类: "),a("em",null,"可以只有声明没有实现")])],-1),Fe=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token constant"},"ClassName"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token hvariable"},"defining"),e(),a("span",{class:"token hvariable"},"code"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Te=a("ul",null,[a("li",null,[e("创建已有类的实例: "),a("em",null,"必须实现所有已声明函数"),a("ul",null,[a("li",null,"作用等同于 deriving(自由度更大)"),a("li",null,"可以重写函数,去除默认函数处理,达到特定目的")])])],-1),Ie=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token operator"},"-"),e(" 先创建新类型\n"),a("span",{class:"token keyword"},"data"),e(),a("span",{class:"token constant"},"TrafficLight"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Red"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"Yellow"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"Green"),e("\n\n"),a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Eq"),e(),a("span",{class:"token constant"},"TrafficLight"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token constant"},"Red"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token constant"},"Red"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"True"),e("\n "),a("span",{class:"token constant"},"Green"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token constant"},"Green"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"True"),e("\n "),a("span",{class:"token constant"},"Yellow"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token constant"},"Yellow"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"True"),e("\n "),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"False"),e("\n\n"),a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Show"),e(),a("span",{class:"token constant"},"TrafficLight"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token builtin"},"show"),e(),a("span",{class:"token constant"},"Red"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"Red light"'),e("\n "),a("span",{class:"token builtin"},"show"),e(),a("span",{class:"token constant"},"Yellow"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"Yellow light"'),e("\n "),a("span",{class:"token builtin"},"show"),e(),a("span",{class:"token constant"},"Green"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"Green light"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br")])],-1),Ae=a("ul",null,[a("li",null,[e("创建新类和实现实例时,使用 class constraint "),a("ul",null,[a("li",null,[e("可达到"),a("em",null,"类似于"),e("继承的效果")]),a("li",null,"可达到限制类型的效果")])])],-1),Ce=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Eq"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token operator"},"..."),e("\n\n"),a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Eq"),e(),a("span",{class:"token hvariable"},"m"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token constant"},"Eq"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token hvariable"},"m"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token hvariable"},"y"),e("\n "),a("span",{class:"token constant"},"Nothing"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token constant"},"Nothing"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"True"),e("\n "),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"False"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),Oe=a("h3",{id:"data-type"},[a("a",{class:"header-anchor",href:"#data-type","aria-hidden":"true"},"#"),e(),a("code",null,"data"),e(" type")],-1),Ne=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"data"),e(),a("span",{class:"token constant"},"SelfDefinedTypeName"),e(),a("span",{class:"token operator"},"="),e("\n "),a("span",{class:"token constant"},"ValueConstructorName"),e(),a("span",{class:"token constant"},"ValueType"),e(),a("span",{class:"token operator"},".."),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token operator"},".."),e(),a("span",{class:"token keyword"},"deriving"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"TypeClass"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Be=a("ul",null,[a("li",null,"data 范例")],-1),We=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"data"),e(),a("span",{class:"token constant"},"Point"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Point"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token keyword"},"deriving"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Show"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token keyword"},"data"),e(),a("span",{class:"token constant"},"Shape"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Circle"),e(),a("span",{class:"token constant"},"Point"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"Rectangle"),e(),a("span",{class:"token constant"},"Point"),e(),a("span",{class:"token constant"},"Point"),e(),a("span",{class:"token keyword"},"deriving"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Show"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Ee=a("ul",null,[a("li",null,"导出 data")],-1),$e=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e(),a("span",{class:"token constant"},"Shapes"),e("\n"),a("span",{class:"token punctuation"},"("),e(),a("span",{class:"token constant"},"Point"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Shape"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Pe=a("ul",null,[a("li",null,"后构造器 > 前构造器")],-1),qe=a("blockquote",null,[a("p",null,"e.g True > False")],-1),Re=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"data"),e(),a("span",{class:"token constant"},"Bool"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"False"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"True"),e(),a("span",{class:"token keyword"},"deriving"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Ord"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),ze=a("h4",{id:"函数特性"},[a("a",{class:"header-anchor",href:"#函数特性","aria-hidden":"true"},"#"),e(" 函数特性")],-1),De=a("p",null,"data type 也是函数,若省略参数亦会造成 Curry 化.",-1),Je=a("blockquote",null,[a("p",null,"e.g map fx list")],-1),Ge=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Circle"),e(),a("span",{class:"token number"},"10"),e(),a("span",{class:"token number"},"20"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"Circle"),e(),a("span",{class:"token number"},"10.0"),e(),a("span",{class:"token number"},"20.0"),e(),a("span",{class:"token number"},"4.0"),a("span",{class:"token punctuation"},","),e("\n"),a("span",{class:"token constant"},"Circle"),e(),a("span",{class:"token number"},"10.0"),e(),a("span",{class:"token number"},"20.0"),e(),a("span",{class:"token number"},"5.0"),a("span",{class:"token punctuation"},","),e("\n"),a("span",{class:"token constant"},"Circle"),e(),a("span",{class:"token number"},"10.0"),e(),a("span",{class:"token number"},"20.0"),e(),a("span",{class:"token number"},"6.0"),a("span",{class:"token punctuation"},","),e("\n"),a("span",{class:"token constant"},"Circle"),e(),a("span",{class:"token number"},"10.0"),e(),a("span",{class:"token number"},"20.0"),e(),a("span",{class:"token number"},"6.0"),e("\n"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),_e=a("ul",null,[a("li",null,[e("Value Constructor:使用"),a("code",null,"ValueConstructorName ValueType .."),e("可构造出一个该类型的定义/名字")])],-1),He=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),e(),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Circle"),e(),a("span",{class:"token number"},"10"),e(),a("span",{class:"token number"},"20"),e(),a("span",{class:"token number"},"30"),e("\n"),a("span",{class:"token constant"},"Circle"),e(),a("span",{class:"token number"},"10"),e(),a("span",{class:"token number"},"20"),e(),a("span",{class:"token number"},"30"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Ke=a("h4",{id:"记录语法-record-syntax"},[a("a",{class:"header-anchor",href:"#记录语法-record-syntax","aria-hidden":"true"},"#"),e(" 记录语法(Record Syntax)")],-1),Ye=a("ul",null,[a("li",null,"定义")],-1),Ve=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"data"),e(),a("span",{class:"token constant"},"Person"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Person"),e(),a("span",{class:"token punctuation"},"{"),e(),a("span",{class:"token hvariable"},"firstName"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"String"),e("\n "),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"lastName"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"String"),e("\n "),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"age"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Int"),e("\n "),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"height"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e("\n "),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"phoneNumber"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"String"),e("\n "),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"flavor"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"String"),e("\n "),a("span",{class:"token punctuation"},"}"),e(),a("span",{class:"token keyword"},"deriving"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Show"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),Ue=a("ul",null,[a("li",null,"使用")],-1),Ze=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Car"),e(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token hvariable"},"company"),a("span",{class:"token operator"},"="),a("span",{class:"token string"},'"Ford"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"model"),a("span",{class:"token operator"},"="),a("span",{class:"token string"},'"Mustang"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"year"),a("span",{class:"token operator"},"="),a("span",{class:"token number"},"1967"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token constant"},"Car"),e(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token hvariable"},"company"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"Ford"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"model"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"Mustang"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"year"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1967"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),je=a("h4",{id:"类型参数-type-parameters"},[a("a",{class:"header-anchor",href:"#类型参数-type-parameters","aria-hidden":"true"},"#"),e(" 类型参数(Type Parameters)")],-1),Qe=a("p",null,"提高代码的复用性",-1),Xe=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"data"),e(),a("span",{class:"token constant"},"Car"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Car"),e(),a("span",{class:"token punctuation"},"{"),e(),a("span",{class:"token hvariable"},"company"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"a"),e("\n "),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"model"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"b"),e("\n "),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"year"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"c"),e("\n "),a("span",{class:"token punctuation"},"}"),e(),a("span",{class:"token keyword"},"deriving"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Show"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),nt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"tellCar"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Show"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token constant"},"Car"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token hvariable"},"tellCar"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Car"),e(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token hvariable"},"company"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"c"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"model"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"m"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"year"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e("\n "),a("span",{class:"token string"},'"This "'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token string"},'" "'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token hvariable"},"m"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token string"},'" was made in "'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token builtin"},"show"),e(),a("span",{class:"token hvariable"},"y"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),st=a("h5",{id:"maybe-value-constructor"},[a("a",{class:"header-anchor",href:"#maybe-value-constructor","aria-hidden":"true"},"#"),e(" Maybe value constructor")],-1),at=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"data"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Nothing"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"a"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),et=a("ul",null,[a("li",null,"Just 可实现转化:")],-1),tt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token hvariable"},"a"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),lt=a("h4",{id:"deriving-派生"},[a("a",{class:"header-anchor",href:"#deriving-派生","aria-hidden":"true"},"#"),e(" Deriving(派生)")],-1),ot=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"data"),e(),a("span",{class:"token constant"},"Day"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Monday"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"Tuesday"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"Wednesday"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"Thursday"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"Friday"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"Saturday"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"Sunday"),e("\n "),a("span",{class:"token keyword"},"deriving"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Eq"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Ord"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Show"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Read"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Bounded"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Enum"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),pt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Wednesday"),e("\n"),a("span",{class:"token constant"},"Wednesday"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"show"),e(),a("span",{class:"token constant"},"Wednesday"),e("\n"),a("span",{class:"token string"},'"Wednesday"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"read"),e(),a("span",{class:"token string"},'"Saturday"'),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Day"),e("\n"),a("span",{class:"token constant"},"Saturday"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Saturday"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token constant"},"Sunday"),e("\n"),a("span",{class:"token constant"},"False"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Saturday"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token constant"},"Saturday"),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Saturday"),e(),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Friday"),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Monday"),e(" `"),a("span",{class:"token builtin"},"compare"),e("` "),a("span",{class:"token constant"},"Wednesday"),e("\n"),a("span",{class:"token constant"},"LT"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"minBound"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Day"),e("\n"),a("span",{class:"token constant"},"Monday"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"maxBound"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Day"),e("\n"),a("span",{class:"token constant"},"Sunday"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"succ"),e(),a("span",{class:"token constant"},"Monday"),e("\n"),a("span",{class:"token constant"},"Tuesday"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"pred"),e(),a("span",{class:"token constant"},"Saturday"),e("\n"),a("span",{class:"token constant"},"Friday"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"Thursday"),e(),a("span",{class:"token operator"},".."),e(),a("span",{class:"token constant"},"Sunday"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"Thursday"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Friday"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Saturday"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Sunday"),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token builtin"},"minBound"),e(),a("span",{class:"token operator"},".."),e(),a("span",{class:"token builtin"},"maxBound"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"Day"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"Monday"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Tuesday"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Wednesday"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Thursday"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Friday"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Saturday"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Sunday"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br")])],-1),ct=a("h4",{id:"type-定义"},[a("a",{class:"header-anchor",href:"#type-定义","aria-hidden":"true"},"#"),e(" type 定义")],-1),rt=a("p",null,[e("为 data 声明别名 - "),a("code",null,"typedef")],-1),ut=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"type"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"Char"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token keyword"},"type"),e(),a("span",{class:"token constant"},"PhoneNumber"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token keyword"},"type"),e(),a("span",{class:"token constant"},"Name"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token keyword"},"type"),e(),a("span",{class:"token constant"},"PhoneBook"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Name"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"PhoneNumber"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),it=a("ul",null,[a("li",null,"type 类型参数: 匹配 data 类型参数")],-1),kt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"type"),e(),a("span",{class:"token constant"},"AssocList"),e(),a("span",{class:"token hvariable"},"k"),e(),a("span",{class:"token hvariable"},"v"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"v"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token keyword"},"type"),e(),a("span",{class:"token constant"},"IntMap"),e(),a("span",{class:"token hvariable"},"v"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Map.Map"),e(),a("span",{class:"token constant"},"Int"),e(),a("span",{class:"token hvariable"},"v"),e("\n"),a("span",{class:"token keyword"},"type"),e(),a("span",{class:"token constant"},"IntMap"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Map.Map"),e(),a("span",{class:"token constant"},"Int"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),bt=a("p",null,"类型别名,只可以在 Haskell 的类型部分中使用:",-1),mt=a("ul",null,[a("li",null,"定义新类型"),a("li",null,"类型声明"),a("li",null,"类型注释(:😃"),a("li",null,[e("禁止: 定义名字/定义 "),a("em",null,"AssocList [(1,2),(4,5),(7,9)]")])],-1),ht=a("h4",{id:"高级数据结构"},[a("a",{class:"header-anchor",href:"#高级数据结构","aria-hidden":"true"},"#"),e(" 高级数据结构")],-1),dt=a("h5",{id:"栈"},[a("a",{class:"header-anchor",href:"#栈","aria-hidden":"true"},"#"),e(" 栈")],-1),vt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"type"),e(),a("span",{class:"token constant"},"Stack"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"Int"),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token hvariable"},"pop"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Stack"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Int"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Stack"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"pop"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"push"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Int"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Stack"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Stack"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"push"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"a"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),gt=a("h5",{id:"链表"},[a("a",{class:"header-anchor",href:"#链表","aria-hidden":"true"},"#"),e(" 链表")],-1),yt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"data"),e(),a("span",{class:"token constant"},"List"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Empty"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"Cons"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"List"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"deriving"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Show"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Read"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Eq"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Ord"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token keyword"},"data"),e(),a("span",{class:"token constant"},"List"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Empty"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"Cons"),e(),a("span",{class:"token punctuation"},"{"),e(),a("span",{class:"token hvariable"},"listHead"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"listTail"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"List"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"}"),e(),a("span",{class:"token keyword"},"deriving"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Show"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Read"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Eq"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Ord"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),ft=a("h5",{id:"二叉树"},[a("a",{class:"header-anchor",href:"#二叉树","aria-hidden":"true"},"#"),e(" 二叉树")],-1),wt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"data"),e(),a("span",{class:"token constant"},"Tree"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"EmptyTree"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token constant"},"Node"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Tree"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Tree"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"deriving"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Show"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Read"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Eq"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),xt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"singleton"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Tree"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token hvariable"},"singleton"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Node"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token constant"},"EmptyTree"),e(),a("span",{class:"token constant"},"EmptyTree"),e("\n\n"),a("span",{class:"token hvariable"},"treeInsert"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Ord"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Tree"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Tree"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token hvariable"},"treeInsert"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token constant"},"EmptyTree"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"singleton"),e(),a("span",{class:"token hvariable"},"x"),e("\n"),a("span",{class:"token hvariable"},"treeInsert"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Node"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"left"),e(),a("span",{class:"token hvariable"},"right"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Node"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"left"),e(),a("span",{class:"token hvariable"},"right"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"<"),e(),a("span",{class:"token hvariable"},"a"),e(" "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Node"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"treeInsert"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"left"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"right"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"a"),e(" "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Node"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"left"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"treeInsert"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"right"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"treeElem"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Ord"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Tree"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Bool"),e("\n"),a("span",{class:"token hvariable"},"treeElem"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token constant"},"EmptyTree"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"False"),e("\n"),a("span",{class:"token hvariable"},"treeElem"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Node"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"left"),e(),a("span",{class:"token hvariable"},"right"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"True"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"<"),e(),a("span",{class:"token hvariable"},"a"),e(" "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"treeElem"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"left"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"a"),e(" "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"treeElem"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"right"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"nums"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"numsTree"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"foldr"),e(),a("span",{class:"token hvariable"},"treeInsert"),e(),a("span",{class:"token constant"},"EmptyTree"),e(),a("span",{class:"token hvariable"},"nums"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br")])],-1),St=a("h2",{id:"函数"},[a("a",{class:"header-anchor",href:"#函数","aria-hidden":"true"},"#"),e(" 函数")],-1),Lt=a("h3",{id:"递归函数"},[a("a",{class:"header-anchor",href:"#递归函数","aria-hidden":"true"},"#"),e(" 递归函数")],-1),Mt=a("ul",null,[a("li",null,"边界条件"),a("li",null,"递归基础"),a("li",null,"递归函数体")],-1),Ft=a("h4",{id:"list-函数"},[a("a",{class:"header-anchor",href:"#list-函数","aria-hidden":"true"},"#"),e(" List 函数")],-1),Tt=a("ul",null,[a("li",null,"边界条件: 空 List"),a("li",null,"递归函数体: x:xs 取出首元素进行一般操作,对尾部进行递归操作.")],-1),It=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"maximum"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Ord"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token builtin"},"maximum"),e("' "),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"error"),e(),a("span",{class:"token string"},'"maximum of empty list"'),e("\n"),a("span",{class:"token builtin"},"maximum"),e("' "),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"x"),e("\n"),a("span",{class:"token comment"},"{-\nmaximum' (x:xs)\n | x > maxTail = x\n | otherwise = maxTail\n where maxTail = maximum' xs\n-}"),e("\n"),a("span",{class:"token builtin"},"maximum"),e("' "),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"max"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"maximum"),e("' "),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br")])],-1),At=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"replicate"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"i"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Ord"),e(),a("span",{class:"token hvariable"},"i"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"i"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"replicate"),e("' "),a("span",{class:"token hvariable"},"n"),e(),a("span",{class:"token hvariable"},"x"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"n"),e(),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"0"),e(" "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token builtin"},"otherwise"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token builtin"},"replicate"),e("' "),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"n"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"x"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Ct=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"take"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"i"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Ord"),e(),a("span",{class:"token hvariable"},"i"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"i"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"take"),e("' "),a("span",{class:"token hvariable"},"n"),e(),a("span",{class:"token hvariable"},"_"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"n"),e(),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"0"),e(" "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"take"),e("' "),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(" "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"take"),e("' "),a("span",{class:"token hvariable"},"n"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},":"),e(),a("span",{class:"token builtin"},"take"),e("' "),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"n"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),Ot=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"reverse"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"reverse"),e("' "),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"reverse"),e("' "),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"reverse"),e("' "),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),Nt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"repeat"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"repeat"),e("' "),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token builtin"},"repeat"),e("' "),a("span",{class:"token hvariable"},"x"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Bt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"zip"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"zip"),e("' "),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"zip"),e("' "),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"zip"),e("' "),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"y"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"ys"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},":"),a("span",{class:"token builtin"},"zip"),e("' "),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token hvariable"},"ys"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Wt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"elem"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Eq"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Bool"),e("\n"),a("span",{class:"token builtin"},"elem"),e("' "),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"False"),e("\n"),a("span",{class:"token builtin"},"elem"),e("' "),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token hvariable"},"x"),e(" "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"True"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token builtin"},"otherwise"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"a"),e(" `"),a("span",{class:"token builtin"},"elem"),e("'` "),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),Et=a("p",null,"Awesome Quick Sort",-1),$t=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"quicksort"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Ord"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"quicksort"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"quicksort"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e("\n "),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"smallerSorted"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"quicksort"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token hvariable"},"biggerSorted"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"quicksort"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token keyword"},"in"),e(),a("span",{class:"token hvariable"},"smallerSorted"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token hvariable"},"biggerSorted"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),Pt=a("h3",{id:"高阶函数"},[a("a",{class:"header-anchor",href:"#高阶函数","aria-hidden":"true"},"#"),e(" 高阶函数")],-1),qt=a("h4",{id:"curry-化"},[a("a",{class:"header-anchor",href:"#curry-化","aria-hidden":"true"},"#"),e(" Curry 化")],-1),Rt=a("p",null,[e("当传入不全参数时,会改变函数的类型,"),a("em",null,"返回值从单类型变成函数类型"),e(".")],-1),zt=a("ul",null,[a("li",null,"当传入不全参数时:"),a("li",null,"compare 的类型变为 (Ord a) => a -> (a -> Ordering)")],-1),Dt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"compareWithHundred"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"Ord"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Ordering"),e("\n"),a("span",{class:"token hvariable"},"compareWithHundred"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"compare"),e(),a("span",{class:"token number"},"100"),e(),a("span",{class:"token hvariable"},"x"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Jt=a("ul",null,[a("li",null,"通过给二元中缀函数传递唯一参数:"),a("li",null,"中缀函数类型由 a -> a -> a 转为 a -> a")],-1),Gt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"divideByTen"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Floating"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token hvariable"},"divideByTen"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"/"),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"/"),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"/"),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Fractional"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),_t=a("ul",null,[a("li",null,[e("包装函数: "),a("ul",null,[a("li",null,"传入一个二元函数作为参数,便可实现 zipWithFunc"),a("li",null,"若在定义时便传入一个函数参数,便可实现 Curry 化")])])],-1),Ht=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"zipWith"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"c"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"c"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"zipWith"),e("' "),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"zipWith"),e("' "),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"zipWith"),e("' "),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"y"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"ys"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},":"),e(),a("span",{class:"token builtin"},"zipWith"),e("' "),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token hvariable"},"ys"),e("\n\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"zipWith"),e("' "),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"+"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"zipWith"),e("' "),a("span",{class:"token builtin"},"max"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"zipWith"),e("' "),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"foo "'),e(","),a("span",{class:"token string"},'"bar "'),e(","),a("span",{class:"token string"},'"baz "'),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"fighters"'),e(","),a("span",{class:"token string"},'"hoppers"'),e(","),a("span",{class:"token string"},'"aldrin"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"foo fighters"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"bar hoppers"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"baz aldrin"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"zipWith"),e("' "),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"replicate"),e(),a("span",{class:"token number"},"5"),e(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"zipWith"),e("' "),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"zipWith"),e("' "),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"20"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"30"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"12"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"12"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br")])],-1),Kt=a("ul",null,[a("li",null,"通过 Curry 化,还可省略参数")],-1),Yt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"foo"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"bar"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e("\n"),a("span",{class:"token hvariable"},"foo"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"bar"),e(),a("span",{class:"token hvariable"},"b"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Vt=a("h4",{id:"map-函数"},[a("a",{class:"header-anchor",href:"#map-函数","aria-hidden":"true"},"#"),e(" map 函数")],-1),Ut=a("p",null,"映射函数 - List Comprehension 的函数化",-1),Zt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},":"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),jt=a("ul",null,[a("li",null,[e("如果 map 传入的函数参数的类型为 a -> a -> a,则返回的 List 类型为"),a("code",null,"[a -> a]"),e("(f x 传参不完全,造成了 Curry 化).")])],-1),Qt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"listOfFun"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"listOfFun"),e(),a("span",{class:"token operator"},"!!"),e(),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token number"},"5"),e("\n"),a("span",{class:"token number"},"20"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),Xt=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token string"},'"!"'),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"BIFF"'),e(","),a("span",{class:"token string"},'"BANG"'),e(","),a("span",{class:"token string"},'"POW"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"BIFF!"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"BANG!"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"POW!"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"replicate"),e(),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"^"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"16"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"25"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"36"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"49"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"64"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token builtin"},"fst"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br")])],-1),nl=a("h4",{id:"filter-函数"},[a("a",{class:"header-anchor",href:"#filter-函数","aria-hidden":"true"},"#"),e(" filter 函数")],-1),sl=a("p",null,"过滤函数 - Comprehension 的函数化",-1),al=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Bool"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token hvariable"},"p"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"p"),e(),a("span",{class:"token hvariable"},"x"),e(" "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},":"),e(),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token hvariable"},"p"),e(),a("span",{class:"token hvariable"},"xs"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token builtin"},"otherwise"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token hvariable"},"p"),e(),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),el=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},">"),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"=="),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token builtin"},"even"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"notNull"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"not"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"null"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"in"),e(),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token hvariable"},"notNull"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token punctuation"},"("),e("`"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token punctuation"},"["),a("span",{class:"token char string"},"'a'"),a("span",{class:"token operator"},".."),a("span",{class:"token char string"},"'z'"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"u LaUgH aT mE BeCaUsE I aM diFfeRent"'),e("\n"),a("span",{class:"token string"},'"uagameasadifeent"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token punctuation"},"("),e("`"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token punctuation"},"["),a("span",{class:"token char string"},"'A'"),a("span",{class:"token operator"},".."),a("span",{class:"token char string"},"'Z'"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"i lauGh At You BecAuse u r aLL the Same"'),e("\n"),a("span",{class:"token string"},'"GAYBALLS"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br")])],-1),tl=a("h4",{id:"fold-函数与-scan-函数"},[a("a",{class:"header-anchor",href:"#fold-函数与-scan-函数","aria-hidden":"true"},"#"),e(" fold 函数与 scan 函数")],-1),ll=a("p",null,[a("img",{src:"/awesome-notes/assets/foldl.8f7f9807.png",alt:"折叠函数"})],-1),ol=a("blockquote",null,[a("p",null,"如图中所示,左折叠时将 acc 视为第 0 个元素;右折叠时将 acc 视为最后一个元素.")],-1),pl=a("ul",null,[a("li",null,[e("三要素: "),a("ul",null,[a("li",null,"二元函数 \\acc x -> function 或 \\x acc -> function"),a("li",null,"初始累加值"),a("li",null,"待折叠 List")])]),a("li",null,[e("工作原理: "),a("ul",null,[a("li",null,"不断从 List 中取出元素,进行二元函数调用,直至 List 被取空"),a("li",null,"调用参数分别为 新取出元素 x 与 之前 n 次调用后的累加值 acc"),a("li",null,"返回值作为下次调用的累加值 acc")])]),a("li",null,[e("左折叠函数 "),a("ul",null,[a("li",null,[e("foldl "),a("code",null,"\\acc x ->")]),a("li",null,"foldl1: 取 List 首元素作为初始累加值")])])],-1),cl=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"foldl"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Foldable"),e(),a("span",{class:"token hvariable"},"t"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),rl=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"sum"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token builtin"},"sum"),e("' "),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"foldl"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"acc"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"acc"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token number"},"0"),e(),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),ul=a("ul",null,[a("li",null,[e("右折叠函数 "),a("ul",null,[a("li",null,[e("foldr "),a("code",null,"\\x acc ->")]),a("li",null,"foldr1: 取 List 尾元素作为初始累加值")])])],-1),il=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"foldr"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Foldable"),e(),a("span",{class:"token hvariable"},"t"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),kl=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"map"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"map"),e("' "),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"foldr"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"acc"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},":"),e(),a("span",{class:"token hvariable"},"acc"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),bl=a("ul",null,[a("li",null,"更多范例")],-1),ml=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"maximum"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Ord"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token builtin"},"maximum"),e("' "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"foldr1"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"acc"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"acc"),e(),a("span",{class:"token keyword"},"then"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token hvariable"},"acc"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token builtin"},"reverse"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"reverse"),e("' "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"foldl"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"acc"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},":"),e(),a("span",{class:"token hvariable"},"acc"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token builtin"},"product"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token builtin"},"product"),e("' "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"foldr1"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token builtin"},"filter"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Bool"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token builtin"},"filter"),e("' "),a("span",{class:"token hvariable"},"p"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"foldr"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"acc"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token hvariable"},"p"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token keyword"},"then"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},":"),e(),a("span",{class:"token hvariable"},"acc"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token hvariable"},"acc"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token builtin"},"head"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token builtin"},"head"),e("' "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"foldr1"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token builtin"},"last"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token builtin"},"last"),e("' "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"foldl1"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br")])],-1),hl=a("ul",null,[a("li",null,"scanl/scanr/scanl1/scanr1 函数会将每次折叠的结果都记录在一个 List 中")],-1),dl=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"scanl"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"+"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token number"},"0"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"11"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"scanr"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"+"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token number"},"0"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"11"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"scanl1"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"acc"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"acc"),e(),a("span",{class:"token keyword"},"then"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token hvariable"},"acc"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"scanl"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"flip"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},":"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),vl=a("ul",null,[a("li",null,"逆波兰表达式")],-1),gl=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Data.List")]),e("\n\n"),a("span",{class:"token hvariable"},"solveRPN"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"solveRPN"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"head"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"foldl"),e(),a("span",{class:"token hvariable"},"foldingFunction"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"words"),e("\n"),a("span",{class:"token keyword"},"where"),e(" "),a("span",{class:"token hvariable"},"foldingFunction"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"y"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"ys"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"*"'),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"ys"),e("\n "),a("span",{class:"token hvariable"},"foldingFunction"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"y"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"ys"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"+"'),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"ys"),e("\n "),a("span",{class:"token hvariable"},"foldingFunction"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"y"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"ys"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"-"'),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"-"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"ys"),e("\n "),a("span",{class:"token hvariable"},"foldingFunction"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"y"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"ys"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"/"'),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"/"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"ys"),e("\n "),a("span",{class:"token hvariable"},"foldingFunction"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"y"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"ys"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"^"'),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"**"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"ys"),e("\n "),a("span",{class:"token hvariable"},"foldingFunction"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"ln"'),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"log"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),e("\n "),a("span",{class:"token hvariable"},"foldingFunction"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token string"},'"sum"'),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token builtin"},"sum"),e(),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token hvariable"},"foldingFunction"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token hvariable"},"numberString"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"read"),e(),a("span",{class:"token hvariable"},"numberString"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br")])],-1),yl=a("h4",{id:"lambda-表达式"},[a("a",{class:"header-anchor",href:"#lambda-表达式","aria-hidden":"true"},"#"),e(" lambda 表达式")],-1),fl=a("p",null,[a("code",null,"\\args -> function")],-1),wl=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"zipWith"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token number"},"30"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"/"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"153.0"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"61.5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"31.0"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"15.75"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6.6"),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token builtin"},"flip"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"c"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"c"),e("\n"),a("span",{class:"token builtin"},"flip"),e("' "),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token hvariable"},"x"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),xl=a("h4",{id:"函数-1"},[a("a",{class:"header-anchor",href:"#函数-1","aria-hidden":"true"},"#"),e(" $函数")],-1),Sl=a("p",null,[a("code",null,"($) :: (a -> b) -> a -> b")],-1),Ll=a("ul",null,[a("li",null,"特性: 优先级最低,右结合"),a("li",null,"功能: 改变优先级,相当于在右方添加括号")],-1),Ml=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"g"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"z"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"<->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"g"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"z"),e(),a("span",{class:"token hvariable"},"x"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),Fl=a("h4",{id:"函数与-function-composition-函数组合"},[a("a",{class:"header-anchor",href:"#函数与-function-composition-函数组合","aria-hidden":"true"},"#"),e(" .函数与 Function composition(函数组合)")],-1),Tl=a("p",null,[a("code",null,"(.) :: (b -> c) -> (a -> b) -> a -> c")],-1),Il=a("p",null,[a("code",null,"f . g = \\x -> f (g x)"),e(" - f 的参数类型必须与 g 的返回值类型相同")],-1),Al=a("ul",null,[a("li",null,"功能: 可以去除函数调用括号")],-1),Cl=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"fn"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"ceiling"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"negate"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"tan"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"cos"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"max"),e(),a("span",{class:"token number"},"50"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token operator"},"->"),e(" 去括号"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token hvariable"},"fn"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"ceiling"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"negate"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"tan"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"cos"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"max"),e(),a("span",{class:"token number"},"50"),e(),a("span",{class:"token hvariable"},"x"),e("\n"),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Curry"),e("化"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token hvariable"},"fn"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"ceiling"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"negate"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"tan"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"cos"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"max"),e(),a("span",{class:"token number"},"50"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),Ol=a("ul",null,[a("li",null,"Best Practice: 三种不同的函数写法")],-1),Nl=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"oddSquareSum"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Integer"),e("\n"),a("span",{class:"token hvariable"},"oddSquareSum"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"sum"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"takeWhile"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"<"),a("span",{class:"token number"},"10000"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token builtin"},"odd"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"^"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"oddSquareSum"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Integer"),e("\n"),a("span",{class:"token hvariable"},"oddSquareSum"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"sum"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"takeWhile"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"<"),a("span",{class:"token number"},"10000"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token builtin"},"odd"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"^"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token hvariable"},"oddSquareSum"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Integer"),e("\n"),a("span",{class:"token hvariable"},"oddSquareSum"),e(),a("span",{class:"token operator"},"="),e("\n "),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"oddSquares"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token builtin"},"odd"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"^"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token hvariable"},"belowLimit"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"takeWhile"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"<"),a("span",{class:"token number"},"10000"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"oddSquares"),e("\n "),a("span",{class:"token keyword"},"in"),e(" "),a("span",{class:"token builtin"},"sum"),e(),a("span",{class:"token hvariable"},"belowLimit"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),Bl=a("h3",{id:"常用函数"},[a("a",{class:"header-anchor",href:"#常用函数","aria-hidden":"true"},"#"),e(" 常用函数")],-1),Wl=a("h4",{id:"无参函数"},[a("a",{class:"header-anchor",href:"#无参函数","aria-hidden":"true"},"#"),e(" 无参函数")],-1),El=a("p",null,"“定义”(或者“名字”)",-1),$l=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"sabertaz"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"It\'s a-me, sabertaz!"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),Pl=a("h4",{id:"前缀函数"},[a("a",{class:"header-anchor",href:"#前缀函数","aria-hidden":"true"},"#"),e(" 前缀函数")],-1),ql=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"succ"),e(),a("span",{class:"token number"},"8"),e("\n"),a("span",{class:"token number"},"9"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Rl=a("p",null,"`FunctionName` - 可使前缀函数变为中缀函数",-1),zl=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token operator"},">"),e(),a("span",{class:"token number"},"92"),e(" `"),a("span",{class:"token builtin"},"div"),e("` "),a("span",{class:"token number"},"10"),e("\n"),a("span",{class:"token number"},"9"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Dl=a("h4",{id:"中缀函数"},[a("a",{class:"header-anchor",href:"#中缀函数","aria-hidden":"true"},"#"),e(" 中缀函数")],-1),Jl=a("p",null,[a("code",null,"+"),e(": 从类型定义可以看出,+左右两边参数必须为同类型")],-1),Gl=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"+"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"+"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Num"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),_l=a("p",null,[a("code",null,"++"),e(": List 连接符,遍历前一 List")],-1),Hl=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"11"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"12"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"11"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"12"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token string"},'"hello"'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token string"},'" "'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token string"},'"world"'),e("\n"),a("span",{class:"token string"},'"hello world"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Kl=a("p",null,[a("code",null,":"),e(": 连接单个元素")],-1),Yl=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token char string"},"'A'"),a("span",{class:"token operator"},":"),a("span",{class:"token string"},'" SMALL CAT"'),e("\n"),a("span",{class:"token string"},'"A SMALL CAT"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token number"},"5"),a("span",{class:"token operator"},":"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Vl=a("p",null,[a("code",null,"!!"),e(": 引用符")],-1),Ul=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"9.4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"33.2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"96.2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"11.2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"23.25"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"!!"),e(),a("span",{class:"token number"},"1"),e("\n"),a("span",{class:"token number"},"33.2"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Zl=a("h4",{id:"数学函数"},[a("a",{class:"header-anchor",href:"#数学函数","aria-hidden":"true"},"#"),e(" 数学函数")],-1),jl=a("ul",null,[a("li",null,[e("x "),a("code",null,"mod"),e(" y")]),a("li",null,[a("code",null,"even arg")]),a("li",null,[a("code",null,"odd arg")])],-1),Ql=a("h5",{id:"system-random"},[a("a",{class:"header-anchor",href:"#system-random","aria-hidden":"true"},"#"),e(" System Random")],-1),Xl=a("ul",null,[a("li",null,[a("code",null,"random :: (RandomGen g, Random a) => g -> (a, g)")]),a("li",null,"getStdGen"),a("li",null,"newStdGen")],-1),no=a("h4",{id:"数字函数"},[a("a",{class:"header-anchor",href:"#数字函数","aria-hidden":"true"},"#"),e(" 数字函数")],-1),so=a("ul",null,[a("li",null,"fromInteger 函数 (Num a) => Integer -> a"),a("li",null,"fromIntegral 函数 (Integral a, Num b) => a -> b")],-1),ao=a("h2",{id:"模块"},[a("a",{class:"header-anchor",href:"#模块","aria-hidden":"true"},"#"),e(" 模块")],-1),eo=a("h3",{id:"import"},[a("a",{class:"header-anchor",href:"#import","aria-hidden":"true"},"#"),e(" import")],-1),to=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Data.List")]),e("\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Data.List")]),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"nub"),e(","),a("span",{class:"token builtin"},"sort"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Data.List "),a("span",{class:"token keyword"},"hiding")]),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"nub"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),lo=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(),a("span",{class:"token keyword"},"qualified"),e(" Data.Map")]),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),oo=a("p",null,"调用 Map 中的 filter 时,必须使用 Data.Map.filter.",-1),po=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(),a("span",{class:"token keyword"},"qualified"),e(" Data.Map "),a("span",{class:"token keyword"},"as"),e(" M")]),e("\n\n"),a("span",{class:"token constant"},"Data.Map"),a("span",{class:"token punctuation"},"."),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token operator"},"<->"),e(),a("span",{class:"token constant"},"M"),a("span",{class:"token punctuation"},"."),a("span",{class:"token builtin"},"filter"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),co=a("h3",{id:"建立模块"},[a("a",{class:"header-anchor",href:"#建立模块","aria-hidden":"true"},"#"),e(" 建立模块")],-1),ro=a("h4",{id:"单一模块"},[a("a",{class:"header-anchor",href:"#单一模块","aria-hidden":"true"},"#"),e(" 单一模块")],-1),uo=a("p",null,[e("新建一个 "),a("code",null,"Geometry.hs"),e(" 的文件")],-1),io=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e(),a("span",{class:"token constant"},"Geometry"),e("\n"),a("span",{class:"token punctuation"},"("),e(),a("span",{class:"token hvariable"},"sphereVolume"),e("\n,"),a("span",{class:"token hvariable"},"sphereArea"),e("\n,"),a("span",{class:"token hvariable"},"cubeVolume"),e("\n,"),a("span",{class:"token hvariable"},"cubeArea"),e("\n,"),a("span",{class:"token hvariable"},"cuboidArea"),e("\n,"),a("span",{class:"token hvariable"},"cuboidVolume"),e("\n"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n\n"),a("span",{class:"token hvariable"},"sphereVolume"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"sphereVolume"),e(),a("span",{class:"token hvariable"},"radius"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4.0"),e(),a("span",{class:"token operator"},"/"),e(),a("span",{class:"token number"},"3.0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token builtin"},"pi"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"radius"),e(),a("span",{class:"token operator"},"^"),e(),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"sphereArea"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"sphereArea"),e(),a("span",{class:"token hvariable"},"radius"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"4"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token builtin"},"pi"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"radius"),e(),a("span",{class:"token operator"},"^"),e(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"cubeVolume"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"cubeVolume"),e(),a("span",{class:"token hvariable"},"side"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"cuboidVolume"),e(),a("span",{class:"token hvariable"},"side"),e(),a("span",{class:"token hvariable"},"side"),e(),a("span",{class:"token hvariable"},"side"),e("\n\n"),a("span",{class:"token hvariable"},"cubeArea"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"cubeArea"),e(),a("span",{class:"token hvariable"},"side"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"cuboidArea"),e(),a("span",{class:"token hvariable"},"side"),e(),a("span",{class:"token hvariable"},"side"),e(),a("span",{class:"token hvariable"},"side"),e("\n\n"),a("span",{class:"token hvariable"},"cuboidVolume"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"cuboidVolume"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"rectangleArea"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token hvariable"},"c"),e("\n\n"),a("span",{class:"token hvariable"},"cuboidArea"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"cuboidArea"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"="),e("\n "),a("span",{class:"token hvariable"},"rectangleArea"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token number"},"2"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"rectangleArea"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token number"},"2"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"rectangleArea"),e(),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token number"},"2"),e("\n\n"),a("span",{class:"token hvariable"},"rectangleArea"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"rectangleArea"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token hvariable"},"b"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br")])],-1),ko=a("ul",null,[a("li",null,"使用")],-1),bo=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Geometry")]),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),mo=a("h4",{id:"子模块"},[a("a",{class:"header-anchor",href:"#子模块","aria-hidden":"true"},"#"),e(" 子模块")],-1),ho=a("p",null,[e("把 "),a("code",null,"Geometry"),e(" 分成三个子模块")],-1),vo=a("p",null,[e("建立一个 "),a("code",null,"Geometry"),e(" 文件夹(注意"),a("em",null,"首字母"),e("要大写),新建三个文件")],-1),go=a("ul",null,[a("li",null,"sphere.hs")],-1),yo=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e(),a("span",{class:"token constant"},"Geometry.Sphere"),e("\n"),a("span",{class:"token punctuation"},"("),e(),a("span",{class:"token hvariable"},"volume"),e("\n,"),a("span",{class:"token hvariable"},"area"),e("\n"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n\n"),a("span",{class:"token hvariable"},"volume"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"volume"),e(),a("span",{class:"token hvariable"},"radius"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4.0"),e(),a("span",{class:"token operator"},"/"),e(),a("span",{class:"token number"},"3.0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token builtin"},"pi"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"radius"),e(),a("span",{class:"token operator"},"^"),e(),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"area"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"area"),e(),a("span",{class:"token hvariable"},"radius"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"4"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token builtin"},"pi"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"radius"),e(),a("span",{class:"token operator"},"^"),e(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br")])],-1),fo=a("ul",null,[a("li",null,"cuboid.hs")],-1),wo=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e(),a("span",{class:"token constant"},"Geometry.Cuboid"),e("\n"),a("span",{class:"token punctuation"},"("),e(),a("span",{class:"token hvariable"},"volume"),e("\n,"),a("span",{class:"token hvariable"},"area"),e("\n"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n\n"),a("span",{class:"token hvariable"},"volume"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"volume"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"rectangleArea"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token hvariable"},"c"),e("\n\n"),a("span",{class:"token hvariable"},"area"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"area"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"="),e("\n "),a("span",{class:"token hvariable"},"rectangleArea"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token number"},"2"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"rectangleArea"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token number"},"2"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"rectangleArea"),e(),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token number"},"2"),e("\n\n"),a("span",{class:"token hvariable"},"rectangleArea"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"rectangleArea"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token hvariable"},"b"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br")])],-1),xo=a("ul",null,[a("li",null,"cube.hs")],-1),So=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e(),a("span",{class:"token constant"},"Geometry.Cube"),e("\n"),a("span",{class:"token punctuation"},"("),e(),a("span",{class:"token hvariable"},"volume"),e("\n,"),a("span",{class:"token hvariable"},"area"),e("\n"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(),a("span",{class:"token keyword"},"qualified"),e(" Geometry.Cuboid "),a("span",{class:"token keyword"},"as"),e(" Cuboid")]),e("\n\n"),a("span",{class:"token hvariable"},"volume"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"volume"),e(),a("span",{class:"token hvariable"},"side"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"Cuboid.volume"),e(),a("span",{class:"token hvariable"},"side"),e(),a("span",{class:"token hvariable"},"side"),e(),a("span",{class:"token hvariable"},"side"),e("\n\n"),a("span",{class:"token hvariable"},"area"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Float"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Float"),e("\n"),a("span",{class:"token hvariable"},"area"),e(),a("span",{class:"token hvariable"},"side"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"Cuboid.area"),e(),a("span",{class:"token hvariable"},"side"),e(),a("span",{class:"token hvariable"},"side"),e(),a("span",{class:"token hvariable"},"side"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br")])],-1),Lo=a("ul",null,[a("li",null,"使用")],-1),Mo=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Geometry.Sphere")]),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),Fo=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(),a("span",{class:"token keyword"},"qualified"),e(" Geometry.Sphere "),a("span",{class:"token keyword"},"as"),e(" Sphere")]),e("\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(),a("span",{class:"token keyword"},"qualified"),e(" Geometry.Cuboid "),a("span",{class:"token keyword"},"as"),e(" Cuboid")]),e("\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(),a("span",{class:"token keyword"},"qualified"),e(" Geometry.Cube "),a("span",{class:"token keyword"},"as"),e(" Cube")]),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),To=a("h3",{id:"常用基础模块"},[a("a",{class:"header-anchor",href:"#常用基础模块","aria-hidden":"true"},"#"),e(" 常用基础模块")],-1),Io=a("p",null,[a("a",{href:"https://github.com/MnO2/learnyouahaskell-zh/blob/develop/zh-cn/ch07/module.md",target:"_blank",rel:"noopener noreferrer"},"Learn you a haskell for great good")],-1),Ao=a("h4",{id:"data-list"},[a("a",{class:"header-anchor",href:"#data-list","aria-hidden":"true"},"#"),e(" Data.List")],-1),Co=a("ul",null,[a("li",null,"intersperse"),a("li",null,"intercalate"),a("li",null,"transpose")],-1),Oo=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"transpose"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"transpose"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"hey"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"there"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"guys"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"htg"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"ehu"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"yey"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"rs"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"e"'),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),No=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token builtin"},"sum"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"transpose"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"18"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"17"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Bo=a("p",null,[a("strong",null,"foldl'"),e(" 和 "),a("strong",null,"foldl1'"),e(" 是它们各自惰性实现的严格版本,可"),a("em",null,"防止溢出"),e("问题.")],-1),Wo=a("p",null,[a("strong",null,"concat"),e(" - 移除一级嵌套")],-1),Eo=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"concat"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"foo"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"bar"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"car"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token string"},'"foobarcar"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"concat"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),$o=a("p",null,[a("strong",null,"concatMap"),e(" 函数与 "),a("code",null,"map"),e(" 一个 List 之后再 "),a("code",null,"concat"),e(" 它等价")],-1),Po=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"concatMap"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"replicate"),e(),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),qo=a("p",null,"and",-1),Ro=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"and"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},">"),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"and"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"=="),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"False"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),zo=a("p",null,"or",-1),Do=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"or"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"=="),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"or"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},">"),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"False"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Jo=a("p",null,[a("strong",null,"any"),e(" 和 "),a("strong",null,"all"),e(" 使用 "),a("code",null,"any"),e(" 或 "),a("code",null,"all"),e(" 会更多些")],-1),Go=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"any"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"=="),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"all"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},">"),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"all"),e(),a("span",{class:"token punctuation"},"("),e("`"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token punctuation"},"["),a("span",{class:"token char string"},"'A'"),a("span",{class:"token operator"},".."),a("span",{class:"token char string"},"'Z'"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"HEYGUYSwhatsup"'),e("\n"),a("span",{class:"token constant"},"False"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"any"),e(),a("span",{class:"token punctuation"},"("),e("`"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token punctuation"},"["),a("span",{class:"token char string"},"'A'"),a("span",{class:"token operator"},".."),a("span",{class:"token char string"},"'Z'"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"HEYGUYSwhatsup"'),e("\n"),a("span",{class:"token constant"},"True"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),_o=a("p",null,[a("strong",null,"iterate"),e(" 取一个函数和一个值作参数。它会用该值去调用该函数并用所得的结果再次调用该函数,产生一个无限的 List.")],-1),Ho=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"take"),e(),a("span",{class:"token number"},"10"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"iterate"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token number"},"1"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"16"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"32"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"64"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"128"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"256"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"512"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"take"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"iterate"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token string"},'"haha"'),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"haha"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"haha"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"hahahaha"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"hahahahahaha"'),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Ko=a("p",null,"splitAt",-1),Yo=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"splitAt"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token string"},'"heyman"'),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"hey"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"man"'),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"splitAt"),e(),a("span",{class:"token number"},"100"),e(),a("span",{class:"token string"},'"heyman"'),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"heyman"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'""'),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"splitAt"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"heyman"'),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'""'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"heyman"'),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"splitAt"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token string"},'"foobar"'),e(),a("span",{class:"token keyword"},"in"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token string"},'"barfoo"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),Vo=a("p",null,[a("strong",null,"takeWhile"),e(" 一旦遇到不符合条件的某元素就停止")],-1),Uo=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"takeWhile"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},">"),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"takeWhile"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"/="),a("span",{class:"token char string"},"' '"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"This is a sentence"'),e("\n"),a("span",{class:"token string"},'"This"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Zo=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"sum"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"takeWhile"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"<"),a("span",{class:"token number"},"10000"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"^"),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token number"},"53361"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),jo=a("p",null,[a("strong",null,"dropWhile"),e(" 扔掉符合条件的元素。一旦限制条件返回 "),a("code",null,"False"),e(",它就返回 List 的余下部分")],-1),Qo=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"dropWhile"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"/="),a("span",{class:"token char string"},"' '"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"This is a sentence"'),e("\n"),a("span",{class:"token string"},'" is a sentence"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"dropWhile"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"<"),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Xo=a("p",null,[a("strong",null,"span"),e(" - 扩展"),a("code",null,"takeWhile")],-1),np=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"fw"),e(","),a("span",{class:"token hvariable"},"rest"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"span"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"/="),a("span",{class:"token char string"},"' '"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token operator"},"\\"),e(),a("span",{class:"token string"},'"This is a sentence"'),e(),a("span",{class:"token keyword"},"in"),e(),a("span",{class:"token string"},'"First word:"'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token hvariable"},"fw"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token string"},'",the rest:"'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token hvariable"},"rest"),e("\n"),a("span",{class:"token string"},'"First word: This,the rest: is a sentence"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),sp=a("p",null,[a("strong",null,"break"),e(" - 取反"),a("code",null,"span")],-1),ap=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"break"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"=="),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"span"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"/="),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),ep=a("p",null,"sort",-1),tp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"sort"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"sort"),e(),a("span",{class:"token string"},'"This will be sorted soon"'),e("\n"),a("span",{class:"token string"},'" Tbdeehiillnooorssstw"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),lp=a("p",null,"group",-1),op=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"group"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),pp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"l"),a("span",{class:"token operator"},"@"),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},","),a("span",{class:"token builtin"},"length"),e(),a("span",{class:"token hvariable"},"l"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"group"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"sort"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),cp=a("p",null,[a("strong",null,"inits"),e(" 和 "),a("strong",null,"tails")],-1),rp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"inits"),e(),a("span",{class:"token string"},'"w00t"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'""'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"w"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"w0"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"w00"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"w00t"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"tails"),e(),a("span",{class:"token string"},'"w00t"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"w00t"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"00t"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"0t"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"t"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'""'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"w"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"w00t"'),e(),a("span",{class:"token keyword"},"in"),e(),a("span",{class:"token builtin"},"zip"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"inits"),e(),a("span",{class:"token hvariable"},"w"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"tails"),e(),a("span",{class:"token hvariable"},"w"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'""'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"w00t"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"w"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"00t"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"w0"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"0t"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"w00"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"t"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"w00t"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'""'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),up=a("p",null,[a("strong",null,"isInfixOf"),e(" 从一个 List 中搜索一个子 List")],-1),ip=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"search"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Eq"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Bool"),e("\n"),a("span",{class:"token hvariable"},"search"),e(),a("span",{class:"token hvariable"},"needle"),e(),a("span",{class:"token hvariable"},"haystack"),e(),a("span",{class:"token operator"},"="),e("\n "),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"nLen"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"length"),e(),a("span",{class:"token hvariable"},"needle"),e("\n "),a("span",{class:"token keyword"},"in"),e(),a("span",{class:"token builtin"},"foldl"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"acc"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token builtin"},"take"),e(),a("span",{class:"token hvariable"},"nLen"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token hvariable"},"needle"),e(),a("span",{class:"token keyword"},"then"),e(),a("span",{class:"token constant"},"True"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token hvariable"},"acc"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token constant"},"False"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"tails"),e(),a("span",{class:"token hvariable"},"haystack"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),kp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token string"},'"cat"'),e(),a("span",{class:"token operator"},"`isInfixOf`"),e(),a("span",{class:"token string"},'"im a cat burglar"'),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token string"},'"Cat"'),e(),a("span",{class:"token operator"},"`isInfixOf`"),e(),a("span",{class:"token string"},'"im a cat burglar"'),e("\n"),a("span",{class:"token constant"},"False"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token string"},'"cats"'),e(),a("span",{class:"token operator"},"`isInfixOf`"),e(),a("span",{class:"token string"},'"im a cat burglar"'),e("\n"),a("span",{class:"token constant"},"False"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),bp=a("p",null,[a("strong",null,"isPrefixOf"),e(" 与 "),a("strong",null,"isSuffixOf")],-1),mp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token string"},'"hey"'),e(),a("span",{class:"token operator"},"`isPrefixOf`"),e(),a("span",{class:"token string"},'"hey there!"'),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token string"},'"hey"'),e(),a("span",{class:"token operator"},"`isPrefixOf`"),e(),a("span",{class:"token string"},'"oh hey there!"'),e("\n"),a("span",{class:"token constant"},"False"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token string"},'"there!"'),e(),a("span",{class:"token operator"},"`isSuffixOf`"),e(),a("span",{class:"token string"},'"oh hey there!"'),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token string"},'"there!"'),e(),a("span",{class:"token operator"},"`isSuffixOf`"),e(),a("span",{class:"token string"},'"oh hey there"'),e("\n"),a("span",{class:"token constant"},"False"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),hp=a("p",null,[a("strong",null,"elem"),e(" 与 "),a("strong",null,"notElem")],-1),dp=a("p",null,"partition",-1),vp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"partition"),e(),a("span",{class:"token punctuation"},"("),e("`"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token punctuation"},"["),a("span",{class:"token char string"},"'A'"),a("span",{class:"token operator"},".."),a("span",{class:"token char string"},"'Z'"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"BOBsidneyMORGANeddy"'),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"BOBMORGAN"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"sidneyeddy"'),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"partition"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},">"),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),gp=a("p",null,"find",-1),yp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"find"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},">"),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"5"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"find"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},">"),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"Nothing"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token hvariable"},"find"),e("\n"),a("span",{class:"token hvariable"},"find"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Bool"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token hvariable"},"a"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),fp=a("p",null,[a("strong",null,"elemIndex"),e(" '可能' (Maybe)返回我们找的元素的索引,若这一元素不存在,就返回 "),a("code",null,"Nothing"),e(".")],-1),wp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token hvariable"},"elemIndex"),e("\n"),a("span",{class:"token hvariable"},"elemIndex"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Eq"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token constant"},"Int"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token number"},"4"),e(),a("span",{class:"token operator"},"`elemIndex`"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"3"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token number"},"10"),e(),a("span",{class:"token operator"},"`elemIndex`"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"Nothing"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),xp=a("p",null,[a("strong",null,"elemIndices"),e(" 与"),a("code",null,"elemIndex"),e("相似.")],-1),Sp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token char string"},"' '"),e(),a("span",{class:"token operator"},"`elemIndices`"),e(),a("span",{class:"token string"},'"Where are the spaces?"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"13"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Lp=a("p",null,[a("strong",null,"findIndex"),e(" 与 "),a("code",null,"find"),e(" 相似. "),a("strong",null,"findIndices"),e(" 返回所有符合条件的索引.")],-1),Mp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"findIndex"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"=="),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"5"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"findIndex"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"=="),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"Nothing"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"findIndices"),e(),a("span",{class:"token punctuation"},"("),e("`"),a("span",{class:"token builtin"},"elem"),e("` "),a("span",{class:"token punctuation"},"["),a("span",{class:"token char string"},"'A'"),a("span",{class:"token operator"},".."),a("span",{class:"token char string"},"'Z'"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"Where Are The Caps?"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"14"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),Fp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"zipWith3"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token hvariable"},"z"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"z"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"zip4"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Tp=a("p",null,[e("在处理来自文件或其它地方的输入时,"),a("strong",null,"lines"),e(" 会非常有用.")],-1),Ip=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"lines"),e(),a("span",{class:"token string"},'"first line\\nsecond line\\nthird line"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"first line"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"second line"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"third line"'),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Ap=a("p",null,[a("strong",null,"unlines"),e(" 是 "),a("code",null,"lines"),e(" 的反函数.")],-1),Cp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"unlines"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"first line"'),e(","),a("span",{class:"token string"},'"second line"'),e(","),a("span",{class:"token string"},'"third line"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token string"},'"first line\\nsecond line\\nthird line\\n"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Op=a("p",null,[a("strong",null,"words"),e(" 和 "),a("strong",null,"unwords"),e(" 可以把一个字串分为一组单词或执行相反的操作.")],-1),Np=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"words"),e(),a("span",{class:"token string"},'"hey these are the words in this sentence"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"hey"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"these"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"are"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"the"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"words"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"in"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"this"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"sentence"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"words"),e(),a("span",{class:"token string"},'"hey these are the words in this\\nsentence"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"hey"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"these"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"are"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"the"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"words"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"in"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"this"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"sentence"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"unwords"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"hey"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"there"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"mate"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token string"},'"hey there mate"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),Bp=a("p",null,[a("strong",null,"nub"),e(" 可以将一个 List 中的重复元素全部筛掉.")],-1),Wp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"nub"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"nub"),e(),a("span",{class:"token string"},'"Lots of words and stuff"'),e("\n"),a("span",{class:"token string"},'"Lots fwrdanu"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Ep=a("p",null,"delete",-1),$p=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"delete"),e(),a("span",{class:"token char string"},"'h'"),e(),a("span",{class:"token string"},'"hey there ghang!"'),e("\n"),a("span",{class:"token string"},'"ey there ghang!"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"delete"),e(),a("span",{class:"token char string"},"'h'"),a("span",{class:"token operator"}," . "),a("span",{class:"token hvariable"},"delete"),e(),a("span",{class:"token char string"},"'h'"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token string"},'"hey there ghang!"'),e("\n"),a("span",{class:"token string"},'"ey tere ghang!"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"delete"),e(),a("span",{class:"token char string"},"'h'"),a("span",{class:"token operator"}," . "),a("span",{class:"token hvariable"},"delete"),e(),a("span",{class:"token char string"},"'h'"),a("span",{class:"token operator"}," . "),a("span",{class:"token hvariable"},"delete"),e(),a("span",{class:"token char string"},"'h'"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token string"},'"hey there ghang!"'),e("\n"),a("span",{class:"token string"},'"ey tere gang!"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),Pp=a("p",null,[a("strong",null,"\\"),e(" 差集")],-1),qp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"\\\\"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token string"},'"Im a big baby"'),e(),a("span",{class:"token operator"},"\\\\"),e(),a("span",{class:"token string"},'"big"'),e("\n"),a("span",{class:"token string"},'"Im a baby"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Rp=a("p",null,[a("strong",null,"union"),e(" 并集")],-1),zp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token string"},'"hey man"'),e(),a("span",{class:"token operator"},"`union`"),e(),a("span",{class:"token string"},'"man what\'s up"'),e("\n"),a("span",{class:"token string"},'"hey manwt\'sup"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"`union`"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Dp=a("p",null,[a("strong",null,"intersection"),e(" 交集")],-1),Jp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"`intersect`"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Gp=a("p",null,"insert",-1),_p=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"insert"),e(),a("span",{class:"token number"},"4"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"insert"),e(),a("span",{class:"token char string"},"'g'"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token char string"},"'a'"),a("span",{class:"token operator"},".."),a("span",{class:"token char string"},"'f'"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token char string"},"'h'"),a("span",{class:"token operator"},".."),a("span",{class:"token char string"},"'z'"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token string"},'"abcdefghijklmnopqrstuvwxyz"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"insert"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),Hp=a("h5",{id:"修正-prelude-模块"},[a("a",{class:"header-anchor",href:"#修正-prelude-模块","aria-hidden":"true"},"#"),e(" 修正 Prelude 模块")],-1),Kp=a("p",null,[a("code",null,"length"),e(","),a("code",null,"take"),e(","),a("code",null,"drop"),e(","),a("code",null,"splitAt"),e(","),a("code",null,"!!"),e(" 和 "),a("code",null,"replicate"),a("code",null,"Data.List"),e(" 中包含了更通用的替代版,如: "),a("code",null,"genericLength,genericTake,genericDrop,genericSplitAt,genericIndex"),e(" 和 "),a("code",null,"genericReplicate")],-1),Yp=a("p",null,[a("code",null,"nub"),e(", "),a("code",null,"delete"),e(", "),a("code",null,"union"),e(", "),a("code",null,"intsect"),e(" 和 "),a("code",null,"group"),e(" 函数 也有各自的通用替代版 "),a("code",null,"nubBy"),e(","),a("code",null,"deleteBy"),e(","),a("code",null,"unionBy"),e(","),a("code",null,"intersectBy"),e(" 和 "),a("code",null,"groupBy"),e(", 它们的区别就是前一组函数使用 "),a("code",null,"(==)"),e(" 来测试是否相等,而带 "),a("code",null,"By"),e(" 的那组则取一个函数作参数来判定相等性.")],-1),Vp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"values"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"4.3"),e(","),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"2.4"),e(","),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1.2"),e(","),a("span",{class:"token number"},"0.4"),e(","),a("span",{class:"token number"},"2.3"),e(","),a("span",{class:"token number"},"5.9"),e(","),a("span",{class:"token number"},"10.5"),e(","),a("span",{class:"token number"},"29.1"),e(","),a("span",{class:"token number"},"5.3"),e(","),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"2.4"),e(","),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"14.5"),e(","),a("span",{class:"token number"},"2.9"),e(","),a("span",{class:"token number"},"2.3"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"groupBy"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},">"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},">"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"values"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"4.3"),a("span",{class:"token punctuation"},","),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"2.4"),a("span",{class:"token punctuation"},","),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1.2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0.4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2.3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5.9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10.5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"29.1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5.3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"2.4"),a("span",{class:"token punctuation"},","),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"14.5"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2.9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2.3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),Up=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"on"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"c"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"c"),e("\n"),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"`on`"),e(),a("span",{class:"token hvariable"},"g"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token hvariable"},"y"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"g"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"g"),e(),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Zp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"groupBy"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"=="),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"`on`"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},">"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"values"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"4.3"),a("span",{class:"token punctuation"},","),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"2.4"),a("span",{class:"token punctuation"},","),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1.2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0.4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2.3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5.9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10.5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"29.1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5.3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"2.4"),a("span",{class:"token punctuation"},","),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"14.5"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2.9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2.3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),jp=a("p",null,[a("code",null,"sort"),e(","),a("code",null,"insert"),e(","),a("code",null,"maximum"),e(" 和 "),a("code",null,"min"),e(" 都有各自的通用版本。 如 "),a("code",null,"groupBy"),e(" 类似,"),a("strong",null,"sortBy"),e(","),a("strong",null,"insertBy"),e(","),a("strong",null,"maximumBy"),e(" 和 "),a("strong",null,"minimumBy"),e(" 都取一个函数来比较两个元素的大小.")],-1),Qp=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"sortBy"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"compare"),e(),a("span",{class:"token operator"},"`on`"),e(),a("span",{class:"token builtin"},"length"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"xs"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),Xp=a("h4",{id:"data-char"},[a("a",{class:"header-anchor",href:"#data-char","aria-hidden":"true"},"#"),e(" Data Char")],-1),nc=a("ul",null,[a("li",null,[a("strong",null,"isControl"),e(" 判断一个字符是否是控制字符。")]),a("li",null,[a("strong",null,"isSpace"),e(" 判断一个字符是否是空格字符,包括空格,tab,换行符等.")]),a("li",null,[a("strong",null,"isLower"),e(" 判断一个字符是否为小写.")]),a("li",null,[a("strong",null,"isUpper"),e(" 判断一个字符是否为大写。")]),a("li",null,[a("strong",null,"isAlpha"),e(" 判断一个字符是否为字母.")]),a("li",null,[a("strong",null,"isAlphaNum"),e(" 判断一个字符是否为字母或数字.")]),a("li",null,[a("strong",null,"isPrint"),e(" 判断一个字符是否是可打印的.")]),a("li",null,[a("strong",null,"isDigit"),e(" 判断一个字符是否为数字.")]),a("li",null,[a("strong",null,"isOctDigit"),e(" 判断一个字符是否为八进制数字.")]),a("li",null,[a("strong",null,"isHexDigit"),e(" 判断一个字符是否为十六进制数字.")]),a("li",null,[a("strong",null,"isLetter"),e(" 判断一个字符是否为字母.")]),a("li",null,[a("strong",null,"isMark"),e(" 判断是否为 unicode 注音字符,你如果是法国人就会经常用到的.")]),a("li",null,[a("strong",null,"isNumber"),e(" 判断一个字符是否为数字.")]),a("li",null,[a("strong",null,"isPunctuation"),e(" 判断一个字符是否为标点符号.")]),a("li",null,[a("strong",null,"isSymbol"),e("判断一个字符是否为货币符号.")]),a("li",null,[a("strong",null,"isSeparator"),e(" 判断一个字符是否为 unicode 空格或分隔符.")]),a("li",null,[a("strong",null,"isAscii"),e(" 判断一个字符是否在 unicode 字母表的前 128 位。")]),a("li",null,[a("strong",null,"isLatin1"),e(" 判断一个字符是否在 unicode 字母表的前 256 位.")]),a("li",null,[a("strong",null,"isAsciiUpper"),e(" 判断一个字符是否为大写的 ascii 字符.")]),a("li",null,[a("strong",null,"isAsciiLower"),e(" 判断一个字符是否为小写的 ascii 字符.")])],-1),sc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"all"),e(),a("span",{class:"token builtin"},"isAlphaNum"),e(),a("span",{class:"token string"},'"bobby283"'),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"all"),e(),a("span",{class:"token builtin"},"isAlphaNum"),e(),a("span",{class:"token string"},'"eddy the fish!"'),e("\n"),a("span",{class:"token constant"},"False"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),ac=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"words"),e(),a("span",{class:"token string"},'"hey guys its me"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"hey"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"guys"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"its"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"me"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"groupBy"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"=="),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"`on`"),e(),a("span",{class:"token builtin"},"isSpace"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token string"},'"hey guys its me"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"hey"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'" "'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"guys"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'" "'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"its"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'" "'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"me"'),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),ec=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"not"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"any"),e(),a("span",{class:"token builtin"},"isSpace"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"}," . "),a("span",{class:"token hvariable"},"groupBy"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"=="),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"`on`"),e(),a("span",{class:"token builtin"},"isSpace"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token string"},'"hey guys its me"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"hey"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"guys"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"its"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"me"'),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),tc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"generalCategory"),e(),a("span",{class:"token char string"},"' '"),e("\n"),a("span",{class:"token constant"},"Space"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"generalCategory"),e(),a("span",{class:"token char string"},"'A'"),e("\n"),a("span",{class:"token constant"},"UppercaseLetter"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"generalCategory"),e(),a("span",{class:"token char string"},"'a'"),e("\n"),a("span",{class:"token constant"},"LowercaseLetter"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"generalCategory"),e(),a("span",{class:"token char string"},"'.'"),e("\n"),a("span",{class:"token constant"},"OtherPunctuation"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"generalCategory"),e(),a("span",{class:"token char string"},"'9'"),e("\n"),a("span",{class:"token constant"},"DecimalNumber"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token hvariable"},"generalCategory"),e(),a("span",{class:"token string"},'" \\t\\nA9?|"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"Space"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Control"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"Control"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"UppercaseLetter"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"DecimalNumber"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"OtherPunctuation"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"MathSymbol"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br")])],-1),lc=a("ul",null,[a("li",null,[a("strong",null,"toUpper"),e(" 将一个字符转为大写字母,若该字符不是小写字母,就按原值返回.")]),a("li",null,[a("strong",null,"toLower"),e(" 将一个字符转为小写字母,若该字符不是大写字母,就按原值返回.")]),a("li",null,[a("strong",null,"toTitle"),e(" 将一个字符转为 title-case,对大多数字元而言,title-case 就是大写.")]),a("li",null,[a("strong",null,"digitToInt"),e(" 将一个字符转为 Int 值,而这一字符必须得在 "),a("code",null,"'1'..'9','a'..'f'"),e("或"),a("code",null,"'A'..'F'"),e(" 的范围之内.")])],-1),oc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token builtin"},"digitToInt"),e(),a("span",{class:"token string"},'"34538"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token builtin"},"digitToInt"),e(),a("span",{class:"token string"},'"FF85AB"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"15"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"15"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"11"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),pc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"intToDigit"),e(),a("span",{class:"token number"},"15"),e("\n"),a("span",{class:"token char string"},"'f'"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"intToDigit"),e(),a("span",{class:"token number"},"5"),e("\n"),a("span",{class:"token char string"},"'5'"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),cc=a("p",null,[a("strong",null,"ord"),e(" 与 "),a("strong",null,"char"),e(" 函数可以将字符与其对应的数字相互转换.")],-1),rc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"ord"),e(),a("span",{class:"token char string"},"'a'"),e("\n"),a("span",{class:"token number"},"97"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"chr"),e(),a("span",{class:"token number"},"97"),e("\n"),a("span",{class:"token char string"},"'a'"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token builtin"},"ord"),e(),a("span",{class:"token string"},'"abcdefgh"'),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"97"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"98"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"99"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"101"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"102"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"103"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"104"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),uc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"encode"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Int"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token hvariable"},"encode"),e(),a("span",{class:"token hvariable"},"shift"),e(),a("span",{class:"token hvariable"},"msg"),e(),a("span",{class:"token operator"},"="),e("\n "),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"ords"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token builtin"},"ord"),e(),a("span",{class:"token hvariable"},"msg"),e("\n "),a("span",{class:"token hvariable"},"shifted"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token hvariable"},"shift"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"ords"),e("\n "),a("span",{class:"token keyword"},"in"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token builtin"},"chr"),e(),a("span",{class:"token hvariable"},"shifted"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),ic=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"decode"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Int"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token hvariable"},"decode"),e(),a("span",{class:"token hvariable"},"shift"),e(),a("span",{class:"token hvariable"},"msg"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"encode"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"negate"),e(),a("span",{class:"token hvariable"},"shift"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"msg"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),kc=a("h4",{id:"data-map"},[a("a",{class:"header-anchor",href:"#data-map","aria-hidden":"true"},"#"),e(" Data Map")],-1),bc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"findKey"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Eq"),e(),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"k"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"v"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"v"),e("\n"),a("span",{class:"token hvariable"},"findKey"),e(),a("span",{class:"token hvariable"},"key"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"snd"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"head"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"v"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"key"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),mc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"findKey"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Eq"),e(),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"k"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"v"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token hvariable"},"v"),e("\n"),a("span",{class:"token hvariable"},"findKey"),e(),a("span",{class:"token hvariable"},"key"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Nothing"),e("\n"),a("span",{class:"token hvariable"},"findKey"),e(),a("span",{class:"token hvariable"},"key"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"v"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token hvariable"},"key"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token hvariable"},"k"),e(),a("span",{class:"token keyword"},"then"),e("\n "),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"v"),e("\n "),a("span",{class:"token keyword"},"else"),e("\n "),a("span",{class:"token hvariable"},"findKey"),e(),a("span",{class:"token hvariable"},"key"),e(),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),hc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"findKey"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Eq"),e(),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token hvariable"},"k"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"v"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Maybe"),e(),a("span",{class:"token hvariable"},"v"),e("\n"),a("span",{class:"token hvariable"},"findKey"),e(),a("span",{class:"token hvariable"},"key"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"foldr"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"v"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"acc"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token hvariable"},"key"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token hvariable"},"k"),e(),a("span",{class:"token keyword"},"then"),e(),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"v"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token hvariable"},"acc"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token constant"},"Nothing"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),dc=a("p",null,[a("strong",null,"fromList"),e(" 取一个关联列表,返回一个与之等价的 Map。")],-1),vc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"Map.fromList"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Ord"),e(),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),e(","),a("span",{class:"token hvariable"},"v"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Map.Map"),e(),a("span",{class:"token hvariable"},"k"),e(),a("span",{class:"token hvariable"},"v"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),gc=a("p",null,"若其中存在重复的键,就将其忽略.",-1),yc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Map.empty"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),fc=a("p",null,"insert",-1),wc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Map.insert"),e(),a("span",{class:"token number"},"5"),e(),a("span",{class:"token number"},"600"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"Map.insert"),e(),a("span",{class:"token number"},"4"),e(),a("span",{class:"token number"},"200"),e(),a("span",{class:"token punctuation"},"("),e(),a("span",{class:"token hvariable"},"Map.insert"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token number"},"100"),e(" "),a("span",{class:"token hvariable"},"Map.empty"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"200"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"600"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Map.insert"),e(),a("span",{class:"token number"},"5"),e(),a("span",{class:"token number"},"600"),a("span",{class:"token operator"}," . "),a("span",{class:"token hvariable"},"Map.insert"),e(),a("span",{class:"token number"},"4"),e(),a("span",{class:"token number"},"200"),a("span",{class:"token operator"}," . "),a("span",{class:"token hvariable"},"Map.insert"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token number"},"100"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Map.empty"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"200"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"600"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),xc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"fromList"),e("' "),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Ord"),e(),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"v"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Map.Map"),e(),a("span",{class:"token hvariable"},"k"),e(),a("span",{class:"token hvariable"},"v"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e("' "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"foldr"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"v"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"acc"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"Map.insert"),e(),a("span",{class:"token hvariable"},"k"),e(),a("span",{class:"token hvariable"},"v"),e(),a("span",{class:"token hvariable"},"acc"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"Map.empty"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Sc=a("p",null,"null",-1),Lc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Map"),a("span",{class:"token punctuation"},"."),a("span",{class:"token builtin"},"null"),e(),a("span",{class:"token hvariable"},"Map.empty"),e("\n"),a("span",{class:"token constant"},"True"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Mc=a("p",null,"size",-1),Fc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Map.size"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Map.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token number"},"5"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Tc=a("p",null,"singleton",-1),Ic=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Map.singleton"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token number"},"9"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Map.insert"),e(),a("span",{class:"token number"},"5"),e(),a("span",{class:"token number"},"9"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Map.singleton"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token number"},"9"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Ac=a("p",null,"lookup",-1),Cc=a("p",null,"member",-1),Oc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Map.member"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Map.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Map.member"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Map.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"False"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Nc=a("p",null,[a("strong",null,"map"),e(" 与 "),a("strong",null,"filter"),e(" 与其对应的 "),a("code",null,"List"),e(" 版本相似")],-1),Bc=a("p",null,[a("code",null,"toList"),e(" 是 "),a("code",null,"fromList"),e(" 的反函数")],-1),Wc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Map.toList"),a("span",{class:"token operator"}," . "),a("span",{class:"token hvariable"},"Map.insert"),e(),a("span",{class:"token number"},"9"),e(),a("span",{class:"token number"},"2"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Map.singleton"),e(),a("span",{class:"token number"},"4"),e(),a("span",{class:"token number"},"3"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Ec=a("p",null,[a("strong",null,"keys"),e(" 与 "),a("strong",null,"elems")],-1),$c=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"phoneBook"),e(),a("span",{class:"token operator"},"="),e("\n "),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"betty"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"555-2938"'),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"betty"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"342-2492"'),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"bonnie"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"452-2928"'),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"patsy"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"493-2928"'),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"patsy"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"943-2929"'),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"patsy"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"827-9162"'),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"lucille"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"205-2928"'),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"wendy"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"939-8282"'),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"penny"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"853-2492"'),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"penny"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"555-2111"'),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br")])],-1),Pc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"phoneBookToMap"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Ord"),e(),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token constant"},"String"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Map.Map"),e(),a("span",{class:"token hvariable"},"k"),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token hvariable"},"phoneBookToMap"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"Map.fromListWith"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"number1"),e(),a("span",{class:"token hvariable"},"number2"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"number1"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token string"},'", "'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token hvariable"},"number2"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),qc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Map"),a("span",{class:"token punctuation"},"."),a("span",{class:"token builtin"},"lookup"),e(),a("span",{class:"token string"},'"patsy"'),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"phoneBookToMap"),e(),a("span",{class:"token hvariable"},"phoneBook"),e("\n"),a("span",{class:"token string"},'"827-9162, 943-2929, 493-2928"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Map"),a("span",{class:"token punctuation"},"."),a("span",{class:"token builtin"},"lookup"),e(),a("span",{class:"token string"},'"wendy"'),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"phoneBookToMap"),e(),a("span",{class:"token hvariable"},"phoneBook"),e("\n"),a("span",{class:"token string"},'"939-8282"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Map"),a("span",{class:"token punctuation"},"."),a("span",{class:"token builtin"},"lookup"),e(),a("span",{class:"token string"},'"betty"'),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"phoneBookToMap"),e(),a("span",{class:"token hvariable"},"phoneBook"),e("\n"),a("span",{class:"token string"},'"342-2492,555-2938"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),Rc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"phoneBookToMap"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Ord"),e(),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),e(","),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Map.Map"),e(),a("span",{class:"token hvariable"},"k"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"phoneBookToMap"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"Map.fromListWith"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"v"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"k"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"v"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"xs"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Map"),a("span",{class:"token punctuation"},"."),a("span",{class:"token builtin"},"lookup"),e(),a("span",{class:"token string"},'"patsy"'),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"phoneBookToMap"),e(),a("span",{class:"token hvariable"},"phoneBook"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"827-9162"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"943-2929"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"493-2928"'),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),zc=a("p",null,"在遇到重复元素时,单选最大的那个值.",-1),Dc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Map.fromListWith"),e(),a("span",{class:"token builtin"},"max"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"29"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"22"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"11"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"22"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"15"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"29"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"22"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Jc=a("p",null,"将相同键的值都加在一起.",-1),Gc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Map.fromListWith"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"+"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"29"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"22"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"11"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"22"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"15"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"108"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"62"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"37"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),_c=a("p",null,"insertWith",-1),Hc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Map.insertWith"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"+"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token number"},"3"),e(),a("span",{class:"token number"},"100"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Map.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"103"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"339"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"104"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"103"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"339"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Kc=a("h4",{id:"data-set"},[a("a",{class:"header-anchor",href:"#data-set","aria-hidden":"true"},"#"),e(" Data Set")],-1),Yc=a("p",null,"内部元素排序且唯一",-1),Vc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(),a("span",{class:"token keyword"},"qualified"),e(" Data.Set "),a("span",{class:"token keyword"},"as"),e(" Set")]),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),Uc=a("p",null,"fromList",-1),Zc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"set1"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token hvariable"},"text1"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"set2"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token hvariable"},"text2"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"set1"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token string"},'" .?AIRadefhijlmnorstuy"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"set2"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token string"},'" !Tabcdefghilmnorstuvwy"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),jc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Set.intersection"),e(),a("span",{class:"token hvariable"},"set1"),e(),a("span",{class:"token hvariable"},"set2"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token string"},'" adefhilmnorstuy"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Qc=a("p",null,[a("strong",null,"difference"),e(" 差集")],-1),Xc=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Set.difference"),e(),a("span",{class:"token hvariable"},"set1"),e(),a("span",{class:"token hvariable"},"set2"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token string"},'".?AIRj"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Set.difference"),e(),a("span",{class:"token hvariable"},"set2"),e(),a("span",{class:"token hvariable"},"set1"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token string"},'"!Tbcgvw"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),nr=a("p",null,[a("code",null,"union"),e(" 并集")],-1),sr=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Set.union"),e(),a("span",{class:"token hvariable"},"set1"),e(),a("span",{class:"token hvariable"},"set2"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token string"},'" !.?AIRTabcdefghijlmnorstuvwy"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),ar=a("p",null,[a("code",null,"null"),e(","),a("code",null,"size"),e(","),a("code",null,"member"),e(","),a("code",null,"empty"),e(","),a("code",null,"singleton"),e(","),a("code",null,"insert"),e(","),a("code",null,"delete")],-1),er=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Set"),a("span",{class:"token punctuation"},"."),a("span",{class:"token builtin"},"null"),e(),a("span",{class:"token hvariable"},"Set.empty"),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Set"),a("span",{class:"token punctuation"},"."),a("span",{class:"token builtin"},"null"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"False"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Set.size"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token number"},"3"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Set.singleton"),e(),a("span",{class:"token number"},"9"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Set.insert"),e(),a("span",{class:"token number"},"4"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Set.insert"),e(),a("span",{class:"token number"},"8"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token operator"},".."),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"9"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Set.delete"),e(),a("span",{class:"token number"},"4"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br")])],-1),tr=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"`Set.isSubsetOf`"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"`Set.isSubsetOf`"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"True"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"`Set.isProperSubsetOf`"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"False"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"`Set.isSubsetOf`"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token constant"},"False"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),lr=a("p",null,[e("执行 "),a("code",null,"map"),e(" 和 "),a("code",null,"filter"),e(":")],-1),or=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Set"),a("span",{class:"token punctuation"},"."),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token builtin"},"odd"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token constant"},"Set"),a("span",{class:"token punctuation"},"."),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"fromList"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"6"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),pr=a("ul",null,[a("li",null,"删除重复元素")],-1),cr=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"setNub"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"Set.toList"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"Set.fromList"),e(),a("span",{class:"token hvariable"},"xs"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"setNub"),e(),a("span",{class:"token string"},'"HEY WHATS CRACKALACKIN"'),e("\n"),a("span",{class:"token string"},'" ACEHIKLNRSTWY"'),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"nub"),e(),a("span",{class:"token string"},'"HEY WHATS CRACKALACKIN"'),e("\n"),a("span",{class:"token string"},'"HEY WATSCRKLIN"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),rr=a("h2",{id:"输入与输出"},[a("a",{class:"header-anchor",href:"#输入与输出","aria-hidden":"true"},"#"),e(" 输入与输出")],-1),ur=a("h3",{id:"io-action"},[a("a",{class:"header-anchor",href:"#io-action","aria-hidden":"true"},"#"),e(" IO action")],-1),ir=a("p",null,[a("code",null,"name <- IO action"),e(": 将 action 绑定至名字上,IO String -> String")],-1),kr=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"name"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"getLine"),e("\n"),a("span",{class:"token hvariable"},"name"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token constant"},"String"),e("\n\n"),a("span",{class:"token hvariable"},"name"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"putStrLn"),e(),a("span",{class:"token constant"},"String"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),br=a("p",null,[e("在一个"),a("code",null,"do block"),e("中,最后一个"),a("code",null,"action"),e("不能绑定任何名字,它会被绑定成为"),a("code",null,"do block"),e("的结果值.")],-1),mr=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"foo"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"putStrLn"),e(),a("span",{class:"token string"},'"Hello, what\'s your name?"'),e("\n "),a("span",{class:"token hvariable"},"name"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"getLine"),e("\n "),a("span",{class:"token builtin"},"putStrLn"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"Hey "'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token hvariable"},"name"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token string"},'", you rock!"'),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),hr=a("h4",{id:"return"},[a("a",{class:"header-anchor",href:"#return","aria-hidden":"true"},"#"),e(" return")],-1),dr=a("ul",null,[a("li",null,"return 功能:将 pure value 包成 I/O actions,不会终止函数/程序"),a("li",null,[e("return 作用: "),a("ul",null,[a("li",null,"if condition then I/O action else I/O action"),a("li",null,[e("改变"),a("code",null,"do block形成的I/O action"),e("的结果值: otherIOAction -> return pureValue")])])])],-1),vr=a("blockquote",null,[a("p",null,'e.g return "haha" - String -> IO String')],-1),gr=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"line"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"getLine"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token builtin"},"null"),e(),a("span",{class:"token hvariable"},"line"),e("\n "),a("span",{class:"token keyword"},"then"),e(),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token builtin"},"putStrLn"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token hvariable"},"reverseWords"),e(),a("span",{class:"token hvariable"},"line"),e("\n "),a("span",{class:"token hvariable"},"main"),e("\n\n"),a("span",{class:"token hvariable"},"reverseWords"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token hvariable"},"reverseWords"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"unwords"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token builtin"},"reverse"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"words"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br")])],-1),yr=a("h3",{id:"command-line"},[a("a",{class:"header-anchor",href:"#command-line","aria-hidden":"true"},"#"),e(" Command Line")],-1),fr=a("blockquote",null,[a("p",null,"System.Environment")],-1),wr=a("ul",null,[a("li",null,[e("getArgs: "),a("code",null,"getArgs :: IO [String]")]),a("li",null,[e("getProgName: "),a("code",null,"getProgName :: IO String")])],-1),xr=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" System.Environment")]),e("\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Data.List")]),e("\n\n"),a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"args"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"getArgs"),e("\n "),a("span",{class:"token hvariable"},"progName"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"getProgName"),e("\n "),a("span",{class:"token builtin"},"mapM"),e(),a("span",{class:"token builtin"},"putStrLn"),e(),a("span",{class:"token hvariable"},"args"),e("\n "),a("span",{class:"token builtin"},"putStrLn"),e(),a("span",{class:"token hvariable"},"progName"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),Sr=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" System.Environment")]),e("\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" System.Directory")]),e("\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" System.IO")]),e("\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Data.List")]),e("\n\n"),a("span",{class:"token hvariable"},"dispatch"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"String"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"String"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"IO"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"dispatch"),e(),a("span",{class:"token operator"},"="),e(" "),a("span",{class:"token punctuation"},"["),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"add"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"add"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"view"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"view"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"remove"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"remove"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},"]"),e("\n\n"),a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"command"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"args"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"getArgs"),e("\n "),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token hvariable"},"action"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"lookup"),e(),a("span",{class:"token hvariable"},"command"),e(),a("span",{class:"token hvariable"},"dispatch"),e("\n "),a("span",{class:"token hvariable"},"action"),e(),a("span",{class:"token hvariable"},"args"),e("\n\n"),a("span",{class:"token hvariable"},"add"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"String"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"IO"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"add"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"fileName"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"todoItem"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"appendFile"),e(),a("span",{class:"token hvariable"},"fileName"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"todoItem"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token string"},'"\\n"'),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"view"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"String"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"IO"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"view"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"fileName"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"contents"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"readFile"),e(),a("span",{class:"token hvariable"},"fileName"),e("\n "),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"todoTasks"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"lines"),e(),a("span",{class:"token hvariable"},"contents"),e("\n "),a("span",{class:"token hvariable"},"numberedTasks"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"zipWith"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"n"),e(),a("span",{class:"token hvariable"},"line"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token builtin"},"show"),e(),a("span",{class:"token hvariable"},"n"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token string"},'" - "'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token hvariable"},"line"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token operator"},".."),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token hvariable"},"todoTasks"),e("\n "),a("span",{class:"token builtin"},"putStr"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"unlines"),e(),a("span",{class:"token hvariable"},"numberedTasks"),e("\n\n"),a("span",{class:"token hvariable"},"remove"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"String"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"IO"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"remove"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token hvariable"},"fileName"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"numberString"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"handle"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"openFile"),e(),a("span",{class:"token hvariable"},"fileName"),e(),a("span",{class:"token constant"},"ReadMode"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"tempName"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"tempHandle"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"openTempFile"),e(),a("span",{class:"token string"},'"."'),e(),a("span",{class:"token string"},'"temp"'),e("\n "),a("span",{class:"token hvariable"},"contents"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"hGetContents"),e(),a("span",{class:"token hvariable"},"handle"),e("\n "),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"number"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"read"),e(),a("span",{class:"token hvariable"},"numberString"),e("\n "),a("span",{class:"token hvariable"},"todoTasks"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"lines"),e(),a("span",{class:"token hvariable"},"contents"),e("\n "),a("span",{class:"token hvariable"},"newTodoItems"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"delete"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"todoTasks"),e(),a("span",{class:"token operator"},"!!"),e(),a("span",{class:"token hvariable"},"number"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"todoTasks"),e("\n "),a("span",{class:"token hvariable"},"hPutStr"),e(),a("span",{class:"token hvariable"},"tempHandle"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"unlines"),e(),a("span",{class:"token hvariable"},"newTodoItems"),e("\n "),a("span",{class:"token hvariable"},"hClose"),e(),a("span",{class:"token hvariable"},"handle"),e("\n "),a("span",{class:"token hvariable"},"hClose"),e(),a("span",{class:"token hvariable"},"tempHandle"),e("\n "),a("span",{class:"token hvariable"},"removeFile"),e(),a("span",{class:"token hvariable"},"fileName"),e("\n "),a("span",{class:"token hvariable"},"renameFile"),e(),a("span",{class:"token hvariable"},"tempName"),e(),a("span",{class:"token hvariable"},"fileName"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br")])],-1),Lr=a("h3",{id:"bytestring"},[a("a",{class:"header-anchor",href:"#bytestring","aria-hidden":"true"},"#"),e(" ByteString")],-1),Mr=a("ul",null,[a("li",null,[a("code",null,"Data.ByteString")]),a("li",null,[a("code",null,"Data.ByteString.Lazy")])],-1),Fr=a("p",null,"lazy byteStrings 像装了一堆大小为 64K 的 strict byteStrings 的 list",-1),Tr=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(),a("span",{class:"token keyword"},"qualified"),e(" Data.ByteString.Lazy "),a("span",{class:"token keyword"},"as"),e(" B")]),e("\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(),a("span",{class:"token keyword"},"qualified"),e(" Data.ByteString "),a("span",{class:"token keyword"},"as"),e(" S")]),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Ir=a("ul",null,[a("li",null,"pack/unpack"),a("li",null,"fromChunks/toChunks"),a("li",null,"cons/empty/head/tail/init/null/length/map/reverse/foldl/foldr/concat/takeWhile/filter")],-1),Ar=a("h3",{id:"常用输入输出函数"},[a("a",{class:"header-anchor",href:"#常用输入输出函数","aria-hidden":"true"},"#"),e(" 常用输入输出函数")],-1),Cr=a("h4",{id:"输出"},[a("a",{class:"header-anchor",href:"#输出","aria-hidden":"true"},"#"),e(" 输出")],-1),Or=a("h5",{id:"output-string"},[a("a",{class:"header-anchor",href:"#output-string","aria-hidden":"true"},"#"),e(" Output String")],-1),Nr=a("p",null,[a("code",null,"putChar"),e("/"),a("code",null,"putStr"),e("/"),a("code",null,"putStrLn"),e(":")],-1),Br=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token builtin"},"putStr"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"IO"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token builtin"},"putStr"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token builtin"},"putStr"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token builtin"},"putChar"),e(),a("span",{class:"token hvariable"},"x"),e("\n "),a("span",{class:"token builtin"},"putStr"),e(),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),Wr=a("h5",{id:"print"},[a("a",{class:"header-anchor",href:"#print","aria-hidden":"true"},"#"),e(" print")],-1),Er=a("p",null,"print = putStrLn . show",-1),$r=a("h5",{id:"file-system-io"},[a("a",{class:"header-anchor",href:"#file-system-io","aria-hidden":"true"},"#"),e(" File System IO")],-1),Pr=a("ul",null,[a("li",null,[a("code",null,"hPutStr")]),a("li",null,[a("code",null,"hPutStrLn")])],-1),qr=a("h6",{id:"write-file"},[a("a",{class:"header-anchor",href:"#write-file","aria-hidden":"true"},"#"),e(" Write File")],-1),Rr=a("p",null,[a("code",null,"writefile :: FilePath -> String -> IO ()"),e(" - WriteMode, not AppendMode")],-1),zr=a("h6",{id:"append-file"},[a("a",{class:"header-anchor",href:"#append-file","aria-hidden":"true"},"#"),e(" Append File")],-1),Dr=a("h4",{id:"输入"},[a("a",{class:"header-anchor",href:"#输入","aria-hidden":"true"},"#"),e(" 输入")],-1),Jr=a("h5",{id:"getchar-io-char"},[a("a",{class:"header-anchor",href:"#getchar-io-char","aria-hidden":"true"},"#"),e(" getChar :: IO Char")],-1),Gr=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"getChar"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"/="),e(),a("span",{class:"token char string"},"' '"),e("\n "),a("span",{class:"token keyword"},"then"),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token builtin"},"putChar"),e(),a("span",{class:"token hvariable"},"c"),e("\n "),a("span",{class:"token hvariable"},"main"),e("\n "),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),_r=a("h5",{id:"get-contents"},[a("a",{class:"header-anchor",href:"#get-contents","aria-hidden":"true"},"#"),e(" Get Contents")],-1),Hr=a("p",null,"getContents :: IO String (Lazy I/O) - 内容暂存在文件,需要使用时读取至内存区",-1),Kr=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Data.Char")]),e("\n\n"),a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"contents"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"getContents"),e("\n "),a("span",{class:"token builtin"},"putStr"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token builtin"},"toUpper"),e(),a("span",{class:"token hvariable"},"contents"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),Yr=a("h5",{id:"file"},[a("a",{class:"header-anchor",href:"#file","aria-hidden":"true"},"#"),e(" File")],-1),Vr=a("h6",{id:"handle"},[a("a",{class:"header-anchor",href:"#handle","aria-hidden":"true"},"#"),e(" handle")],-1),Ur=a("ul",null,[a("li",null,[a("p",null,[a("code",null,"data IOMode = ReadMode | WriteMode | AppendMode | ReadWriteMode")])]),a("li",null,[a("p",null,[a("code",null,"openFile :: FilePath(String) -> IOMode -> IO Handle")])]),a("li",null,[a("p",null,[a("code",null,"hGetContents :: Handle -> IO String")])]),a("li",null,[a("p",null,[a("code",null,"hClose :: Handle -> IO ()")])]),a("li",null,[a("p",null,[a("code",null,"hGetChar")])]),a("li",null,[a("p",null,[a("code",null,"hGetLine")])])],-1),Zr=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" System.IO")]),e("\n\n"),a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"handle"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"openFile"),e(),a("span",{class:"token string"},'"girlfriend.txt"'),e(),a("span",{class:"token constant"},"ReadMode"),e("\n "),a("span",{class:"token hvariable"},"contents"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"hGetContents"),e(),a("span",{class:"token hvariable"},"handle"),e("\n "),a("span",{class:"token builtin"},"putStr"),e(),a("span",{class:"token hvariable"},"contents"),e("\n "),a("span",{class:"token hvariable"},"hClose"),e(),a("span",{class:"token hvariable"},"handle"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),jr=a("h6",{id:"with-file"},[a("a",{class:"header-anchor",href:"#with-file","aria-hidden":"true"},"#"),e(" With File")],-1),Qr=a("p",null,[a("code",null,"withFile :: FilePath -> IOMode -> (Handle -> IO a) -> IO a")],-1),Xr=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" System.IO")]),e("\n\n"),a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"withFile"),e(),a("span",{class:"token string"},'"girlfriend.txt"'),e(),a("span",{class:"token constant"},"ReadMode"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"handle"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"contents"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"hGetContents"),e(),a("span",{class:"token hvariable"},"handle"),e("\n "),a("span",{class:"token builtin"},"putStr"),e(),a("span",{class:"token hvariable"},"contents"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),nu=a("h6",{id:"read-file"},[a("a",{class:"header-anchor",href:"#read-file","aria-hidden":"true"},"#"),e(" Read File")],-1),su=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"contents"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"readFile"),e(),a("span",{class:"token string"},'"girlfriend.txt"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),au=a("h4",{id:"action"},[a("a",{class:"header-anchor",href:"#action","aria-hidden":"true"},"#"),e(" Action")],-1),eu=a("h5",{id:"when"},[a("a",{class:"header-anchor",href:"#when","aria-hidden":"true"},"#"),e(" When")],-1),tu=a("p",null,"Control.Monad.when :: (Applicative f) => Bool -> f () -> f ()",-1),lu=a("p",null,[a("code",null,"when bool表达式 I/O-Action"),e(" - 真时返回 Action,假时"),a("code",null,"return ()")],-1),ou=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Control.Monad")]),e("\n\n"),a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"getChar"),e("\n "),a("span",{class:"token hvariable"},"when"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"c"),e(),a("span",{class:"token operator"},"/="),e(),a("span",{class:"token char string"},"' '"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token builtin"},"putChar"),e(),a("span",{class:"token hvariable"},"c"),e("\n "),a("span",{class:"token hvariable"},"main"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),pu=a("h5",{id:"sequence"},[a("a",{class:"header-anchor",href:"#sequence","aria-hidden":"true"},"#"),e(" sequence")],-1),cu=a("p",null,[e("sequence :: "),a("code",null,"[IO a]"),e(" -> IO "),a("code",null,"[a]")],-1),ru=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"rs"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"sequence"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token builtin"},"getLine"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token builtin"},"getLine"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token builtin"},"getLine"),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token builtin"},"print"),e(),a("span",{class:"token hvariable"},"rs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),uu=a("h5",{id:"map"},[a("a",{class:"header-anchor",href:"#map","aria-hidden":"true"},"#"),e(" Map")],-1),iu=a("p",null,"mapM, Control.Monad.forM:",-1),ku=a("p",null,"= sequence . map",-1),bu=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"mapM"),e(),a("span",{class:"token builtin"},"print"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token number"},"1"),e("\n"),a("span",{class:"token number"},"2"),e("\n"),a("span",{class:"token number"},"3"),e("\n"),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token builtin"},"mapM_"),e(),a("span",{class:"token builtin"},"print"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e("\n"),a("span",{class:"token number"},"1"),e("\n"),a("span",{class:"token number"},"2"),e("\n"),a("span",{class:"token number"},"3"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br")])],-1),mu=a("h5",{id:"control-monad-forever"},[a("a",{class:"header-anchor",href:"#control-monad-forever","aria-hidden":"true"},"#"),e(" Control Monad forever")],-1),hu=a("p",null,"接受一个 I/O action 并回传一个永远作同一件事的 I/O action",-1),du=a("p",null,"以下代码实现了循环结构:",-1),vu=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Control.Monad")]),e("\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Data.Char")]),e("\n\n"),a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"forever"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token builtin"},"putStr"),e(),a("span",{class:"token string"},'"Give me some input: "'),e("\n "),a("span",{class:"token hvariable"},"l"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"getLine"),e("\n "),a("span",{class:"token builtin"},"putStrLn"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token builtin"},"toUpper"),e(),a("span",{class:"token hvariable"},"l"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),gu=a("h5",{id:"hsetbuffering"},[a("a",{class:"header-anchor",href:"#hsetbuffering","aria-hidden":"true"},"#"),e(" hSetBuffering")],-1),yu=a("p",null,[a("code",null,"data BufferMode = NoBuffering | LineBuffering | BlockBuffering (Maybe Int)"),a("code",null,"hSetBuffering :: Handle -> BufferMode -> IO ()")],-1),fu=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"withFile"),e(),a("span",{class:"token string"},'"something.txt"'),e(),a("span",{class:"token constant"},"ReadMode"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"handle"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"hSetBuffering"),e(),a("span",{class:"token hvariable"},"handle"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token constant"},"BlockBuffering"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Just"),e(),a("span",{class:"token number"},"2048"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token hvariable"},"contents"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"hGetContents"),e(),a("span",{class:"token hvariable"},"handle"),e("\n "),a("span",{class:"token builtin"},"putStr"),e(),a("span",{class:"token hvariable"},"contents"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),wu=a("h5",{id:"hflush"},[a("a",{class:"header-anchor",href:"#hflush","aria-hidden":"true"},"#"),e(" hFlush")],-1),xu=a("h4",{id:"other"},[a("a",{class:"header-anchor",href:"#other","aria-hidden":"true"},"#"),e(" Other")],-1),Su=a("h5",{id:"lines"},[a("a",{class:"header-anchor",href:"#lines","aria-hidden":"true"},"#"),e(" lines")],-1),Lu=a("p",null,[a("code",null,"lines :: String -> [String]"),e(" - 按换行符将段落切割成句子")],-1),Mu=a("h5",{id:"interact"},[a("a",{class:"header-anchor",href:"#interact","aria-hidden":"true"},"#"),e(" interact")],-1),Fu=a("ul",null,[a("li",null,"arguments: String -> String 的函数"),a("li",null,"return: 一个 I/O action"),a("li",null,"function: I/O action 会读取输入,调用提供的函数,然后把函数的结果打印出来")],-1),Tu=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"interact"),e(),a("span",{class:"token hvariable"},"shortLinesOnly"),e("\n\n"),a("span",{class:"token hvariable"},"shortLinesOnly"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token hvariable"},"shortLinesOnly"),e(),a("span",{class:"token hvariable"},"input"),e(),a("span",{class:"token operator"},"="),e("\n "),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token hvariable"},"allLines"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"lines"),e(),a("span",{class:"token hvariable"},"input"),e("\n "),a("span",{class:"token hvariable"},"shortLines"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"line"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token builtin"},"length"),e(),a("span",{class:"token hvariable"},"line"),e(),a("span",{class:"token operator"},"<"),e(),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"allLines"),e("\n "),a("span",{class:"token hvariable"},"result"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"unlines"),e(),a("span",{class:"token hvariable"},"shortLines"),e("\n "),a("span",{class:"token keyword"},"in"),e(),a("span",{class:"token hvariable"},"result"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),Iu=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"interact"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token builtin"},"unlines"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"filter"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"<"),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"length"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"lines"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),Au=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"respondPalindromes"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"unlines"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"map"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"->"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token hvariable"},"isPalindrome"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token keyword"},"then"),e(),a("span",{class:"token string"},'"palindrome"'),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token string"},'"not a palindrome"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"}," . "),a("span",{class:"token builtin"},"lines"),e("\n "),a("span",{class:"token keyword"},"where"),e(),a("span",{class:"token hvariable"},"isPalindrome"),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token builtin"},"reverse"),e(),a("span",{class:"token hvariable"},"xs"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),Cu=a("h5",{id:"system-directory"},[a("a",{class:"header-anchor",href:"#system-directory","aria-hidden":"true"},"#"),e(" System Directory")],-1),Ou=a("ul",null,[a("li",null,"removeFile"),a("li",null,"renameFile")],-1),Nu=a("h2",{id:"异常"},[a("a",{class:"header-anchor",href:"#异常","aria-hidden":"true"},"#"),e(" 异常")],-1),Bu=a("p",null,"System.IO.Error",-1),Wu=a("h3",{id:"catch"},[a("a",{class:"header-anchor",href:"#catch","aria-hidden":"true"},"#"),e(" catch")],-1),Eu=a("p",null,"catch :: IO a -> (IOError -> IO a) -> IO a",-1),$u=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" System.Environment")]),e("\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" System.IO")]),e("\n"),a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" System.IO.Error")]),e("\n\n"),a("span",{class:"token hvariable"},"main"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"toTry"),e(" `"),a("span",{class:"token builtin"},"catch"),e("` "),a("span",{class:"token hvariable"},"handler"),e("\n\n"),a("span",{class:"token hvariable"},"toTry"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"IO"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"toTry"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"fileName"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"_"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"getArgs"),e("\n "),a("span",{class:"token hvariable"},"contents"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token builtin"},"readFile"),e(),a("span",{class:"token hvariable"},"fileName"),e("\n "),a("span",{class:"token builtin"},"putStrLn"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token string"},'"The file has "'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token builtin"},"show"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"length"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"lines"),e(),a("span",{class:"token hvariable"},"contents"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token string"},'" lines!"'),e("\n\n"),a("span",{class:"token hvariable"},"handler"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"IOError"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"IO"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"handler"),e(),a("span",{class:"token hvariable"},"e"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"isDoesNotExistError"),e(),a("span",{class:"token hvariable"},"e"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"putStrLn"),e(),a("span",{class:"token string"},'"The file doesn\'t exist!"'),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"isFullError"),e(),a("span",{class:"token hvariable"},"e"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"freeSomeSpace"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token hvariable"},"isIllegalOperation"),e(),a("span",{class:"token hvariable"},"e"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"notifyCops"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token builtin"},"otherwise"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token builtin"},"ioError"),e(),a("span",{class:"token hvariable"},"e"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br")])],-1),Pu=a("h2",{id:"advanced-monad"},[a("a",{class:"header-anchor",href:"#advanced-monad","aria-hidden":"true"},"#"),e(" Advanced Monad")],-1),qu=a("h3",{id:"writer-monad"},[a("a",{class:"header-anchor",href:"#writer-monad","aria-hidden":"true"},"#"),e(" Writer Monad")],-1),Ru=a("p",null,"Writer 可以让我们在计算的同时搜集所有 log 纪录,并汇集成一个 log 并附加在结果上",-1),zu=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"applyLog"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"String"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"String"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},","),a("span",{class:"token constant"},"String"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"applyLog"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},","),a("span",{class:"token builtin"},"log"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"newLog"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token keyword"},"in"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},","),a("span",{class:"token builtin"},"log"),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token hvariable"},"newLog"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Du=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"30"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token string"},'"A freaking platoon."'),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"`applyLog`"),e(),a("span",{class:"token hvariable"},"isBigGang"),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"True"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"A freaking platoon.Compared gang size to 9"'),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"BathCat"'),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"Got outlaw name."'),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"`applyLog`"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token builtin"},"length"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token string"},'"Applied length"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"Got outlaw name.Applied length"'),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Ju=a("h4",{id:"control-monad-writer"},[a("a",{class:"header-anchor",href:"#control-monad-writer","aria-hidden":"true"},"#"),e(" Control Monad Writer")],-1),Gu=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Monoid"),e(),a("span",{class:"token hvariable"},"w"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token constant"},"Monad"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Writer"),e(),a("span",{class:"token hvariable"},"w"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Writer"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"mempty"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Writer"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"v"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Writer"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"v"),e("'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token keyword"},"in"),e(),a("span",{class:"token constant"},"Writer"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"y"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"v"),e(),a("span",{class:"token operator"},"`mappend`"),e(),a("span",{class:"token hvariable"},"v"),e("'"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),_u=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Control.Monad.Writer")]),e("\n\n"),a("span",{class:"token hvariable"},"logNumber"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Int"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"Writer"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"String"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token constant"},"Int"),e("\n"),a("span",{class:"token hvariable"},"logNumber"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Writer"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},'"Got number: "'),e(),a("span",{class:"token operator"},"++"),e(),a("span",{class:"token builtin"},"show"),e(),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"multiWithLog"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Writer"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"String"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token constant"},"Int"),e("\n"),a("span",{class:"token hvariable"},"multiWithLog"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"logNumber"),e(),a("span",{class:"token number"},"3"),e("\n "),a("span",{class:"token hvariable"},"b"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"logNumber"),e(),a("span",{class:"token number"},"5"),e("\n "),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token operator"},"*"),a("span",{class:"token hvariable"},"b"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br")])],-1),Hu=a("h3",{id:"reader-monad"},[a("a",{class:"header-anchor",href:"#reader-monad","aria-hidden":"true"},"#"),e(" Reader Monad")],-1),Ku=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Monad"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"->"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"r"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"_"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"x"),e("\n "),a("span",{class:"token hvariable"},"h"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"w"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"h"),e(),a("span",{class:"token hvariable"},"w"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token hvariable"},"w"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),Yu=a("h3",{id:"state-monad"},[a("a",{class:"header-anchor",href:"#state-monad","aria-hidden":"true"},"#"),e(" State Monad")],-1),Vu=a("h4",{id:"control-monad-state"},[a("a",{class:"header-anchor",href:"#control-monad-state","aria-hidden":"true"},"#"),e(" Control Monad State")],-1),Uu=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"newtype"),e(),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token hvariable"},"s"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token punctuation"},"{"),e(),a("span",{class:"token hvariable"},"runState"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token hvariable"},"s"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"s"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"}"),e("\n\n"),a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token constant"},"Monad"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token hvariable"},"s"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"s"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"s"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token hvariable"},"h"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"s"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token keyword"},"let"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token hvariable"},"newState"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"h"),e(),a("span",{class:"token hvariable"},"s"),e("\n "),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token hvariable"},"g"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"a"),e("\n "),a("span",{class:"token keyword"},"in"),e(" "),a("span",{class:"token hvariable"},"g"),e(),a("span",{class:"token hvariable"},"newState"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),Zu=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"get"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"s"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"s"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"s"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"put"),e(),a("span",{class:"token hvariable"},"newState"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"s"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"newState"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),ju=a("h4",{id:"state-monad-case"},[a("a",{class:"header-anchor",href:"#state-monad-case","aria-hidden":"true"},"#"),e(" State Monad Case")],-1),Qu=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token import-statement"},[a("span",{class:"token keyword"},"import"),e(" Control.Monad.State")]),e("\n\n"),a("span",{class:"token hvariable"},"pop"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token constant"},"Stack"),e(),a("span",{class:"token constant"},"Int"),e("\n"),a("span",{class:"token hvariable"},"pop"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token operator"},"\\"),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"x"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"push"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"Int"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token constant"},"Stack"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token hvariable"},"push"),e(),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token operator"},"$"),e(),a("span",{class:"token operator"},"\\"),a("span",{class:"token hvariable"},"xs"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),a("span",{class:"token hvariable"},"a"),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"xs"),a("span",{class:"token punctuation"},")"),e("\n\n"),a("span",{class:"token hvariable"},"stackManipulation"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"State"),e(),a("span",{class:"token constant"},"Stack"),e(),a("span",{class:"token constant"},"Int"),e("\n"),a("span",{class:"token hvariable"},"stackManipulation"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"do"),e("\n "),a("span",{class:"token hvariable"},"push"),e(),a("span",{class:"token number"},"3"),e("\n "),a("span",{class:"token hvariable"},"a"),e(),a("span",{class:"token operator"},"<-"),e(),a("span",{class:"token hvariable"},"pop"),e("\n "),a("span",{class:"token hvariable"},"pop"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br")])],-1),Xu=a("h3",{id:"error-monad"},[a("a",{class:"header-anchor",href:"#error-monad","aria-hidden":"true"},"#"),e(" Error Monad")],-1),ni=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"instance"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Error"),e(),a("span",{class:"token hvariable"},"e"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token constant"},"Monad"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Either"),e(),a("span",{class:"token hvariable"},"e"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"where"),e("\n "),a("span",{class:"token builtin"},"return"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Right"),e(),a("span",{class:"token hvariable"},"x"),e("\n "),a("span",{class:"token constant"},"Right"),e(),a("span",{class:"token hvariable"},"x"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token hvariable"},"x"),e("\n "),a("span",{class:"token constant"},"Left"),e(),a("span",{class:"token hvariable"},"err"),e(),a("span",{class:"token operator"},">>="),e(),a("span",{class:"token hvariable"},"f"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Left"),e(),a("span",{class:"token hvariable"},"err"),e("\n "),a("span",{class:"token builtin"},"fail"),e(),a("span",{class:"token hvariable"},"msg"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"Left"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token hvariable"},"strMsg"),e(),a("span",{class:"token hvariable"},"msg"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),si=a("div",{class:"language-haskell line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token operator"},":"),a("span",{class:"token hvariable"},"t"),e(),a("span",{class:"token hvariable"},"strMsg"),e("\n"),a("span",{class:"token hvariable"},"strMsg"),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token constant"},"Error"),e(),a("span",{class:"token hvariable"},"a"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"=>"),e(),a("span",{class:"token constant"},"String"),e(),a("span",{class:"token operator"},"->"),e(),a("span",{class:"token hvariable"},"a"),e("\n"),a("span",{class:"token hvariable"},"ghci"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token hvariable"},"strMsg"),e(),a("span",{class:"token string"},'"boom!"'),e(),a("span",{class:"token operator"},"::"),e(),a("span",{class:"token constant"},"String"),e("\n"),a("span",{class:"token string"},'"boom!"'),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),ai=a("h4",{id:"liftm"},[a("a",{class:"header-anchor",href:"#liftm","aria-hidden":"true"},"#"),e(" liftM")],-1),ei=a("h4",{id:"join"},[a("a",{class:"header-anchor",href:"#join","aria-hidden":"true"},"#"),e(" join")],-1),ti=a("h4",{id:"filterm"},[a("a",{class:"header-anchor",href:"#filterm","aria-hidden":"true"},"#"),e(" filterM")],-1),li=a("h4",{id:"foldm"},[a("a",{class:"header-anchor",href:"#foldm","aria-hidden":"true"},"#"),e(" foldM")],-1),oi=a("h4",{id:"组合函数"},[a("a",{class:"header-anchor",href:"#组合函数","aria-hidden":"true"},"#"),e(),a("code",null,"<=<"),e("(组合函数)")],-1),pi=a("h3",{id:"self-defined-monad"},[a("a",{class:"header-anchor",href:"#self-defined-monad","aria-hidden":"true"},"#"),e(" Self-Defined Monad")],-1),ci=a("h2",{id:"注释"},[a("a",{class:"header-anchor",href:"#注释","aria-hidden":"true"},"#"),e(" 注释")],-1),ri=a("h3",{id:"符号-1"},[a("a",{class:"header-anchor",href:"#符号-1","aria-hidden":"true"},"#"),e(" 符号")],-1),ui=a("ul",null,[a("li",null,[a("code",null,"--"),e(" 单行注释")]),a("li",null,[a("code",null,"{- -}"),e(" 块注释")]),a("li",null,[a("code",null,"{-# #-}"),e(" (文件头部)编译器参数")])],-1),ii=a("h2",{id:"reference"},[a("a",{class:"header-anchor",href:"#reference","aria-hidden":"true"},"#"),e(" Reference")],-1),ki=a("ul",null,[a("li",null,[a("a",{href:"https://github.com/MnO2/learnyouahaskell-zh",target:"_blank",rel:"noopener noreferrer"},"Haskell Book")])],-1);l.render=function(a,e,t,l,bi,mi){return n(),s("div",null,[o,p,c,r,u,i,k,b,m,h,d,v,g,y,f,w,x,S,L,M,F,T,I,A,C,O,N,B,W,E,$,P,q,R,z,D,J,G,_,H,K,Y,V,U,Z,j,Q,X,nn,sn,an,en,tn,ln,on,pn,cn,rn,un,kn,bn,mn,hn,dn,vn,gn,yn,fn,wn,xn,Sn,Ln,Mn,Fn,Tn,In,An,Cn,On,Nn,Bn,Wn,En,$n,Pn,qn,Rn,zn,Dn,Jn,Gn,_n,Hn,Kn,Yn,Vn,Un,Zn,jn,Qn,Xn,ns,ss,as,es,ts,ls,os,ps,cs,rs,us,is,ks,bs,ms,hs,ds,vs,gs,ys,fs,ws,xs,Ss,Ls,Ms,Fs,Ts,Is,As,Cs,Os,Ns,Bs,Ws,Es,$s,Ps,qs,Rs,zs,Ds,Js,Gs,_s,Hs,Ks,Ys,Vs,Us,Zs,js,Qs,Xs,na,sa,aa,ea,ta,la,oa,pa,ca,ra,ua,ia,ka,ba,ma,ha,da,va,ga,ya,fa,wa,xa,Sa,La,Ma,Fa,Ta,Ia,Aa,Ca,Oa,Na,Ba,Wa,Ea,$a,Pa,qa,Ra,za,Da,Ja,Ga,_a,Ha,Ka,Ya,Va,Ua,Za,ja,Qa,Xa,ne,se,ae,ee,te,le,oe,pe,ce,re,ue,ie,ke,be,me,he,de,ve,ge,ye,fe,we,xe,Se,Le,Me,Fe,Te,Ie,Ae,Ce,Oe,Ne,Be,We,Ee,$e,Pe,qe,Re,ze,De,Je,Ge,_e,He,Ke,Ye,Ve,Ue,Ze,je,Qe,Xe,nt,st,at,et,tt,lt,ot,pt,ct,rt,ut,it,kt,bt,mt,ht,dt,vt,gt,yt,ft,wt,xt,St,Lt,Mt,Ft,Tt,It,At,Ct,Ot,Nt,Bt,Wt,Et,$t,Pt,qt,Rt,zt,Dt,Jt,Gt,_t,Ht,Kt,Yt,Vt,Ut,Zt,jt,Qt,Xt,nl,sl,al,el,tl,ll,ol,pl,cl,rl,ul,il,kl,bl,ml,hl,dl,vl,gl,yl,fl,wl,xl,Sl,Ll,Ml,Fl,Tl,Il,Al,Cl,Ol,Nl,Bl,Wl,El,$l,Pl,ql,Rl,zl,Dl,Jl,Gl,_l,Hl,Kl,Yl,Vl,Ul,Zl,jl,Ql,Xl,no,so,ao,eo,to,lo,oo,po,co,ro,uo,io,ko,bo,mo,ho,vo,go,yo,fo,wo,xo,So,Lo,Mo,Fo,To,Io,Ao,Co,Oo,No,Bo,Wo,Eo,$o,Po,qo,Ro,zo,Do,Jo,Go,_o,Ho,Ko,Yo,Vo,Uo,Zo,jo,Qo,Xo,np,sp,ap,ep,tp,lp,op,pp,cp,rp,up,ip,kp,bp,mp,hp,dp,vp,gp,yp,fp,wp,xp,Sp,Lp,Mp,Fp,Tp,Ip,Ap,Cp,Op,Np,Bp,Wp,Ep,$p,Pp,qp,Rp,zp,Dp,Jp,Gp,_p,Hp,Kp,Yp,Vp,Up,Zp,jp,Qp,Xp,nc,sc,ac,ec,tc,lc,oc,pc,cc,rc,uc,ic,kc,bc,mc,hc,dc,vc,gc,yc,fc,wc,xc,Sc,Lc,Mc,Fc,Tc,Ic,Ac,Cc,Oc,Nc,Bc,Wc,Ec,$c,Pc,qc,Rc,zc,Dc,Jc,Gc,_c,Hc,Kc,Yc,Vc,Uc,Zc,jc,Qc,Xc,nr,sr,ar,er,tr,lr,or,pr,cr,rr,ur,ir,kr,br,mr,hr,dr,vr,gr,yr,fr,wr,xr,Sr,Lr,Mr,Fr,Tr,Ir,Ar,Cr,Or,Nr,Br,Wr,Er,$r,Pr,qr,Rr,zr,Dr,Jr,Gr,_r,Hr,Kr,Yr,Vr,Ur,Zr,jr,Qr,Xr,nu,su,au,eu,tu,lu,ou,pu,cu,ru,uu,iu,ku,bu,mu,hu,du,vu,gu,yu,fu,wu,xu,Su,Lu,Mu,Fu,Tu,Iu,Au,Cu,Ou,Nu,Bu,Wu,Eu,$u,Pu,qu,Ru,zu,Du,Ju,Gu,_u,Hu,Ku,Yu,Vu,Uu,Zu,ju,Qu,Xu,ni,si,ai,ei,ti,li,oi,pi,ci,ri,ui,ii,ki])};export default l;export{t as __pageData}; diff --git a/assets/language_java_javaBasicNotes.md.4f729496.js b/assets/language_java_javaBasicNotes.md.4f729496.js new file mode 100644 index 00000000000..0e8579ac4bd --- /dev/null +++ b/assets/language_java_javaBasicNotes.md.4f729496.js @@ -0,0 +1 @@ +import{o as a,c as n,a as s}from"./app.6dd2a1b7.js";const e='{"title":"Java Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"CLI Tools","slug":"cli-tools"},{"level":3,"title":"编译","slug":"编译"},{"level":3,"title":"运行","slug":"运行"},{"level":3,"title":"反汇编","slug":"反汇编"},{"level":3,"title":"打包","slug":"打包"},{"level":2,"title":"Gradle Tool","slug":"gradle-tool"},{"level":3,"title":"Build Gradle","slug":"build-gradle"},{"level":2,"title":"基本结构","slug":"基本结构"},{"level":3,"title":"数据类型","slug":"数据类型"},{"level":3,"title":"常量","slug":"常量"},{"level":3,"title":"运算符","slug":"运算符"},{"level":3,"title":"字符串","slug":"字符串"},{"level":3,"title":"输入输出","slug":"输入输出"},{"level":3,"title":"表达式","slug":"表达式"},{"level":3,"title":"控制流程","slug":"控制流程"},{"level":3,"title":"大数值","slug":"大数值"},{"level":3,"title":"数组","slug":"数组"},{"level":2,"title":"对象与类","slug":"对象与类"},{"level":3,"title":"面向对象的三大特征","slug":"面向对象的三大特征"},{"level":3,"title":"完整的 Java 源文件","slug":"完整的-java-源文件"},{"level":3,"title":"Behavior State and Identity","slug":"behavior-state-and-identity"},{"level":3,"title":"预定义类","slug":"预定义类"},{"level":3,"title":"用户自定义类","slug":"用户自定义类"},{"level":3,"title":"方法 Method","slug":"方法-method"},{"level":3,"title":"对象构造","slug":"对象构造"},{"level":3,"title":"包","slug":"包"},{"level":3,"title":"类路径","slug":"类路径"},{"level":3,"title":"文档注释","slug":"文档注释"},{"level":3,"title":"类设计技巧","slug":"类设计技巧"},{"level":2,"title":"继承","slug":"继承"},{"level":3,"title":"父类与子类(superclass and subclass)","slug":"父类与子类-superclass-and-subclass"},{"level":3,"title":"Object 类","slug":"object-类"},{"level":3,"title":"泛型数组列表","slug":"泛型数组列表"},{"level":3,"title":"对象包装器与自动装箱","slug":"对象包装器与自动装箱"},{"level":3,"title":"可变参数方法","slug":"可变参数方法"},{"level":3,"title":"枚举类","slug":"枚举类"},{"level":3,"title":"访问控制符","slug":"访问控制符"},{"level":3,"title":"非访问控制符","slug":"非访问控制符"},{"level":3,"title":"反射(Reflection)","slug":"反射-reflection"},{"level":2,"title":"接口与内部类","slug":"接口与内部类"},{"level":3,"title":"接口","slug":"接口"},{"level":3,"title":"对象克隆","slug":"对象克隆"},{"level":3,"title":"回调","slug":"回调"},{"level":3,"title":"内部类","slug":"内部类"},{"level":3,"title":"代理类","slug":"代理类"},{"level":2,"title":"图形程序设计","slug":"图形程序设计"},{"level":3,"title":"Swing 组件继承层次","slug":"swing-组件继承层次"},{"level":3,"title":"Swing 组件功能层次","slug":"swing-组件功能层次"},{"level":3,"title":"JFrame","slug":"jframe"},{"level":3,"title":"框架基础","slug":"框架基础"},{"level":3,"title":"自定义绘制组件","slug":"自定义绘制组件"},{"level":3,"title":"图形颜色","slug":"图形颜色"},{"level":2,"title":"事件处理","slug":"事件处理"},{"level":3,"title":"定义与基础","slug":"定义与基础"},{"level":3,"title":"动作","slug":"动作"},{"level":3,"title":"鼠标事件","slug":"鼠标事件"},{"level":3,"title":"AWT 事件继承层次","slug":"awt-事件继承层次"},{"level":2,"title":"Swing 组件","slug":"swing-组件"},{"level":3,"title":"Awt 和 Swing 设计中的设计模式","slug":"awt-和-swing-设计中的设计模式"},{"level":3,"title":"简单布局管理器","slug":"简单布局管理器"},{"level":3,"title":"复杂布局管理器","slug":"复杂布局管理器"},{"level":3,"title":"文本组件","slug":"文本组件"},{"level":3,"title":"选择组件","slug":"选择组件"},{"level":3,"title":"菜单组件","slug":"菜单组件"},{"level":3,"title":"对话框(顶级框架)","slug":"对话框-顶级框架"},{"level":2,"title":"异常、断言、日志、调试","slug":"异常、断言、日志、调试"},{"level":3,"title":"处理错误","slug":"处理错误"},{"level":3,"title":"捕获异常","slug":"捕获异常"},{"level":3,"title":"记录日志","slug":"记录日志"},{"level":3,"title":"调试技巧","slug":"调试技巧"},{"level":2,"title":"泛型","slug":"泛型"},{"level":3,"title":"泛型类","slug":"泛型类"},{"level":3,"title":"泛型方法","slug":"泛型方法"},{"level":3,"title":"泛型变量 T","slug":"泛型变量-t"},{"level":3,"title":"泛型代码","slug":"泛型代码"},{"level":3,"title":"使用限制","slug":"使用限制"},{"level":3,"title":"通配符类型","slug":"通配符类型"},{"level":3,"title":"反射与泛型","slug":"反射与泛型"},{"level":2,"title":"集合","slug":"集合"},{"level":3,"title":"集合接口","slug":"集合接口"},{"level":3,"title":"具体集合","slug":"具体集合"},{"level":3,"title":"集合框架","slug":"集合框架"},{"level":3,"title":"集合算法","slug":"集合算法"},{"level":3,"title":"早期集合","slug":"早期集合"},{"level":2,"title":"线程","slug":"线程"},{"level":3,"title":"线程基础","slug":"线程基础"},{"level":3,"title":"线程状态","slug":"线程状态"},{"level":3,"title":"线程属性","slug":"线程属性"},{"level":3,"title":"中断线程","slug":"中断线程"},{"level":3,"title":"线程同步","slug":"线程同步"},{"level":3,"title":"线程安全","slug":"线程安全"},{"level":3,"title":"异步计算","slug":"异步计算"},{"level":3,"title":"执行器","slug":"执行器"},{"level":3,"title":"同步器","slug":"同步器"},{"level":3,"title":"线程与 Swing:事件分配线程","slug":"线程与-swing-事件分配线程"},{"level":2,"title":"Self-Defined Class","slug":"self-defined-class"},{"level":2,"title":"常用工具类","slug":"常用工具类"},{"level":2,"title":"输入与输出","slug":"输入与输出"},{"level":3,"title":"输入","slug":"输入"},{"level":3,"title":"输出","slug":"输出"},{"level":2,"title":"正则表达式","slug":"正则表达式"},{"level":3,"title":"基本写法","slug":"基本写法"},{"level":3,"title":"Group RegExp","slug":"group-regexp"},{"level":2,"title":"Garbage Collection","slug":"garbage-collection"},{"level":3,"title":"Garbage Collection Optimization","slug":"garbage-collection-optimization"},{"level":3,"title":"GC Tools","slug":"gc-tools"},{"level":2,"title":"Java Naming Conventions","slug":"java-naming-conventions"},{"level":3,"title":"使用前注意事项","slug":"使用前注意事项"},{"level":3,"title":"包名的书写规范 (Package)","slug":"包名的书写规范-(package)"},{"level":3,"title":"类名的书写规范 (Class)","slug":"类名的书写规范-class"},{"level":3,"title":"变量的命名","slug":"变量的命名"},{"level":3,"title":"方法的命名","slug":"方法的命名"}],"relativePath":"language/java/javaBasicNotes.md","lastUpdated":1627196319000}',l={},t=s('

    Java Basic Notes

    CLI Tools

    编译

    javac name.java

    运行

    java name(无后缀类名)

    反汇编

    javap –c name(无后缀类名)

    打包

    jar {c t x u f} [v m e 0 M i][-c 目录] 文件名

    解释:

    • c:创建 jar 包
    • t:显示 jar 包内容
    • x:解压 jar 包
    • u:添加文件到 jar 包
    • f:命名 jar 包
    • v:显示详细执行过程报告
    • m:指定 manifest.mf 文件(对 jar 包做相关设置)
    • 0:打包 jar 包是不压缩
    • M:不产生 manifest.mf 文件,覆盖 m 参数的设置
    • i:创建索引文件
    • C:进入某目录后再执行 jar 命令
    • 生成 API 文档:java doc –d [ ] 类名/包名

    可选参数:

    • -author/-version:文档中显示作者和版本信息(默认不显示)
    • -link superlink 标准类名:为标准类添加超链接
    • -linksourse:方法/类名转化为超链接,指向生成的 html 格式的源文件

    Gradle Tool

    sudo apt install gradle\n\ngradle help\ngradle tasks\n\ngradle assemble\ngradle build\ngradle clean\ngradle test\ngradle jar\ngradle javadoc\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    Build Gradle

    apply plugin: 'java'\n\njar {\n    manifest {\n        attributes 'Main-Class': 'com.sabertazimi.tao.Tao'\n    }\n}\n
    1
    2
    3
    4
    5
    6
    7

    基本结构

    数据类型

    整型

    类型
    • byte 型:1 字节 -128~127
    • short 型:2 字节 -2^15~2^15 -1
    • int 型:4 字节 -2^31~2^31 -1(20 亿)
    • long 型:8 字节 -2^63~2^63 -1
    前/后缀
    • 二进制前缀 0b/0B
    • 八进制前缀 0
    • 十六进制前缀 0x/0X
    • 长整型后缀 l/L

    浮点型

    float 型

    后缀 F:4 字节 -3403E38~3.403E38(有效位数 6~7 位)

    float f = 1.2;    //ERROR\nfloat f = 1.2F;   //OK\n
    1
    2
    double 型

    后缀 D(默认型):8 字节 -1798E308~1.798E308(有效位数 15 位)

    科学计数法:指数均为十进制,符号为 e(尾数为十进制)/p(尾数为十六进制)

    Double.POSITIVE_INFINITY,Double.NEGATIVE_INFINITY,Double.isNaN(检数)

    千分位下划线分隔法 e.g 123_456.789_000

    字符型

    • 1 个 char 型占 2 个字节(Unicode 编码)

    • ’ ’(定界符)内可用八/十六进制转义字符表示字符

    • 八:\\xxx

    • 十六:\\uxxxx(\\u 转义序列可出现在任何地方) e.g ‘\\u0061’

    改进的 Unicode 字符集:

    • 代码点(前缀 U+)分为 17 个代码级别(code plane)
    • 第一个级别为经典 Unicode 代码,
    • 其余附加级别 U+10000 至 U+10FFFF。

    布尔型

    只允许赋值为 true、false(不可取 0 或非 0 值),不可与整型相互转换

    引用类型

    数组(Array)

    字符串 String:不可变性(需要修改变量名所引用值,必须重新创建一个 String 对象例)

    旧的对象实例若被判定为垃圾便会被系统自动回收

    类(Class)
    接口(Interface)

    常量

    定义(随使用随定义)

    运算符

    短路与、短路或

    • &&:第一个操作数为假不再向后运算
    • ||:第一个操作数为真不再向后运算

    移位符

    有符号右移>>:最高位补符号位 左操作数 int/long,右操作数 mod32/mod64

    e.g int a >> 33 即 int a >> 1

    无符号右移>>>:最高位补 0

    字符串连接运算符

    +: 左右操作数 String 字符串/其他类型(自动被转化为 String)

    判断运算符

    ==:

    • 基本类型值相等,引用类型引用相等
    • 基本类型:转换后比较;boolean 型不与 int 型比较
    • 引用类型:指向两个不同对象实例的变量不相等;若判断两个对象实例内容是否相等,必须调用 equals()方法

    强制类型转换运算符

    ()

    • 只能在继承层次内进行强制类型转换(同一家族)
    • 将父类转换为子类前,应使用 instanceof 运算符进行检查

    字符串

    子串

    stringTest.substring(a, b)方法返回长度为 b-a 的子串,a(包括)、b(不包括)为起止位置

    相等

    • 内容相等:stringOne.equals(stringTwo)方法返回值 true/false
    • 不区分大小写 equalsIgnoreCase

    代码点<代码单元(单字符)

    常用方法

    构建字符串

    StringBuilder 类:单线程,功能同 StringBuffer 类(多线程)

    输入输出

    Scanner 类

    监视器,功能最强大的输入类,new Scanner(System.in)

    格式化输出方法

    System.out.printf(): 静态创建格式化字符串

    文件的输入与输出

    输入(至内存)

    用 File 对象构造一个 Scanner 对象:new Scanner(Paths.get(“FileName”))(反斜杠需双写)

    输出(至文件)

    用文件名构造一个 PrintWriter 对象: new PrintWriter(“FileName”), 之后调用System.PrintWriter.print方法.

    表达式

    • 整数提升:算术运算前 byte,short,char 提升为 int
    • 没有”,”运算符和表达式语句

    控制流程

    合法语句:赋值语句和方法调用语句

    块作用域

    • 不允许内层块与外层块变量同名(无 C 语言中的可见性)
    • 块内声明变量不允许在块外使用:if 块、for 块、while 块、普通 block

    switch 语句

    case 标签变量类型:字符型(包装类)、三整型(包装类)、枚举常量、字符串类

    loop 语句

    循环五要素
    • 初始化部分(init_statement);
    • 循环条件部分(test_explanation);
    • 循环体部分(body_statement);
    • 迭代部分(alter_statement):自加/自减运算符改变条件变量
    • 结束后处理
    for each 循环
    //只读遍历;变量age只作用于for循环体\nfor (int age : arrayName) {}\n
    1
    2

    Break and Continue Statement

    Break Statement
    label:\n{\nbreak label;\n} //可跳出任意语句块:跳至标签块末尾\n
    1
    2
    3
    4
    Continue Statement
      label:\n  {\ncontinue label;\n} //跳至循环块首部\n
    1
    2
    3
    4

    大数值

    • java.math.BigInteger
    • java.math.BigDecimal

    数组

    定义+引用

    • 类型(包括类/对象) + [] + 标识符

    • 类型(包括类/对象) + 标识符 + []

    • int a[N] 非法 数组是引用类型

    • 不可对数组名进行自增操作(尽管[]与*具有类似作用)

    初始化

    • 默认初始化数值类型为 0/false,引用类型为 null
    • 使用 new 分配内存单元

    两种不同初始化方式:

    • 声明时:MyDate[] dates = {new MyDate(),……};
    • 赋值时:MyDate[] dates = new MyDate[] (匿名数组){new MyDate(),…..};

    方法

    • 属性:arrayName.length
    • 打印:arrays.toString 方法
    • 复制:arrayName.Copy( source, 0, destination, 0, source.length);
    Arrays.copyOf(ArrayName, Array.length); //可用来增长数组长度\n
    1
    • 比较:Arrays.equals(type[] a,type[] b);

    命令行参数

    字符串数组 String[] args, args 数组不包括程序名.

    排序

    Arrays.sort(ArrayName)快速排序方法

    多维数组

    • 多维数组的声明和初始化应按从高维到低维的顺序进行
      • 声明&初始化 int[][] t = new int[3][];
      • 子数组交换 temp = a[i];a[i]=a[i+1];a[i+1]=temp;
    • 子数组长度可不一致:可先构造一维长度,再使用循环构造子数组各自长度

    对象与类

    面向对象的三大特征

    封装性

    • 模块化+信息隐蔽(隐藏细节(private),只提供受保护的访问接口(public))
    • 只可通过方法改变对象实例的状态(State)(Instance Field)

    继承性

    父类和子类共享数据和方法(提高代码重用率和可维护性)

    • 可继承成员:公有域、公有方法
    • 不可继承成员:私有域、静态域、实例域初始化块、私有方法、静态方法、构造器方法

    多态性

    不同的对象收到同一个消息(method 调用)可产生不同效果(由对象内封装的细节决定)

    • 编译时多态:重载(Overload)

    • 运行时多态:覆盖(Override)

    • 根据对象实例的类型进行动态绑定(Dynamic Binding)

    • 虚方法调用(Virtual Method Invoking) :

      • 在调用方法时,程序会正确地调用子类对象的方法
      • 无法进行虚方法调用情况
    • static 的方法:以声明类型(标识符前的类型)为准,无关实例类型

    • final/private 方法:子类无法覆盖/继承父类同名方法,不存在虚化问题

    完整的 Java 源文件

    package packageName;              //指定文件中的类所在的包,0个或1个\nimport packageName.[className|*];   //指定引入的类/API,0个或多个\npublic classDefinition                 //属性为public的类定义,0个或1个\ninterfaceDefinition and classDefinition  //接口或类定义,0个或多个\n
    1
    2
    3
    4

    Behavior State and Identity

    预定义类

    Constructor

    Georgia Calendar

    用户自定义类

    完整的类定义

    [public] [abstract|final] class className[extends superclassName]\n[implements interfaceNameList] {\n\n//成员变量声明,可为多个:\n//实例域一般添加private修饰符,保持封装性\n[public | protected | private] [static] [final] [transient] [volatile]type variableName;\n\n//方法(包括构造方法)定义及实现,可为多个\n[public | protected | private] [static] [final | abstract] [native] [synchronized]\nreturnType methodName( [paramList] ) [throws exceptionList]{\n    statements;\n  }\n}\n\nclass Class_Name{\n   int/String characteristic;   //状态(State):变量(实例域 instance field)\n   constructor(){};             //标识(Identity):构造器(constructor)\n   void function(){};           //行为(Behavior):函数(方法method)\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    访问器方法(Accessor Method)

    只访问实例域不进行修改的方法

    returnType get() {\n    //保持封装性\n    //返回引用类型对象时,必须返回克隆体对象引用而不是实例域对象引用\n  return instanceFieldVariable.clone();\n}\n
    1
    2
    3
    4
    5

    更改器方法(Mutator Method)

    修改实例域的方法

    e.g add、set

    方法 Method

    方法参数

    Java 所有普通方法的参数传递方式:值传递

    • 基本类型:传递值的拷贝

    方法中无法更改原变量的值

    • 引用类型:传递引用的拷贝

    方法中无法更改原变量的引用(指针指向),只可更改引用对象的状态(State)

    方法标签(Signature)

    • 方法名称
    • 方法参数

    方法返回值类型不是方法标签(不存在同名同参而不同返回值的方法)

    对象构造

    构造器方法完整定义:

    ClassName (ClassPropertiesVariableTable) {\n    //进行输入参数合法化检查\n    Property n = Variable;\n    Statement Block;\n}\n
    1
    2
    3
    4
    5

    构造器方法的定义

    • 未定义任何构造器方法 系统会自动产生一个构造器方法,称为无参空默认构造器方法(default constructor) 并将所有实例域初始化为默认值
    • 注意事项
      • 不应在构造器中定义实例域同名变量
      • 在构造器中尽量只调用 final/private 方法(不会(继承后)被子类方法覆盖)
      • this()可调用此类的其他构造方法,this()必须位于构造器方法首行

    构造器方法的执行

    • 构造器方法前语句/语句块将先于构造器执行
    • 编译器会在编译时在每个构造器方法内首行自动添加 super();(若父类没有无参构造器方法编译出错)/人工显式调用父类构造器方法,直至实现 Object 类(超类)的构造器方法,再执行构造器方法语句

    导入 import

    • 包的导入
    import java.包路径.*   //导入指定包的所有类\n
    1
    • 静态导入
    import static java.包路径.类名.*  //导入指令类的所有静态域和静态方法\n
    1

    类路径

    package 语句

    文档注释

    Java 除了可以采用我们常见的注释方式(//、/* */(二型注释不可嵌套))之外,Java 语言规范还定义了一种特殊的 Javadoc 注释:

    /**\n*@author    对类的说明              标明开发该类模块的作者\n*@version   对类的说明              标明该类模块的版本\n*@see      对类、属性、方法的说明  参考转向,也就是相关主题\n*@param    对方法的说明            对方法中某参数的说明\n*@return    对方法的说明             对方法返回值的说明\n*@exception 对方法的说明            对方法可能抛出的异常进行说明\n*@Override   对方法覆盖的说明\n*@FunctionalInterface 函数式接口:包含不超过一个abstract方法(可以有其他非abstract方法)\n*/\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    类注释:位于类定义前

    /**\n*整体性描述\n*\n* @author 作者\n* @version 1.0, 05/22/07\n* @since version1.0\n*/\n
    1
    2
    3
    4
    5
    6
    7

    方法注释:位于方法定义前

    /**\n*整体性描述\n*\n*@param             对方法的说明            对方法中某参数的说明\n*@return            对方法的说明             对方法返回值的说明\n*@exception/throws 对方法的说明            对方法可能抛出的异常进行说明\n*/\n
    1
    2
    3
    4
    5
    6
    7

    域注释:位于实例域定义前

    /**\n * 备注信息\n */\n
    1
    2
    3

    通用注释

    可在文档中看到引用(文本、类/方法/变量、超链接)

    • @see/@link package.class#feature label
    • @see/@link <a href = “……”> label </a>
    • @see/@link “text”

    区别: link 注释可在任意位置,see 注释需在类/方法/变量定义前

    包注释

    新建 package-info.java 源文件:

    package 包路径\n/**\n * 包注释\n */\n
    1
    2
    3
    4

    类设计技巧

    数据私有化

    保持封装性

    数据初始化

    不依赖实例域默认值,且应进行数据合法化检查

    实例域封装化

    过多相关的基本类型实例域可封装成一个轻型类

    构造器多样化

    最低标准为显式无参构造器+一个带参数(包括合法化检查)构造器

    职责明晰化

    一个类的方法应与类本身紧密相关,且不过少也不过多

    继承

    父类与子类(superclass and subclass)

    属性的继承

    • 可继承:公有域
    • 不可继承:私有域、静态域、实例域初始化块
    • 若要访问(修改)父类私有域,必须使用调用公有的 super.get()方法得到父类私有域
    • 初始化父类私有域:super(ParamList); 调用父类构造方法进行初始化

    方法的继承

    • 可继承:公有方法
    • 不可继承:私有方法、静态方法、构造器方法

    方法的覆盖

    标签相同(不可降低父类方法可见性)

    方法的重载

    标签不同,属于新加方法

    super 关键字

    不是隐式参数,是提示编译器执行的特殊关键字

    父类与子类的转换(Is-A 关系)

    Subclass must be superclass,superclass may not be subclass.

    • 可将子类引用赋值给父类变量(Upcasting)或替换父类作参数
    Person p = new Student();  //p仍是父类变量\n
    1

    注:若父类变量和子类变量引用同一个子类对象实例时,父类某些操作可能引起内存混乱 例如:先调用父类构造器方法构造子类,再调用子类扩展方法访问子类扩展私有域(根本未分配内存空间)

    • 不可将父类引用赋值给子类变量
    Student s = new Person();  //ERROR:e.g. s.getStuID();\n
    1

    Object 类

    Equals Method

    • 子类中覆盖(@override)父类 equals 方法:super.equals(superClassName other);
    • 显式参数名:Object otherObject
    • if (this == otherObject) return true;
    • if (otherObject == null) return false;
    • if (getClass != otherObject.getClass()) return false;
    • ClassName other = (ClassName) otherObject;
    • return field == other.field

    Hash Code Method

    • String 类 hashCode:ΣStringChar[i]^(n-i-1), (i:0~(n-1))
    • Object 对象 hashCode:内部 ID(存储地址)
    • 若重写 equals 方法,也应重写 hashCode 方法,使对象实例 hashCode 分布散列化
      • return 各域 hashCode 值加权和:31x+y rule
        • 引用类型、包装类:hashCode()
        • 数组:Arrays.deepHashCode()
      • return Objects.hash(field1,..,fieldN); //自动组合各域 hashCode
      • hash 值:return (key.hashCode() & 0x7fffffff) % M;

    To String Method

    • 设计 return getClass().getName() + ”[“ + field + ”]”;
    • Object 类 toString 方法:用于输出 ClassName 和 hashCode
    • 数组直接继承 Object 类 toString 方法,输出数组需调用 Arrays.(deep)toString();
    • 自动调用:+ 字符串连接符、println(obj)

    泛型数组列表

    ArrayList<ClassName> VariableName = new ArrayList<>();

    • toArray(ArrayName)转化为同类型普通数组存至 ArrayName:可以创建一个 ArrayList,再转化为数组,方便使用[]下标操作
    • 插入、删除操作时间复杂度高(数据元素左/右移)

    对象包装器与自动装箱

    Void,Boolean,Byte,Character,Short,Integer, Long, Float, Double 类:包装器(Wrapper)类

    父类:Number

    final 类(强不可变类):无子类,不可改变数

    编译器特性

    • 自动装箱(auto-boxing)
    Integer I = 10;\nmyArrayList.add(10);\n
    1
    2
    • 自动拆箱(auto-unboxing)
    int i= I;\n
    1
    • 自动装箱+拆箱
    Integer I = 0;I++;\n\n// 实际译为:\nInteger I = Integer.valueOf(10);\nmyArrayList.add(Integer.valueOf(10));\nInt I =  I.intValue();\n
    1
    2
    3
    4
    5
    6

    API 说明

    可变参数方法

    枚举类

    定义

    扩展

    访问控制符

    public>protected(包作用域+)>默认(包作用域)>private(类作用域)

    最大限度:不同包的非子类(所有类)、同一个包/不同包的子类、同一个包、同一个类

    非访问控制符

    abstract

    abstract 方法

    语法形式:abstract + MethodName(ParamList);

    abstract 类
    • 定义
      • 若一个类包含 abstract 方法,则必须是 abstract 类
      • 一个 abstract 类可以不包含 abstract 方法
      • 一个 abstract 类可以包含具体数据和具体方法
    • 构造器方法
      • 需要实现构造器方法
      • 构造器方法可以被非 abstract 子类调用
      • 不能使用 new 构造 abstract 类对象实例

    final

    final 局部变量(方法内的变量)

    只读常量,必须进行一次初始化

    final 实例域
    • 必须进行一次(类定义/构造器)初始化
    • final 引用类型实例域的引用不可更改,但所引用对象的状态(State)可被更改
    final 方法

    可继承,不可重写

    final 类
    • 不可继承
    • 实例域可以不是 final 实例域,方法自动成为 final 方法

    static

    static 实例域(类域)
    • 属于类整体,保存在类的内存区域的公共存储单元(不可继承)
    • 可通过类名/对象实例名访问该属性
    static 方法
    • 类方法,属于类整体(不可继承)
    • 没有隐式参数(this/super)
    • 只能处理该类中的 static 实例域/调用该类中的 static 方法
    • 既可通过类名调用该方法(推荐),又可通过对象实例名调用 static 方法
    • Tips:工厂模式:利用 static 方法可模拟构造器方法:可自定义构造器名和返回对象类型

    static final 实例域

    • 默认初始化(数值型为 0,布尔型为 false,引用型为 null)
    • 常结合 public 将变量设置为全局静态常量 e.g. e、PI

    反射(Reflection)

    反射机制

    • 运行中分析 类的能力
    • 运行中查看对象
    • 实现通用的数组操作代码
    • 利用 Method 对象

    Class 类

    分析类的能力

    分析对象

    泛型数组实现

    调用任意方法(函数指针)

    接口与内部类

    接口

    基本定义

    interface 类型是引用类型

    常量 + 方法

     [修饰符(public)]interface 接口名 [extends 父接口名列表(多个接口)] {\n//常量声明,可为多个\n[public] [static] [final] type constantName= Value;\n//方法声明,可为多个\n[public] [abstract] returnType methodName( [paramList] );\n}\n
    1
    2
    3
    4
    5
    6

    接口方法

    自动默认:public abstract 方法(声明时无需关键字)

    实现接口

    在类中必须实现(override)接口中的所有方法

    接口作为方法参数

    • 设计此类方法时:
      • 可调用接口中公有静态常量/公有方法(interfaceVariableName.invokeMethod)
      • 可将接口参数传递给其他接口作参数的方法,调用其他方法
    • 实际调用方法时:将实现了该接口的类作为参数传递给方法,可提高方法的灵活性

    例子:Comparable 接口和 sort 静态方法

    接口变量

    • 不可创建 interface 实例(即不可用 new 关键字)
    • 可声明一个 interface 变量,并使其引用实现了该接口的对象实例
    //TimePrinter:实现了ActionListener接口的类\nActionListener myListener = new TimePrinter();\n
    1
    2

    对象克隆

    Cloneable Interface

    标签接口(tagging interface)之一:无方法

    Object Clone Method

    浅拷贝: 无法克隆目标对象实例域中的对象成员

    Custom Clone Method

    鉴于默认 clone 方法的局限性,需自定义用户需要的 clone 方法

    • 实现接口:implements Cloneable
    • 改变可见性&抛出异常: public <returnType> clone() throws CloneNotSupportedException {};
    • 自定义克隆体:克隆子对象

    回调

    回调设计模式

    某个特定事件发生时采取某个特定动作

    Action Listener Interface

    内部类

    内部类调用格式

    • 声明与构造(实例化)

    OuterClass.InnerClass variableName = OuterClass/this.new InnerClass();

    • 定义:应使用 private 关键字

    • 访问实例域/方法

    内部类:this.fieldName/methodName 外部类:OuterClass.this.fieldName/methodName

    局部内部类

    • 定义在方法中的内部类
    • 修饰符:无/abstract/final
    • 可访问外围类成员/final 局部变量

    匿名内部类

    在实际构造父类/实现接口时定义在构造器方法中的内部类

    • 外围为父类:内部类需要扩展该父类
    new SuperType (construction parameters)\n{\n    inner class methods and data{};  //直接定义实例域和方法,构造器参数传递给父类构造器\n}\n
    1
    2
    3
    4
    • 外围为接口:内部类需要实现该接口
    new InterfaceType () //一对括号\n{\n    Inner class methods and data{};  //需实现接口中的所有抽象方法\n}\n
    1
    2
    3
    4
    • 例子:积分、线程、回调函数(HookFunction)、事件处理(ActionListener)

    静态内部类

    • 只可访问外围类的静态域/静态方法(可视作不可访问外围类)
    • 实例化:new OuterClass.InnerClass()

    代理类

    图形程序设计

    Swing 组件继承层次

    Swing 组件功能层次

    JFrame

    框架基础

    位置和大小

    • 方法概览
    //继承于:Component类\n//功能:设置JFrame的位置和大小\n//坐标:相对于电脑屏幕\nsetLocation(x, y);\nsetBounds(x, y, width, height);\nsetLocationByPlatform(true);\n
    1
    2
    3
    4
    5
    6
    • 动态设置
    //得到屏幕大小\nDimension screenSize = Toolkit.getDefaultToolKit().getScreenSize();\nint screenWidth = screensSize.width;\nint screenHeight = screenSize.height;\n//根据屏幕大小设置框架大小\nsetSize(screenWidth / 2, screenHeight / 2);\nsetLocationByPlatform(true);\n
    1
    2
    3
    4
    5
    6
    7

    Property Getter and Setter

    • 标题
    //继承于:Frame类\n//功能:标题属性\npublic String getTitle();\npublic void setTitle (String title);\n
    1
    2
    3
    4
    • 定位
    //继承于:Window类\n//功能:定位属性\npublic boolean isLocationByPlatform();\npublic void setLocationByPlatform (boolean b);\n
    1
    2
    3
    4
    • 标题图标
    Image img = new ImageIcon(“icon.gif”).getImage();\nsetIconImage(img);\n
    1
    2
    • 其他属性

    自定义绘制组件

    所有绘制都使用 Graphics 类作参数(包含绘制图案、图像、文本等的方法)

    JComponent Extends

    class MyComponent extends JComponent\n{   //@override\n    public void paintComponent (Graphics g)\n    {\n        g.drawString(text, x, y);\n    }\n    //@override\n    public Dimension getPreferredSize()\n    {\n        return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT)\n    }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    JPanel Extends

    class MyJPanel extends JPanel\n{\n    public void paintComponent(Graphics g)\n    {\n        super.paintComponent(g);\n        code for drawing;\n    }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8

    Shape Interface

    图形类继承关系图

    图形颜色

    • Color 类预定义颜色(Color.XX)
    • SystemColor 类预定义颜色(SystemColor.XX)

    事件处理

    定义与基础

    事件源与事件监听器

    实现 Action Listener 接口的事件监听器

    适用情况
    • 按钮点击事件(click button)
    • 鼠标双击选择列表框某一选项
    • 选择某一菜单项
    • 文本域键入回车键
    • 组件达到指定时间间隔
    事件监听器对象执行其他对象事件源产生事件影响

    此时,可使用匿名内部类或 Lambda 表达式简化代码

    .addActionListener(new ActionListener()\n{\npublic void actionPerformed(ActionEvent event)\n{\n//code for procedure\n}\n});\n
    1
    2
    3
    4
    5
    6
    7

    .addActionListener( (e) -> {\n//code for procedure\n});\n
    1
    2
    3

    Event Handler Class

    Adapter Class

    此类实现相应接口所有方法,但每个方法方法体皆空;简化 Listener 实现,只需重写所需方法

    .addWindowLister(new WindowAdapter()\n{\n    //重写所需方法\n});\n
    1
    2
    3
    4

    动作

    Action and Abstract Action

    Action 接口可连接多个事件源,AbstractAction 类是实现该接口的类(可继承此类编写动作)

    基本方法

    • actionPerformed:继承于 ActionListener 接口
    • enabled:启用/禁用动作
    • value:动作对象中的任意名/值 e.g.Action.NAME,“按键名称”
    • key 为动作属性的名称,value 为对应具体属性(如 String、ImageIcon)
    • propertyChangeListener:将动作对象属性变化传给监听器,再传给其他组件对象

    动作与点击按钮

    • 将自定义动作与按钮关联
    • JButton 构造器:JButton(Action act);

    动作与按键映射

    • 每个组件有三个输入映射和一个动作映射
    • 建立输入映射(三种方式得到(次)顶层组件的输入映射)
    InputMap imap = panel.getInputMap(JComponent.InputMapFlag);\n
    1
    • 关联输入映射和动作映射:put 方法含有两个参数
    imap.put(  KeyStroke.getKeyStroke(“ctrl Y)  ,  Object actionMapKeyName );\n
    1
    • 建立动作映射
    ActionMap actionMap = panel.getActionMap();\n
    1
    • 关联动作映射和动作:put 方法含有两个参数
    actionMap.put(Object actionMapKeyName  ,  Action act);\n
    1

    注:将 Object 设为 String ”none” 时 表示 空动作(按键无效)

    鼠标事件

    AWT 事件继承层次

    事件类

    • 语义事件类(semantic):

    ActionEvent、AdjustmentEvent、ItemEvent

    • 低级事件类(low-level)

    FocusEvent、MouseEvent、MouseWheelEvent、KeyEvent、WindowEvent

    事件处理 监听器接口

    事件处理 适配器类

    • FocusAdapter
    • MouseAdapter
    • MouseMotionAdapter
    • KeyAdapter
    • WindowAdapter

    Swing 组件

    Awt 和 Swing 设计中的设计模式

    Composite Pattern

    将对象组合成树形结构以表示”部分-整体“的层次结构,使得用户对单个对象和组合对象的使用具有一致性

    容器与组件(具有共同接口) - 容器与组件具有层次结构,用户可对容器与组件实施同样的操作(点击、删除、输入等)

    Decorator Pattern

    保持接口,增强性能

    以对客户透明的方式动态地给一个对象附加上更多的责任(对象前后本体未变化)

    • 抽象组件(Component)角色: 给出一个抽象接口,以规范准备接收附加责任的对象(透明不变性)
    • 具体组件(ConcreteComponent)角色: 定义一个将要接收附加责任的类(透明不变性)
    • 装饰(Decorator)角色:
      • 持有一个组件对象的实例
      • 定义一个与抽象构件组件接口一致的接口
      • 添加额外功能

    具体装饰(ConcreteDecorator)角色: 负责给组件对象“贴上”附加的责任

    带滚动条的面板 Component:面板,Decorator:滚动条

    Strategy Pattern

    动态改变行为

    定义了不同的算法族,并且之间可以互相替换

    • 环境对象:实现了抽象策略接口或者引用了具体策略类
    • 抽象策略接口/类:接口/抽象类,环境对象中变化部分
    • 具体策略类:实现了抽象策略接口,可有多个不同的具体策略类(动态变化)

    设计原则: 把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口

    布局管理器 环境对象:面板,抽象策略:抽象布局管理接口,具体策略:具体布局管理类

    Model View Controller Pattern

    • 组件三要素:外观、内容(状态)、行为
    • 模型类:存储内容(状态) state getter/setter
    • 视图类:显示内容(状态)对应外观 一个模型可以有多个视图(模型的不同部分/形式)
    • 控制器类:处理用户输入事件(点击鼠标、敲击键盘),改变模型类/视图类状态,调用模型类/视图类中方法

    一个模型类可以适用多个组件(如 DefaultButtonModel 是多种 Button 包装器类的模型对象):

    几乎所有组件都有一个带后缀 UI 的视图对象;不是所有组件都有一个专门的控制器对象

    简单布局管理器

    Flow Layout Class

    逐行填充组件,可设置对齐方式和组件间距

    Border Layout Class

    改变面板大小时,只有中央组件大小变化

    技巧:可在五个区块内添加子面板

    frame.add(panel, BorderLayout.CENTER/NORTH/SOUTH/WEST/EAST)\n
    1

    Grid Layout Class

    组件按行列排列,且大小一致(只能逐行逐列添加组件)

    复杂布局管理器

    Grid Bag Layout Class

    没有行列大小和个数限制的网格布局:行列大小可不一致,可合并相邻行/列(合并单元格)

    gridBagPanel.add(component, GridBagConstraints);给每一个组件都构造一个 GridBagConstraints 类

    基本步骤
    • 画框图
    • 设置 gridXX 四值
    • 设置 fill/anchor 值、
    • 设置增量 weightx/weight
      • 全部 100:行列可随容器大小变化
      • 设置某一行/列所有 weightx/weighty 为 0:此行/列保持默认大小

    e. gridBagPanel.add(component, GridBagConstraints);

    Group Layout Class

    通过(嵌套)组的水平与垂直计算(间距与组件),实现灵活的布局:

    • GroupLayout 类
    • Group 类
    • ParallelGroup 类
    • SequentialGroup 类

    Null Layout

    Custom Layout

    实现 LayoutManager 接口,自定义 setSizes(Container parent)

    在 layoutContainer 方法中调用每个组件的 setBounds 方法,摆放组件

    文本组件

    JTextComponent 抽象类

    文本域

    • JTextField 组件

    标签

    • JLabel 组件: 标签无法响应用户输入事件,只提供标识功能

    密码域

    • JPassWordField 组件

    文本区

    • JTextArea 组件

    滚动窗格

    • JScrollPane: 将文本区组件/其他组件插入到滚动窗格中, 可实现文本区/其他组件的滚动.

    选择组件

    复选框

    • JCheckBox 组件, 勾取选项(可自定义选项标签):勾选/不勾选状态
    .addActionListener( if ( .isSelected() ) {……});\n
    1

    多个复选框可共用一个监听器,通过 isSelected 方法检测不同复选框的状态

    单选按钮

    • ButtonGroup 对象负责调度任务:保证只有一个 JRadioButton 对象被按下
    • JRadioButton 对象:add 至 JPanel 对象,add 至 ButtonGroup 对象,addActionListener 注册监听器

    边框

    在面板/子面板(TextPanel、ButtonPanel 功能区等) 调用 setBorder 方法填充边框

    组合框

    JComboBox 组件,泛型类, 下拉选框(N 个选项 Item),.addActionListener(getItemAt(getSelectedIndex()))

    滑动条

    JSlider 组件, 可连续选择数值:

    .addChangeListener(new ChangeListener()\n{\n    public void stateChanged(ChangeEvent event)\n    {\n        JSlider source = (JSlider) event.getSource();\n        int Value = source.getValue();\n        code for operating;   //with Value\n    }\n});\n
    1
    2
    3
    4
    5
    6
    7
    8
    9

    菜单组件

    创建菜单

    JMenuBar –> JMenu -> JMenuItem

    利用 Action 创建 MenuItem:(调用 insert 方法)

    Action exitAction = new AbstractAction (Exit) //MenuItems text goes here\n{\n    public void actionPerformed (ActionEvent event)\n    {\n        code for action;\n    }\n};\n
    1
    2
    3
    4
    5
    6
    7

    图标菜单项

    • JMenuItem 类扩展 AbstractButton 类
    • 同样地,JMenuItem 类构造器/Action.putValue(Action.SMALL_ICON,……);

    单选按钮/复选框菜单项

    将 MenuBar 视作 JPanel 即可

    弹出菜单

    JPopupMenu 组件, 不依附于 MenuBar 的浮动菜单(Window 系统下右键弹出菜单)

    快捷键

    • 同样地,两个方式:MenuItem 类构造器/Action.putValue(Action.MNEMONIC_KEY,……);
    • 加速器:不打开菜单项即可起作用的快捷键(如 Ctrl+……),关联 JMenuItem

    启用/禁用菜单项

    工具栏

    • 同样地,JToolBar 构造器/Action.putValue(Action.SHORT_DESCRIPTION);

    对话框(顶级框架)

    • 模式对话框:弹出时不允许用户作其他交互
    • 无模式对话框:弹出时允许用户作其他交互(如工具栏)

    选项对话框

    • JOptionPane 组件

    自定义对话框

    • 在构造器中调用超类 JDialog 构造器方法
    • 添加对话框的用户界面组件
    • 添加事件处理器
    • 设置对话框大小

    文件对话框

    • JFileChooser 组件插入对话框
    • 文件选择器
    • 文件过滤器:可添加文件视图类

    颜色对话框

    • JColorChooser 组件插入对话框

    异常、断言、日志、调试

    处理错误

    异常分类

    • 已检查异常:需要抛出声明(非 RuntimeException)
    • 未检查异常:不可控(Error)/可避免(RuntimeException:下标越界等)
    • 子类覆盖父类方法(该方法)抛出必检异常数必须少于父类方法

    捕获异常

    原则:捕获知道如何处理的异常,传递不知如何处理的异常

    捕获多个异常

    • 普通形式
    try\n{\n    语句组(可能抛出异常的语句:抛出异常后,try语句块直接终止)\n}\ncatch (匹配Exception ex)\n{\n    子子异常类名 异常处理语句组;\n}\ncatch (匹配Exception ex)\n{\n    子异常类名 异常处理语句组;\n}\ncatch (匹配Exception ex)\n{\n    父异常类名 异常处理语句组;\n}\n[ finally\n{\n    必定(即使try return)会被执行异常处理语句组:用于释放资源,不能捕获异常\n}]\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    catch:0~n, finally:可选项(无论是否有 break/return,都会被执行多遍)

    • 更好的形式
    try\n{\n    try\n    {\n        code that might throw exceptions{};\n    }\n    finally\n    {\n        in.close();\n    }\n}\ncatch (IOException e)\n{\n    show error message{};\n    throw exception{};\n    throw new exception{};\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    • 常用 catch 处理语句
    System.out.println(Error+ e);\nSystem.out,println(Cause+ e.getCause());\nthrow e;\nthrow new Exception(String)/(String, e);\n
    1
    2
    3
    4

    重抛异常

    • 将当前捕获的异常再次抛出:throw e;
    • 重新生成并抛出一个新异常(沿调用堆栈传递)
      • throw new Exception("some message");
      • throw new Exception("some message",e);
      • 将原始异常作为新异常的 initCause
    catch (SQLException e)\n{\n    Throwable se = new ServletException(“database error”);\n    se.initCause(e);\n    throw se;\n}\n
    1
    2
    3
    4
    5
    6

    上级便可通过 se.getCause()方法得到原始异常

    关闭异常:关闭频率低/不可能发生的异常

    catch 语句体为空,便可关闭捕获的异常

    记录日志

    调试技巧

    使用断言

    assert 表达式:字符串信息

    JUnit 框架单元测试

    import static org.JUnit.Assert.*

    为每个类构置一个 main 方法进行单元测试

    日志代理

    Logger.getGlobal().info(" ……" + targetVariableName);

    Stack Trace

    • Throwable.PintStackTrace

    GUI 调试

    泛型

    泛型类

    自定义类型 Class Person<T> {}

    泛型方法

    自定义方法 [修饰符] <T> T PeronMethod(Param) {}

    泛型变量 T

    <T extends SuperClass & Interface>\n
    1

    类型变量用“,”分隔,限定类型用“&”分隔(一个父类+多个接口)

    <T extends Comparable & Serializable>\n
    1

    泛型代码

    翻译关键:擦除类型参数,用 Object/限定类型代换

    • 虚拟机中没有泛型
    • 多态性:合成桥方法
    • 类型安全性:必要时插入强制类型转换

    使用限制

    • T 类型变量:不可为基本类型,必须为引用类型
    • 类型查询(getClass()/instanceof):返回原始类型(如 Person),不返回 T 类型
    • 不可创建参数化类型的数组(如 Person<T>[])
    • 不可实例化类型变量(如 new T()、new T[])
    • 不可在静态域/方法中引用类型变量(如 private static T variableName)
    • 泛型类不可扩展 Throwable 及其子类(因此泛型类不可被抛出/捕获)

    通配符类型

    <? extends SuperClass>\n<? super SubClass>\n
    1
    2

    反射与泛型

    集合

    集合接口

    Collection Interface

    Abstract Collection

    将 size 和 iterator 抽象化,将 contains、toString 具体化

    迭代器
    • 工作位置: 迭代器位于两元素间
    • 工作机制
      • previous 方法:迭代器越过前一元素,并将该元素的引用作为返回值
      • next 方法:迭代器越过下一元素,并将该元素的引用作为返回值
    • 工作方法
      • add 方法:将新元素的引用插入至迭代器当前位置
      • remove 方法:与 previous/next 相互依赖,删除前一次越过元素(不可连续调用 remove 方法)
      • next->( remove )->next->remove
    • 使用原则
      • 给容器附加多个只读迭代器,单独附加唯一一个读写迭代器
      • 并发修改检测: 只检测结构性改变(改变长度),不检测数值性改变(如 set 方法)
    Iterable Interface

    任何实现了 Iterable 接口及其子接口(如 Collection 接口)的对象都可使用 for each 循环

    public interface Iterable<E>\n{\n    Iterator<E> iterator();\n}\n
    1
    2
    3
    4

    Queue Interface and Deque Interface

    Deque extends Queue extends Collection)

    具体集合

    数组列表

    ArrayList implements List:

    • 随机访问:利用索引值访问元素
    • get/set(int Index)方法:效率高

    链表

    LinkedList implements List,Deque:

    • 非随机存取:必须从头/尾开始遍历链表访问元素
    • E get(int Index)方法:效率极低

    ListIterator:

    • add 方法:依赖于迭代器位置
    • remove 方法:依赖于迭代器状态
    • previousIndex 方法:返回迭代器前一元素的整数索引
    • nextIndex 方法:返回迭代器后一元素的整数索引

    散列集

    HashSet implements Set:无序无重复元素集,基于 HashTable

    • 散列表:列表/链表数组(多个列表/链表),每个列表/链表成为桶(bucket)
      • 元素的桶的整数索引:元素散列码 mod 桶的总数(余数)
      • 桶数:预计元素个数的 75%~150% e.g 标准类库桶数为 2 的 n 次方,默认值 16
      • 散列冲突(hash collision):目标桶已满
      • 再散列(rehashed):创建大通数(如双倍桶数)的新散列表,丢弃原散列表
      • 装填因子(load factor):再散列时机决定因素,一般为 0.75(75%桶中含有至少一个元素)
      • hash 值:return (key.hashCode() & 0x7fffffff) % M;
    • 方法
      • add:先查找对象存在性,不存在则添加元素
      • contains:重写方法
    • 散列集迭代器:依次访问所有桶

    树集

    TreeSet implements SortedSet,NavigableSet:有序集

    比较接口

    Comparable Interface
    // A<B负值,A==B零,A>B正值(B代表other)\npublic interface Comparable<T>\n{\n    int compareTo(T other);\n}\n
    1
    2
    3
    4
    5
    Comparator Interface
    // A<B负值,A==B零,A>B正值\npublic interface Comparator<T>\n{\n    int compare(T a, T b);\n}\n\nSortedSet<Item> setSortedByName = new TreeSet<>(Comparator comp)//实现比较器的类\n
    1
    2
    3
    4
    5
    6
    7

    队列

    • 双端队列: ArrayDeque 类与 LinkedList 类
    • 优先级队列: PriorityQueue 类, 未对所有元素进行排序
      • add 和 remove 方法: 引用最小元素

    映射表

    实现 Map 接口,未实现 Collection 接口

    • 散列/比较函数只作用于键 key
    • 添加/删除/检索对象时,必须提供键 key
    • 键 key 具有唯一性

    集合框架

    RandomAccess 接口:标记接口,无任何方法,标记一个集合是否支持高效的随机访问

    集合算法

    早期集合

    线程

    线程基础

    线程:分享 CPU、共享内存(多个线程访问同一数据/对象)

    线程一般用于需长时间执行的任务:循环、下载、浏览图片

    线程状态

    Create Thread

    创建线程的方法:

    • 父类:继承 Thread 类,重写 run 方法
    • 接口:new Thread(Runnable Task)实现 Runnable 接口的类:实名类/匿名类/Lambda 表达式

    Runnable Thread

    thread.start() 线程处于可运行状态:可能在运行,可能不在运行,不必始终保持运行

    Block Thread

    • blocked
    • waiting
    • timed waiting
    blocked

    获取锁不得时,进入阻塞状态

    waiting

    等待调度器时,进入等待状态

    timed waiting

    调用含超时参数的方法时,进入计时等待状态保持到超时或通知

    Object.wait、Thread.sleep、Thread.join、Lock.tryLock、Condition.await

    terminated

    run 方法正常退出或抛出未捕获异常时,进入(自然/意外)死亡状态

    线程属性

    优先级

    • 默认情况下继承父线程的优先级
    • 需防止低优先级线程被饿死(因此不要依赖优先级进行编程)
    • MIN_PRIORITY(1)~NORM_PRIORITY(5)~MAX_PRIORITY(10)
    • 每当线程调度器选择新线程时,首选具有较高优先级的线程

    Daemon Thread

    • Thread.setDaemon(true)
    • 设置为后台线程:随时可能中断
    • 虚拟机会在只有后台线程时退出,后台线程不可访问固有资源(文件、数据库等)

    未捕获异常的处理器

    实现 Thread.UncaughtExceptionHandler 接口

    不安装默认处理器时,默认处理器为空

    中断线程

    Interrupt Method

    对一个线程调用此方法时,线程将进入中断状态

    Interrupted Exception

    对一个阻塞线程(调用 sleep/wait 方法等)调用 interrupt 方法时,抛出此异常

    线程同步

    两个线程都有多个语句,无法保证一个线程所有语句全部执行完再调用另一个线程,必然会出现交错调用不同线程中的语句现象,导致调用混乱现象

    锁对象 (实例域)

    可重复(持有计数),可共用(共用锁对象的方法可互相调用)

    条件对象 (实例域)

    管理有锁却不能正常工作的线程

    一个锁对象可以有多个相关的条件对象

    内部锁

    • synchronized 关键字
    • 每个对象都有一个内部锁,可将静态方法声明为 synchronized
    • 等价于 wait/notifyAll
    • 等价于 await/signalAll

    截获内部锁

    读写锁

    监视器

    volatile 关键字:修饰实例域

    声明一个域可并发更新,通知编译器和虚拟器注意此特性

    死锁

    所有线程处于等待或阻塞状态

    e.g. 两个线程互相等待状态

    Thread Local Helper

    线程安全

    java.util.concurrent 并发 API:线程安全(同时只有一个线程调用某对象)

    原子整数

    AtomicInteger.getAndIncrement();     //cnt++;\nAtomicInteger.getAndDecrement();    //cnt—\nAtomicBooleanAtomicLongAtomicReference类\n
    1
    2
    3

    线程安全集合

    • 阻塞队列
    • 高效映射表、队列
    • 写数组列表和写数组集的拷贝 - CopyOnWriteArrayList 类、CopyOnWriteArraySet 类
    • 同步包装器(synchronization wrapper) - 任何集合类通过同步包装器变成线程安全集合类

    异步计算

    执行器

    线程池:创建大量生命周期短的线程

    • CachedThreadPool:提交任务多,创建新线程
    • FixedThreadPool:提交任务多,等待当前任务完成再运行其他任务
    • SingleThreadExecutor:逐一执行提交任务
    • ScheduledExecutorService 接口:预定执行/重复执行任务

    以上工厂方法返回:实现 ExecutorService 接口的 ThreadPoolExecutor 对象

    • 创建
    ExecutorService pool = Executors.newCachedThreadPool();\n
    1
    • 方法
    pool.execute(myTask);\npool.shutdown();\n
    1
    2
    • Future 对象用于查询任务完成情况

    同步器

    线程与 Swing:事件分配线程

    事件分配线程不应进行 input/output/sleep 调用(可能使线程阻塞)

    • Timer 类(亦是线程):每隔一段时间重复执行 MyTask
    • 更新图形化界面:SwingUtilities.invokeLater(Runnable MyTask);
    EventQueue.invokeLater(new Runnable()\n{\npublic void run()\n{\n    Statements;\n}\n});\n
    1
    2
    3
    4
    5
    6
    7
    • 指定布局(Layout)

    以下可合成一个方法:

    • 创建组件(Component)
    • 添加组件(getContentPane.add(Component) //得到 Container 类)
    • 响应事件(Event)
    • 设置属性(size、location、bounds、locationByPlatform、title、iconImage、visible、resizable、undecorated、extendedState)
    // 取得点击按钮的名字\nString itemName = ((JRadioButton) e.getSource()).getText();\n//Source:事件源(点击按钮事件)\n
    1
    2
    3

    Self-Defined Class

    @override:

    • equals
    • hashCode
    • toString
    • Comparable(compareTo)
    • Cloneable(clone)

    常用工具类

    • java.lang Java 语言的核心类库
    • java.util 实用工具
    • java.io 标准输入/输出类库
    • java.awt/javax.swing 图形用户界面(GUI)的类库
    • java.net 网络功能的类库
    • java.sql 数据库访问的类库
    • java.io 输入输出流

    输入与输出

    输入

    • InputStream 类:read(字节)
    • Reader 类:read(char)

    输出

    • OutputStream 类:write、flush、close
    • Writer 类:write(char,String)、flush、close

    正则表达式

    基本写法

    ([字符]){数量}\\位置

    Group RegExp

    • matcher.group(int)
    • 0 表示整个正则表达式,i 表示第 i 个圆括号

    Garbage Collection

    Garbage Collection Optimization

    GC 优化的核心思路: 尽可能让对象在新生代中分配和回收, 尽量避免过多对象进入老年代, 导致对老年代频繁进行垃圾回收, 同时给系统足够的内存减少新生代垃圾回收次数.

    分析系统的运行状况:

    • 系统每秒请求数, 每个请求创建多少对象, 占用多少内存
    • Young GC 触发频率, 对象进入老年代的速率
    • 老年代占用内存, Full GC 触发频率, Full GC 触发的原因, 长时间 Full GC 的原因

    GC Tools

    • 监控告警系统:Zabbix、Prometheus、Open-Falcon
    • jdk 自动实时内存监控工具:VisualVM
    • 堆外内存监控: Java VisualVM 安装 Buffer Pools 插件, google perf 工具, Java NMT (Native Memory Tracking) 工具
    • GC 日志分析:GCViewer、gceasy
    # jstat:JVM 自带命令行工具, 可用于统计内存分配速率、GC 次数,GC 耗时\njstat -gc <pid> <统计间隔时间>  <统计次数>\n\n# jmap:JVM 自带命令行工具, 可用于了解系统运行时的对象分布\njmap -histo <pid>\njmap -dump:live,format=b,file=dump.prof <pid>\n\n# 用来查看正在运行的 Java 应用程序的扩展参数\n# 包括 Java System 属性和 JVM 命令行参数\njinfo <pid>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    Java Naming Conventions

    使用前注意事项

    • 由于 Java 面向对象编程的特性, 在命名时应尽量选择名词
    • 驼峰命名法(Camel-Case)
      • 当变量名或函式名是由一个或多个单字连结在一起,而构成的唯一识别字时,首字母以小写开头,每个单词首字母大写(第一个单词除外)。

    包名的书写规范 (Package)

    推荐使用公司或机构的顶级域名为包名的前缀,目的是保证各公司/机构内所使用的包名的唯一性。包名全部为小写字母,且具有实际的区分意义。

    Package 一般要求

    • 选择有意义的名字,能快速地传达该类的用途。
    • 所有包的命名必须采用小写英文字母。

    Package 实际应用

    应用系统中经常应用分层,Dao 层(数据库访问)、Service 层(业务处理)、Web 层(页面控制 action 类)

    • 包名的前几个为固定名称, 如果是网站的话,采用网站的域名的反写,如果域名还没有确定的话,采用公司固定的几个名称。如:net.vschool
    • 在包名的接下来一个单词为模块的名称。如:用户模块,包名为 net.vschool.user
    • 关于模块的访问操作,采用分层形式,一般分为:

    Dao 层操作:一般定义在 net.vschool.xxx.dao 中,其中 xxx 为模块名称。
    Service 层操作:一般定义在 net.vschool.xxx.service 中。
    web 层操作:一般定义在 net.vschool.xxx.action 中。

    net.vschool.user
    net.vschool.user.dao
    net.vschool.user.action
    net.vschool.user.service

    类名的书写规范 (Class)

    类名必须使用名词,如果一个类名内含多个单词,那么各个单词第一个字母大写,后续字母小写,起伏呈驼峰状,人称驼峰式命名。给类名命名时,必须保证准确、简洁且容易理解。尽量使用完整单词,避免使用缩写词(除了大家公认的) 类

    Class 一般要求

    • 选择有意义的名字,能快速地传达该类的用途。
    • 参照 java 驼峰命名法,类名的首字母必须采用大写的形式,如果类名为多词组合而成的话,那么每个词的首字母必须采用大写。如:StudentAnswer.java
    • 当要区别接口类和实现类的时候,可以在类的后面加上“Impl”。
    • 推荐实体类没有后缀名。
    • public class 应与.java 文件同名

    Class 实际应用

    应用系统中经常应用分层,Dao 层(数据库访问)、Service 层(业务处理)、Web 层(页面控制 action 类),每一层的类的名称尽量带上该层后缀。

    • Dao 层

      • 接口类:采用 JavaBean+Interface+Dao 的形式来定义,即,实体对象+Interface+Dao
      • 实现类:采用 JavaBean+Interface+Impl+Dao 的形式来定义,即,实体对象+Interface+Impl+Dao
    • Service 层

      • 接口类:采用 Xxx+Interface+Service 的形式来定义,即,模块+Interface+Service
      • 实现类:采用 Xxx+Interface+Impl+Service 的形式来定义,即,模块+Interface+Impl+Service
    • Web 层(action 类)

      • 实现类:采用县 Xxx+Operator+Action 的形式来定义,即,模块+操作+Action

    变量的命名

    普通变量

    Var 一般要求
    • 选择有意义的名字,能快速地传达该变量的用途。
    • 参照 java 驼峰命名法,首字母以小写开头,每个单词首字母大写(第一个单词除外)。
    Var 实际应用
    • 变量命名采用基本结构为 typeVariableName,使用 3 字符前缀来表示数据类型。
      • 做数组用时,再加前缀-a,如字符串数组:astr,
      • 自定义类型的变量可以采用本身的名称,把首字母改为小写。
      • 采用名称要能代表在方法中的意义。如果员工列表:employeeList
    原词缩写
    bytebyt
    charchr
    floatflt
    booleanbln
    Integer/intint
    shortsht
    Long/longlng
    Double/doubledbl
    stringstr
    变量使用技巧
    • 在一段函数中不使用同一个变量表示前后意义不同的两个数值。
    • 除非是在循环中,否则一般不推荐使用单个字母作为变量名,i、j、k 等只作为小型循环的循环索引变量。
    • 避免用 Flag 来命名状态变量。
    • 用 Is 来命名逻辑变量,如:blnFileIsFound。通过这种给布尔变量肯定形式的命名方式,使得其它开发人员能够更为清楚的理解布尔变量所代表的意义。
    • 如果需要对变量名进行缩写时,一定要注意整个代码中缩写规则的一致性。 例如,如果在代码的某些区域中使用 intCnt,而在另一些区域中又使用 intCount,就会给代码增加不必要的复杂性. 建议变量名中尽量不要出现缩写.

    静态变量

    • 选择有意义的名字,能快速地传达该变量的用途。
    • 参照 java 驼峰命名法,采用全部大写的形式来书写,对于采用多词合成的变量采用-来连接各单词。如:USER_LIST

    方法的命名

    Method 一般要求

    • 选择有意义的名字,能快速地传达该方法的用途。
    • 参照 java 驼峰命名法,首字母以小写开头,每个单词首字母大写(第一个单词除外)。

    Method 实际应用

    • 方法表示一种行为,它代表一种动作,最好是一个动词或者动词词组或者第一个单词为一个动词。
    • 属性方法:以 get/set 开头,其后跟字段名称,字段名称首字母大写。如:getUserName()
    • 数据层方法:只能以 insert(插入),delete(删除),update(更新),select(查找),count(统计)开头 他层方法避免以这个 5 个单词开头,以免造成误解。
    • 服务层方法,根据方法的行为命名,只描述方法的意义,而不采用方法的目的命名. 比如系统的添加新用户,用户可以前台注册,也可以管理员后台添加,方法会被重用,所以最好不要用使用 register,采用 add 会更好写. 避免使用与 web 层相关的方法.
    • Web 层方法最好是贴近 web 的语言,如 register,login,logout 等方法。
    ',712);l.render=function(s,e,l,p,i,r){return a(),n("div",null,[t])};export default l;export{e as __pageData}; diff --git a/assets/language_java_javaBasicNotes.md.4f729496.lean.js b/assets/language_java_javaBasicNotes.md.4f729496.lean.js new file mode 100644 index 00000000000..776ce6dcf02 --- /dev/null +++ b/assets/language_java_javaBasicNotes.md.4f729496.lean.js @@ -0,0 +1 @@ +import{o as a,c as n,a as s}from"./app.6dd2a1b7.js";const e='{"title":"Java Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"CLI Tools","slug":"cli-tools"},{"level":3,"title":"编译","slug":"编译"},{"level":3,"title":"运行","slug":"运行"},{"level":3,"title":"反汇编","slug":"反汇编"},{"level":3,"title":"打包","slug":"打包"},{"level":2,"title":"Gradle Tool","slug":"gradle-tool"},{"level":3,"title":"Build Gradle","slug":"build-gradle"},{"level":2,"title":"基本结构","slug":"基本结构"},{"level":3,"title":"数据类型","slug":"数据类型"},{"level":3,"title":"常量","slug":"常量"},{"level":3,"title":"运算符","slug":"运算符"},{"level":3,"title":"字符串","slug":"字符串"},{"level":3,"title":"输入输出","slug":"输入输出"},{"level":3,"title":"表达式","slug":"表达式"},{"level":3,"title":"控制流程","slug":"控制流程"},{"level":3,"title":"大数值","slug":"大数值"},{"level":3,"title":"数组","slug":"数组"},{"level":2,"title":"对象与类","slug":"对象与类"},{"level":3,"title":"面向对象的三大特征","slug":"面向对象的三大特征"},{"level":3,"title":"完整的 Java 源文件","slug":"完整的-java-源文件"},{"level":3,"title":"Behavior State and Identity","slug":"behavior-state-and-identity"},{"level":3,"title":"预定义类","slug":"预定义类"},{"level":3,"title":"用户自定义类","slug":"用户自定义类"},{"level":3,"title":"方法 Method","slug":"方法-method"},{"level":3,"title":"对象构造","slug":"对象构造"},{"level":3,"title":"包","slug":"包"},{"level":3,"title":"类路径","slug":"类路径"},{"level":3,"title":"文档注释","slug":"文档注释"},{"level":3,"title":"类设计技巧","slug":"类设计技巧"},{"level":2,"title":"继承","slug":"继承"},{"level":3,"title":"父类与子类(superclass and subclass)","slug":"父类与子类-superclass-and-subclass"},{"level":3,"title":"Object 类","slug":"object-类"},{"level":3,"title":"泛型数组列表","slug":"泛型数组列表"},{"level":3,"title":"对象包装器与自动装箱","slug":"对象包装器与自动装箱"},{"level":3,"title":"可变参数方法","slug":"可变参数方法"},{"level":3,"title":"枚举类","slug":"枚举类"},{"level":3,"title":"访问控制符","slug":"访问控制符"},{"level":3,"title":"非访问控制符","slug":"非访问控制符"},{"level":3,"title":"反射(Reflection)","slug":"反射-reflection"},{"level":2,"title":"接口与内部类","slug":"接口与内部类"},{"level":3,"title":"接口","slug":"接口"},{"level":3,"title":"对象克隆","slug":"对象克隆"},{"level":3,"title":"回调","slug":"回调"},{"level":3,"title":"内部类","slug":"内部类"},{"level":3,"title":"代理类","slug":"代理类"},{"level":2,"title":"图形程序设计","slug":"图形程序设计"},{"level":3,"title":"Swing 组件继承层次","slug":"swing-组件继承层次"},{"level":3,"title":"Swing 组件功能层次","slug":"swing-组件功能层次"},{"level":3,"title":"JFrame","slug":"jframe"},{"level":3,"title":"框架基础","slug":"框架基础"},{"level":3,"title":"自定义绘制组件","slug":"自定义绘制组件"},{"level":3,"title":"图形颜色","slug":"图形颜色"},{"level":2,"title":"事件处理","slug":"事件处理"},{"level":3,"title":"定义与基础","slug":"定义与基础"},{"level":3,"title":"动作","slug":"动作"},{"level":3,"title":"鼠标事件","slug":"鼠标事件"},{"level":3,"title":"AWT 事件继承层次","slug":"awt-事件继承层次"},{"level":2,"title":"Swing 组件","slug":"swing-组件"},{"level":3,"title":"Awt 和 Swing 设计中的设计模式","slug":"awt-和-swing-设计中的设计模式"},{"level":3,"title":"简单布局管理器","slug":"简单布局管理器"},{"level":3,"title":"复杂布局管理器","slug":"复杂布局管理器"},{"level":3,"title":"文本组件","slug":"文本组件"},{"level":3,"title":"选择组件","slug":"选择组件"},{"level":3,"title":"菜单组件","slug":"菜单组件"},{"level":3,"title":"对话框(顶级框架)","slug":"对话框-顶级框架"},{"level":2,"title":"异常、断言、日志、调试","slug":"异常、断言、日志、调试"},{"level":3,"title":"处理错误","slug":"处理错误"},{"level":3,"title":"捕获异常","slug":"捕获异常"},{"level":3,"title":"记录日志","slug":"记录日志"},{"level":3,"title":"调试技巧","slug":"调试技巧"},{"level":2,"title":"泛型","slug":"泛型"},{"level":3,"title":"泛型类","slug":"泛型类"},{"level":3,"title":"泛型方法","slug":"泛型方法"},{"level":3,"title":"泛型变量 T","slug":"泛型变量-t"},{"level":3,"title":"泛型代码","slug":"泛型代码"},{"level":3,"title":"使用限制","slug":"使用限制"},{"level":3,"title":"通配符类型","slug":"通配符类型"},{"level":3,"title":"反射与泛型","slug":"反射与泛型"},{"level":2,"title":"集合","slug":"集合"},{"level":3,"title":"集合接口","slug":"集合接口"},{"level":3,"title":"具体集合","slug":"具体集合"},{"level":3,"title":"集合框架","slug":"集合框架"},{"level":3,"title":"集合算法","slug":"集合算法"},{"level":3,"title":"早期集合","slug":"早期集合"},{"level":2,"title":"线程","slug":"线程"},{"level":3,"title":"线程基础","slug":"线程基础"},{"level":3,"title":"线程状态","slug":"线程状态"},{"level":3,"title":"线程属性","slug":"线程属性"},{"level":3,"title":"中断线程","slug":"中断线程"},{"level":3,"title":"线程同步","slug":"线程同步"},{"level":3,"title":"线程安全","slug":"线程安全"},{"level":3,"title":"异步计算","slug":"异步计算"},{"level":3,"title":"执行器","slug":"执行器"},{"level":3,"title":"同步器","slug":"同步器"},{"level":3,"title":"线程与 Swing:事件分配线程","slug":"线程与-swing-事件分配线程"},{"level":2,"title":"Self-Defined Class","slug":"self-defined-class"},{"level":2,"title":"常用工具类","slug":"常用工具类"},{"level":2,"title":"输入与输出","slug":"输入与输出"},{"level":3,"title":"输入","slug":"输入"},{"level":3,"title":"输出","slug":"输出"},{"level":2,"title":"正则表达式","slug":"正则表达式"},{"level":3,"title":"基本写法","slug":"基本写法"},{"level":3,"title":"Group RegExp","slug":"group-regexp"},{"level":2,"title":"Garbage Collection","slug":"garbage-collection"},{"level":3,"title":"Garbage Collection Optimization","slug":"garbage-collection-optimization"},{"level":3,"title":"GC Tools","slug":"gc-tools"},{"level":2,"title":"Java Naming Conventions","slug":"java-naming-conventions"},{"level":3,"title":"使用前注意事项","slug":"使用前注意事项"},{"level":3,"title":"包名的书写规范 (Package)","slug":"包名的书写规范-(package)"},{"level":3,"title":"类名的书写规范 (Class)","slug":"类名的书写规范-class"},{"level":3,"title":"变量的命名","slug":"变量的命名"},{"level":3,"title":"方法的命名","slug":"方法的命名"}],"relativePath":"language/java/javaBasicNotes.md","lastUpdated":1627196319000}',l={},t=s('',712);l.render=function(s,e,l,p,i,r){return a(),n("div",null,[t])};export default l;export{e as __pageData}; diff --git a/assets/language_python_pythonBasicNotes.md.f5d1a476.js b/assets/language_python_pythonBasicNotes.md.f5d1a476.js new file mode 100644 index 00000000000..7f52a58a8bc --- /dev/null +++ b/assets/language_python_pythonBasicNotes.md.f5d1a476.js @@ -0,0 +1 @@ +import{o as n,c as s,a}from"./app.6dd2a1b7.js";const p='{"title":"Python Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Python Basics","slug":"python-basics"},{"level":3,"title":"Basic Types","slug":"basic-types"},{"level":3,"title":"Basic Control Statement","slug":"basic-control-statement"},{"level":3,"title":"Functions","slug":"functions"},{"level":3,"title":"Classes","slug":"classes"},{"level":2,"title":"NumPy Basics","slug":"numpy-basics"},{"level":3,"title":"Numpy Array Creation","slug":"numpy-array-creation"},{"level":3,"title":"Numpy Indexing","slug":"numpy-indexing"},{"level":3,"title":"Numpy Matrix Operations","slug":"numpy-matrix-operations"},{"level":2,"title":"CLI Application","slug":"cli-application"},{"level":3,"title":"Basic CLI","slug":"basic-cli"},{"level":3,"title":"Progress Bar","slug":"progress-bar"},{"level":2,"title":"Process Data Files","slug":"process-data-files"},{"level":3,"title":"CSV File","slug":"csv-file"},{"level":3,"title":"JSON File","slug":"json-file"},{"level":3,"title":"XML File","slug":"xml-file"},{"level":3,"title":"Plain Text File","slug":"plain-text-file"},{"level":3,"title":"Converter","slug":"converter"},{"level":2,"title":"Matplotlib Usage","slug":"matplotlib-usage"},{"level":3,"title":"Plot Type","slug":"plot-type"},{"level":3,"title":"Basic Usage","slug":"basic-usage"},{"level":2,"title":"Plot Style","slug":"plot-style"},{"level":2,"title":"Plot Axis Tick","slug":"plot-axis-tick"},{"level":2,"title":"Plot Legend","slug":"plot-legend"},{"level":2,"title":"Subplot","slug":"subplot"},{"level":3,"title":"Double y-axis","slug":"double-y-axis"},{"level":2,"title":"3D Plot","slug":"_3d-plot"},{"level":2,"title":"Paper Figures Config","slug":"paper-figures-config"},{"level":2,"title":"Paper Standard","slug":"paper-standard"},{"level":2,"title":"Awesome Library","slug":"awesome-library"},{"level":3,"title":"Debugging and Testing","slug":"debugging-and-testing"}],"relativePath":"language/python/pythonBasicNotes.md","lastUpdated":1627196319000}',t={},e=a('

    Python Basic Notes

    Python Basics

    Basic Types

    Tuples

    tuples in python are immutable

    Basic Control Statement

    For Loop

    for i in range(3): # goes from i = 0 to i = 2\n  x += 1\n\nfor i in [0, 1, 2]:\n  x += 1\n
    1
    2
    3
    4
    5

    While Loop

    while x > 0:\n  x -= 1\n
    1
    2

    Functions

    def join_name(first_name, last_name):\n  joined_name = first_name + " " + last_name\n  return joined_name\n
    1
    2
    3

    Classes

    class Pet(object):\n  def __init__(self, species, color, name):\n    self.species = species\n    self.color = color\n    self.name = name\n\n  def __str__(self):\n    return "{0} {1} named {2}.".format(self.color, self.species, self.name)\n\n  def change_name(self, new_name):\n    self.name = new_name\n\nmy_dog = Pet(species="dog", color="orange", name="Guises")\nprint(my_dog)\nprint(my_dog.name)\n# => output:\n# orange dog named Guises.\n# Guises\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    NumPy Basics

    import numpy as np\n\nnp.random.seed(seed=1234)\n
    1
    2
    3

    Numpy Array Creation

    x = np.array(6)\nx.ndim\nx.shape\nx.size\nx.dtype\n
    1
    2
    3
    4
    5
    np.zeros((2, 2))\nnp.ones((2, 2))\nnp.eye((2))\nnp.random.random.((2, 2))\n
    1
    2
    3
    4

    Numpy Indexing

    x = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])\nx[:, 1]    # [2, 6, 10]\nx[0, :]    # [1, 2, 3, 4]\nx[:3, 1:3] # [[2, 3], [6, 7], [10, 11]]\nx[[0, 1, 2], [0, 2, 1]] # [1, 7, 10]\n
    1
    2
    3
    4
    5
    # Boolean array indexing\nx = np.array([[1,2], [3, 4], [5, 6]])\nprint ("x:\\n", x)\nprint ("x > 2:\\n", x > 2)\nprint ("x[x > 2]:\\n", x[x > 2])\n# x:\n#  [[1 2]\n#  [3 4]\n#  [5 6]]\n# x > 2:\n#  [[False False]\n#  [ True  True]\n#  [ True  True]]\n# x[x > 2]:\n#  [3 4 5 6]\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    Numpy Matrix Operations

    • math: x+y/x-y/x*y np.add/subtract/multiply
    • dot product: a.dot(b)
    • sum: np.sum(x)
    • column sum: np.sum(x, axis=0)
    • row sum: np.sum(x, axis=1)
    • transposing: x.T
    • reshape: np.reshape(x, (2, 3))

    CLI Application

    Basic CLI

    import click\n\nfrom caesar_encryption import encrypt\n\n@click.command()\n@click.option(\n    '--input_file',\n    type=click.File('r'),\n    help='File in which there is the text you want to encrypt/decrypt.'\n         'If not provided, a prompt will allow you to type the input text.',\n)\n@click.option(\n    '--output_file',\n    type=click.File('w'),\n    help='File in which the encrypted / decrypted text will be written.'\n         'If not provided, the output text will just be printed.',\n)\n@click.option(\n    '--decrypt/--encrypt',\n    '-d/-e',\n    help='Whether you want to encrypt the input text or decrypt it.'\n)\n@click.option(\n    '--key',\n    '-k',\n    default=1,\n    help='The numeric key to use for the caesar encryption / decryption.'\n)\ndef caesar(input_file, output_file, decrypt, key):\n    if input_file:\n        text = input_file.read()\n    else:\n        text = click.prompt('Enter a text', hide_input=not decrypt)\n    if decrypt:\n        key = -key\n    cypherText = encrypt(text, key)\n    if output_file:\n        output_file.write(cypherText)\n    else:\n        click.echo(cypherText)\n\nif __name__ == '__main__':\n    caesar()\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43

    Progress Bar

    import click\nimport enchant\n\nfrom tqdm import tqdm\n\nfrom caesar_encryption import encrypt\n\n@click.command()\n@click.option(\n    '--input_file',\n    type=click.File('r'),\n    required=True,\n)\n@click.option(\n    '--output_file',\n    type=click.File('w'),\n    required=True,\n)\ndef caesar_breaker(input_file, output_file):\n    cypherText = input_file.read()\n    english_dictionary = enchant.Dict("en_US")\n    best_number_of_english_words = 0\n    for key in tqdm(range(26)):\n        plaintext = encrypt(cypherText, -key)\n        number_of_english_words = 0\n        for word in plaintext.split(' '):\n            if word and english_dictionary.check(word):\n                number_of_english_words += 1\n        if number_of_english_words > best_number_of_english_words:\n            best_number_of_english_words = number_of_english_words\n            best_plaintext = plaintext\n            best_key = key\n    click.echo(f'The most likely encryption key is {best_key}. It gives the\n    following plaintext:\\n\\n{best_plaintext[:1000]}...')\n    output_file.write(best_plaintext)\n\nif __name__ == '__main__':\n    caesar_breaker()\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38

    Process Data Files

    CSV File

    import csv\n\nfilename = "my_data.csv"\n\nfields = []\nrows = []\n\n# Reading csv file\nwith open(filename, 'r') as csvFile:\n    # Creating a csv reader object\n    csvReader = csv.reader(csvFile)\n\n    # Extracting field names in the first row\n    fields = csvReader.next()\n\n    # Extracting each data row one by one\n    for row in csvReader:\n        rows.append(row)\n\n# Printing out the first 5 rows\nfor row in rows[:5]:\n    print(row)\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    import csv\n\n# Field names\nfields = ['Name', 'Goals', 'Assists', 'Shots']\n\n# Rows of data in the csv file\nrows = [ ['Emily', '12', '18', '112'],\n         ['Katie', '8', '24', '96'],\n         ['John', '16', '9', '101'],\n         ['Mike', '3', '14', '82']]\n\nfilename = "soccer.csv"\n\n# Writing to csv file\nwith open(filename, 'w+') as csvFile:\n    # Creating a csv writer object\n    csvWriter = csv.writer(csvFile)\n\n    # Writing the fields\n    csvWriter.writerow(fields)\n\n    # Writing the data rows\n    csvWriter.writerows(rows)\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    import pandas as pd\n\nfilename = "my_data.csv"\n\n# Read in the data\ndata = pd.read_csv(filename)\n\n# Print the first 5 rows\nprint(data.head(5))\n\n# Write the data to file\ndata.to_csv("new_data.csv", sep=",", index=False)\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    JSON File

    import json\nimport pandas as pd\n\n# Read the data from file\n# We now have a Python dictionary\nwith open('data.json') as f:\n    data_listOfDict = json.load(f)\n\n# We can do the same thing with pandas\ndata_df = pd.read_json('data.json', orient='records')\n\n# We can write a dictionary to JSON like so\n# Use 'indent' and 'sort_keys' to make the JSON\n# file look nice\nwith open('new_data.json', 'w+') as json_file:\n    json.dump(data_listOfDict, json_file, indent=4, sort_keys=True)\n\n# And again the same thing with pandas\nexport = data_df.to_json('new_data.json', orient='records')\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    XML File

    import xml.etree.ElementTree as ET\nimport xmltodict\nimport json\n\ntree = ET.parse('output.xml')\nxml_data = tree.getroot()\n\nxmlStr = ET.tostring(xml_data, encoding='utf8', method='xml')\n\n\ndata_dict = dict(xmltodict.parse(xmlStr))\n\nprint(data_dict)\n\nwith open('new_data_2.json', 'w+') as json_file:\n    json.dump(data_dict, json_file, indent=4, sort_keys=True)\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

    Plain Text File

    import numpy as np\nx, y = np.loadtxt('input.dat', delimiter=',', unpack=True)\n
    1
    2

    Converter

    import pandas as pd\nfrom dicttoxml import dicttoxml\nimport json\n\n# Building our dataframe\ndata = {'Name': ['Emily', 'Katie', 'John', 'Mike'],\n        'Goals': [12, 8, 16, 3],\n        'Assists': [18, 24, 9, 14],\n        'Shots': [112, 96, 101, 82]\n        }\n\ndf = pd.DataFrame(data, columns=data.keys())\n\n# Converting the dataframe to a dictionary\n# Then save it to file\ndata_dict = df.to_dict(orient="records")\nwith open('output.json', "w+") as f:\n    json.dump(data_dict, f, indent=4)\n\n# Converting the dataframe to XML\n# Then save it to file\nxml_data = dicttoxml(data_dict).decode()\nwith open("output.xml", "w+") as f:\n    f.write(xml_data)\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    import json\nimport pandas as pd\nimport csv\n\n# Read the data from file\n# We now have a Python dictionary\nwith open('data.json') as f:\n    data_listOfDict = json.load(f)\n\n# Writing a list of dicts to CSV\nkeys = data_listOfDict[0].keys()\nwith open('saved_data.csv', 'wb') as output_file:\n    dict_writer = csv.DictWriter(output_file, keys)\n    dict_writer.writeheader()\n    dict_writer.writerows(data_listOfDict)\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    Matplotlib Usage

    pip3 install matplotlib\npip3 install ggplot\n
    1
    2

    Plot Type

    • bar plot
    • line plot
    • scatter plot
    • pie plot
    • stack plot
    • histogram plot
    • interval plot
    • box plot
    • KDE plot
    • candlestick_ohlc plot

    Basic Usage

    import matplotlib.pyplot as plt\n\nfig = plt.figure()\nax = plt.subplot2grid((1, 1), (0, 0))\n\nax.fill_between(x, y, y[0],where=(y > y[0]), facecolor='g', alpha=0.5)\n\nax.grid(True)\nax.xaxis.label.set_color('c') ax.yaxis.label.set_color('r') ax.set_yticks([0,25,50,75])\nax.xaxis.get_ticklabels()\n\nax.spines['left'].set_color('c') ax.spines['right'].set_visible(False)\nax.spines['top'].set_visible(False) ax.spines['left'].set_linewidth(5)\nax.tick_params(axis='x', colors='#f06215')\nax.axhline(20, color='k', linewidth=5)\n\nax.text(x, y, 'text')\nax.annotate(\n  'Bad News!',\n  xytext=(0.8, 0.9),\n  textcoords='axes fraction',\n  arrowprops = dict(facecolor='grey', color='grey')\n)\n\nplt.plot(x, y, label='label', color='red', linewidth=5)\nplt.bar(x, y, label='label', color='#111')\nplt.scatter(x, y, label='label', marker='*', size=100)\nplt.stackplot(x, y1, y2, ..., yn, colors=[])\nplt.pie(slices, labels=[], colors=[], startangle=90, explode=(), autopct='%1.1f%%')\nplt.hist(data, bins=10, histtype='bar', rwidth=0.8)\n\nplt.xlabel('xlabel')\nplt.ylabel('ylabel')\nplt.title('title')\nplt.legend()\nplt.subplots_adjust()\nplt.show()\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37

    Plot Style

    from matplotlib import style\nprint(plt.style.available)\nprint(plt.__file__)\nstyle.use('ggplot')\nstyle.use('fivethirtyeight')\nplt.style.use('mystylesheet.mplrc')\n
    1
    2
    3
    4
    5
    6

    Plot Axis Tick

    ax3.xaxis.set_major_formatter(mDates.DateFormatter('%Y-%m-%d'))\nax3.xaxis.set_major_locator(mTicker.MaxNLocator(10))\nax1.yaxis.set_major_locator(mTicker.MaxNLocator(nbins=5, prune='lower'))\n\nfor label in ax3.xaxis.get_ticklabels():\n    label.set_rotation(45)\n\nplt.setp(ax1.get_xticklabels(), visible=False)\nplt.setp(ax2.get_xticklabels(), visible=False)\n
    1
    2
    3
    4
    5
    6
    7
    8
    9

    Plot Legend

    up middle legend

    ax.legend()\nleg = ax.legend(loc=9, ncol=2,prop={'size':11})\nleg.get_frame().set_alpha(0.4)\n
    1
    2
    3

    Subplot

    tall and width for grid template

    fig = plt.figure()\nax1 = fig.add_subplot(221)\nax2 = fig.add_subplot(222)\nax3 = fig.add_subplot(212)\n\nax1 = plt.subplot2grid((6,1), (0,0), rowspan=1, colspan=1)\nax2 = plt.subplot2grid((6,1), (1,0), rowspan=4, colspan=1)\nax3 = plt.subplot2grid((6,1), (5,0), rowspan=1, colspan=1)\n
    1
    2
    3
    4
    5
    6
    7
    8

    Double y-axis

    ax2v = ax2.twinx()\n
    1

    3D Plot

    from mpl_toolkits.mplot3d import axes3d\nimport matplotlib.pyplot as plt\nfrom matplotlib import style\n\nstyle.use('ggplot')\n\nfig = plt.figure()\nax1 = fig.add_subplot(111, projection='3d')\n\nx = [1,2,3,4,5,6,7,8,9,10]\ny = [5,6,7,8,2,5,6,3,7,2]\nz = [1,2,6,3,2,7,3,3,7,2]\n\nx2 = [-1,-2,-3,-4,-5,-6,-7,-8,-9,-10]\ny2 = [-5,-6,-7,-8,-2,-5,-6,-3,-7,-2]\nz2 = [1,2,6,3,2,7,3,3,7,2]\n\nax1.scatter(x, y, z, c='g', marker='o')\nax1.scatter(x2, y2, z2, c ='r', marker='o')\n\nax1.set_xlabel('x axis')\nax1.set_ylabel('y axis')\nax1.set_zlabel('z axis')\n\nplt.show()\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    from mpl_toolkits.mplot3d import axes3d\nimport matplotlib.pyplot as plt\nimport numpy as np\nfrom matplotlib import style\nstyle.use('ggplot')\n\nfig = plt.figure()\nax1 = fig.add_subplot(111, projection='3d')\n\nx3 = [1,2,3,4,5,6,7,8,9,10]\ny3 = [5,6,7,8,2,5,6,3,7,2]\nz3 = np.zeros(10)\n\ndx = np.ones(10)\ndy = np.ones(10)\ndz = [1,2,3,4,5,6,7,8,9,10]\n\nax1.bar3d(x3, y3, z3, dx, dy, dz)\n\n\nax1.set_xlabel('x axis')\nax1.set_ylabel('y axis')\nax1.set_zlabel('z axis')\n\nplt.show()\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25

    Paper Figures Config

    import matplotlib.pyplot as plt\nimport matplotlib\n\ndef latexify(fig_width=None, fig_height=None, columns=1):\n    '''Set up matplotlib RC params for LaTeX plotting.\n    Call this before plotting a figure.\n\n    Parameters\n    ----------\n    fig_width : float, optional, inches\n    fig_height : float,  optional, inches\n    columns : {1, 2}\n    '''\n\n    # code adapted from http://www.scipy.org/Cookbook/Matplotlib/LaTeX_Examples\n\n    # Width and max height in inches for IEEE journals taken from\n    # computer.org/cms/Computer.org/Journal%20templates/transactions_art_guide.pdf\n\n    assert(columns in [1,2])\n\n    if fig_width is None:\n        fig_width = 3.39 if columns==1 else 6.9 # width in inches\n\n    if fig_height is None:\n        golden_mean = (sqrt(5)-1.0)/2.0    # Aesthetic ratio\n        fig_height = fig_width*golden_mean # height in inches\n\n    MAX_HEIGHT_INCHES = 8.0\n    if fig_height > MAX_HEIGHT_INCHES:\n        print("WARNING: fig_height too large:" + fig_height +\n              "so will reduce to" + MAX_HEIGHT_INCHES + "inches.")\n        fig_height = MAX_HEIGHT_INCHES\n\n    params = {'backend': 'ps',\n              'text.latex.preamble': ['\\usepackage{gensymb}'],\n              'axes.labelsize': 8, # fontsize for x and y labels (was 10)\n              'axes.titlesize': 8,\n              'text.fontsize': 8, # was 10\n              'legend.fontsize': 8, # was 10\n              'xtick.labelsize': 8,\n              'ytick.labelsize': 8,\n              'text.usetex': True,\n              'figure.figsize': [fig_width,fig_height],\n              'font.family': 'serif'\n    }\n\n    matplotlib.rcParams.update(params)\n\n\ndef format_axes(ax):\n\n    for spine in ['top', 'right']:\n        ax.spines[spine].set_visible(False)\n\n    for spine in ['left', 'bottom']:\n        ax.spines[spine].set_color(SPINE_COLOR)\n        ax.spines[spine].set_linewidth(0.5)\n\n    ax.xaxis.set_ticks_position('bottom')\n    ax.yaxis.set_ticks_position('left')\n\n    for axis in [ax.xaxis, ax.yaxis]:\n        axis.set_tick_params(direction='out', color=SPINE_COLOR)\n\n    return ax\n\nlatexify()\nax.set_xlabel("X label")\nax.set_ylabel("Y label")\nax.set_title("Title")\nplt.tight_layout()\nformat_axes(ax)\nplt.savefig("figure.pdf")\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    import numpy as np\nimport matplotlib as mpl\nmpl.use('pdf')\nimport matplotlib.pyplot as plt\n\nplt.rc('font', family='serif', serif='Times')\nplt.rc('text', usetex=True)\nplt.rc('xtick', labelsize=8)\nplt.rc('ytick', labelsize=8)\nplt.rc('axes', labelsize=8)\n\n# width as measured in ink scape\nwidth = 3.487\nheight = width / 1.618\n\nfig, ax = plt.subplots()\nfig.subplots_adjust(left=.15, bottom=.16, right=.99, top=.97)\n\nx = np.arange(0.0, 3*np.pi , 0.1)\nplt.plot(x, np.sin(x))\n\nax.set_ylabel('Some Metric (in unit)')\nax.set_xlabel('Something (in unit)')\nax.set_xlim(0, 3*np.pi)\n\nfig.set_size_inches(width, height)\nfig.savefig('plot.pdf')\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27

    Paper Standard

    Awesome Library

    Debugging and Testing

    ',73);t.render=function(a,p,t,o,c,l){return n(),s("div",null,[e])};export default t;export{p as __pageData}; diff --git a/assets/language_python_pythonBasicNotes.md.f5d1a476.lean.js b/assets/language_python_pythonBasicNotes.md.f5d1a476.lean.js new file mode 100644 index 00000000000..ff0e2ac9bb4 --- /dev/null +++ b/assets/language_python_pythonBasicNotes.md.f5d1a476.lean.js @@ -0,0 +1 @@ +import{o as n,c as s,a}from"./app.6dd2a1b7.js";const p='{"title":"Python Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Python Basics","slug":"python-basics"},{"level":3,"title":"Basic Types","slug":"basic-types"},{"level":3,"title":"Basic Control Statement","slug":"basic-control-statement"},{"level":3,"title":"Functions","slug":"functions"},{"level":3,"title":"Classes","slug":"classes"},{"level":2,"title":"NumPy Basics","slug":"numpy-basics"},{"level":3,"title":"Numpy Array Creation","slug":"numpy-array-creation"},{"level":3,"title":"Numpy Indexing","slug":"numpy-indexing"},{"level":3,"title":"Numpy Matrix Operations","slug":"numpy-matrix-operations"},{"level":2,"title":"CLI Application","slug":"cli-application"},{"level":3,"title":"Basic CLI","slug":"basic-cli"},{"level":3,"title":"Progress Bar","slug":"progress-bar"},{"level":2,"title":"Process Data Files","slug":"process-data-files"},{"level":3,"title":"CSV File","slug":"csv-file"},{"level":3,"title":"JSON File","slug":"json-file"},{"level":3,"title":"XML File","slug":"xml-file"},{"level":3,"title":"Plain Text File","slug":"plain-text-file"},{"level":3,"title":"Converter","slug":"converter"},{"level":2,"title":"Matplotlib Usage","slug":"matplotlib-usage"},{"level":3,"title":"Plot Type","slug":"plot-type"},{"level":3,"title":"Basic Usage","slug":"basic-usage"},{"level":2,"title":"Plot Style","slug":"plot-style"},{"level":2,"title":"Plot Axis Tick","slug":"plot-axis-tick"},{"level":2,"title":"Plot Legend","slug":"plot-legend"},{"level":2,"title":"Subplot","slug":"subplot"},{"level":3,"title":"Double y-axis","slug":"double-y-axis"},{"level":2,"title":"3D Plot","slug":"_3d-plot"},{"level":2,"title":"Paper Figures Config","slug":"paper-figures-config"},{"level":2,"title":"Paper Standard","slug":"paper-standard"},{"level":2,"title":"Awesome Library","slug":"awesome-library"},{"level":3,"title":"Debugging and Testing","slug":"debugging-and-testing"}],"relativePath":"language/python/pythonBasicNotes.md","lastUpdated":1627196319000}',t={},e=a('',73);t.render=function(a,p,t,o,c,l){return n(),s("div",null,[e])};export default t;export{p as __pageData}; diff --git a/assets/language_verilog_verilogBasicNotes.md.8503596e.js b/assets/language_verilog_verilogBasicNotes.md.8503596e.js new file mode 100644 index 00000000000..8218d79aecf --- /dev/null +++ b/assets/language_verilog_verilogBasicNotes.md.8503596e.js @@ -0,0 +1 @@ +import{o as n,c as s,b as a,d as e}from"./app.6dd2a1b7.js";const t='{"title":"Verilog Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"General Flow","slug":"general-flow"},{"level":3,"title":"Create Project","slug":"create-project"},{"level":3,"title":"RTL Analysis","slug":"rtl-analysis"},{"level":3,"title":"Simulate Design","slug":"simulate-design"},{"level":3,"title":"Synthesize Design","slug":"synthesize-design"},{"level":3,"title":"Implement Design","slug":"implement-design"},{"level":3,"title":"Post-Implementation Timing Simulate Design","slug":"post-implementation-timing-simulate-design"},{"level":3,"title":"Generate Bit Stream","slug":"generate-bit-stream"},{"level":3,"title":"Testing and Verification","slug":"testing-and-verification"},{"level":2,"title":"Timing in Circuits","slug":"timing-in-circuits"},{"level":3,"title":"Combination Circuit Timing","slug":"combination-circuit-timing"},{"level":3,"title":"Sequential Circuit Timing","slug":"sequential-circuit-timing"},{"level":2,"title":"Key Words","slug":"key-words"},{"level":2,"title":"Module","slug":"module"},{"level":3,"title":"外部端口","slug":"外部端口"},{"level":2,"title":"function","slug":"function"},{"level":3,"title":"task","slug":"task"},{"level":2,"title":"Data Structure","slug":"data-structure"},{"level":3,"title":"常量","slug":"常量"},{"level":3,"title":"向量","slug":"向量"},{"level":3,"title":"数字","slug":"数字"},{"level":3,"title":"Register","slug":"register"},{"level":3,"title":"Net","slug":"net"},{"level":2,"title":"Gate Level","slug":"gate-level"},{"level":3,"title":"Basic Gate","slug":"basic-gate"},{"level":3,"title":"Use Gate","slug":"use-gate"},{"level":3,"title":"Self-Defined Gate(用户自定义原语)","slug":"self-defined-gate-用户自定义原语"},{"level":2,"title":"Dataflow Level","slug":"dataflow-level"},{"level":3,"title":"Operators","slug":"operators"},{"level":3,"title":"整数提升","slug":"整数提升"},{"level":2,"title":"Behavior Level","slug":"behavior-level"},{"level":3,"title":"时延控制","slug":"时延控制"},{"level":3,"title":"事件控制","slug":"事件控制"},{"level":3,"title":"语句内/间控制","slug":"语句内-间控制"},{"level":3,"title":"always","slug":"always"},{"level":3,"title":"if-else","slug":"if-else"},{"level":3,"title":"Case Statement","slug":"case-statement"},{"level":3,"title":"for","slug":"for"},{"level":3,"title":"repeat loop","slug":"repeat-loop"},{"level":3,"title":"forever loop","slug":"forever-loop"},{"level":3,"title":"Force and Release","slug":"force-and-release"},{"level":3,"title":"Blocking and Non-Blocking","slug":"blocking-and-non-blocking"},{"level":3,"title":"disable","slug":"disable"},{"level":2,"title":"结构建模","slug":"结构建模"},{"level":3,"title":"generate 语句","slug":"generate-语句"},{"level":2,"title":"Delay(时延)","slug":"delay-时延"},{"level":2,"title":"预编译指令","slug":"预编译指令"},{"level":3,"title":"define 宏","slug":"define-宏"},{"level":2,"title":"Data Path","slug":"data-path"},{"level":3,"title":"Multiplexer","slug":"multiplexer"},{"level":3,"title":"Adder","slug":"adder"},{"level":3,"title":"Register Data Path","slug":"register-data-path"},{"level":3,"title":"Memory","slug":"memory"},{"level":2,"title":"Demos","slug":"demos"},{"level":3,"title":"Binary Multiplier","slug":"binary-multiplier"},{"level":3,"title":"Multi-Hz","slug":"multi-hz"},{"level":2,"title":"Tips","slug":"tips"},{"level":3,"title":"不可综合结构","slug":"不可综合结构"},{"level":3,"title":"混合编程","slug":"混合编程"},{"level":3,"title":"上升沿/下降沿","slug":"上升沿-下降沿"},{"level":3,"title":"Parameter","slug":"parameter"},{"level":2,"title":"有限状态机(FSM)","slug":"有限状态机-fsm"},{"level":2,"title":"算术状态机(ASM)","slug":"算术状态机-asm"},{"level":2,"title":"System Verilog","slug":"system-verilog"},{"level":3,"title":"Enum","slug":"enum"},{"level":3,"title":"Struct and Union","slug":"struct-and-union"},{"level":3,"title":"Procedural Block","slug":"procedural-block"},{"level":3,"title":"Interface","slug":"interface"},{"level":3,"title":"Testing","slug":"testing"},{"level":2,"title":"U280 Platform","slug":"u280-platform"},{"level":3,"title":"Host Application","slug":"host-application"},{"level":3,"title":"U280 Tools","slug":"u280-tools"},{"level":2,"title":"AXI Protocol","slug":"axi-protocol"},{"level":3,"title":"AXI Channels","slug":"axi-channels"},{"level":3,"title":"AXI Burst","slug":"axi-burst"},{"level":2,"title":"Verilog Components","slug":"verilog-components"},{"level":3,"title":"Clock Unit","slug":"clock-unit"},{"level":3,"title":"Signal Unit","slug":"signal-unit"},{"level":3,"title":"ALU Unit","slug":"alu-unit"},{"level":3,"title":"Memory Unit","slug":"memory-unit"}],"relativePath":"language/verilog/verilogBasicNotes.md","lastUpdated":1627196319000}',o={},l=a("h1",{id:"verilog-basic-notes"},[a("a",{class:"header-anchor",href:"#verilog-basic-notes","aria-hidden":"true"},"#"),e(" Verilog Basic Notes")],-1),c=a("p",null,[a("div",{class:"table-of-contents"},[a("ul",null,[a("li",null,[a("a",{href:"#verilog-basic-notes"},"Verilog Basic Notes"),a("ul",null,[a("li",null,[a("a",{href:"#general-flow"},"General Flow")]),a("li",null,[a("a",{href:"#timing-in-circuits"},"Timing in Circuits")]),a("li",null,[a("a",{href:"#key-words"},"Key Words")]),a("li",null,[a("a",{href:"#module"},"Module")]),a("li",null,[a("a",{href:"#function"},"function")]),a("li",null,[a("a",{href:"#data-structure"},"Data Structure")]),a("li",null,[a("a",{href:"#gate-level"},"Gate Level")]),a("li",null,[a("a",{href:"#dataflow-level"},"Dataflow Level")]),a("li",null,[a("a",{href:"#behavior-level"},"Behavior Level")]),a("li",null,[a("a",{href:"#结构建模"},"结构建模")]),a("li",null,[a("a",{href:"#delay-时延"},"Delay(时延)")]),a("li",null,[a("a",{href:"#预编译指令"},"预编译指令")]),a("li",null,[a("a",{href:"#data-path"},"Data Path")]),a("li",null,[a("a",{href:"#demos"},"Demos")]),a("li",null,[a("a",{href:"#tips"},"Tips")]),a("li",null,[a("a",{href:"#有限状态机-fsm"},"有限状态机(FSM)")]),a("li",null,[a("a",{href:"#算术状态机-asm"},"算术状态机(ASM)")]),a("li",null,[a("a",{href:"#system-verilog"},"System Verilog")]),a("li",null,[a("a",{href:"#u280-platform"},"U280 Platform")]),a("li",null,[a("a",{href:"#axi-protocol"},"AXI Protocol")]),a("li",null,[a("a",{href:"#verilog-components"},"Verilog Components")])])])])])],-1),p=a("h2",{id:"general-flow"},[a("a",{class:"header-anchor",href:"#general-flow","aria-hidden":"true"},"#"),e(" General Flow")],-1),u=a("h3",{id:"create-project"},[a("a",{class:"header-anchor",href:"#create-project","aria-hidden":"true"},"#"),e(" Create Project")],-1),r=a("ul",null,[a("li",null,[a("code",null,".v"),e(" (sources)")]),a("li",null,[a("code",null,".xdc"),e(" (constraints)")])],-1),i=a("h3",{id:"rtl-analysis"},[a("a",{class:"header-anchor",href:"#rtl-analysis","aria-hidden":"true"},"#"),e(" RTL Analysis")],-1),k=a("p",null,"Schematic",-1),b=a("h3",{id:"simulate-design"},[a("a",{class:"header-anchor",href:"#simulate-design","aria-hidden":"true"},"#"),e(" Simulate Design")],-1),m=a("ul",null,[a("li",null,[a("code",null,"_tb.v"),e(": test bench")]),a("li",null,"simulation options: 500ns"),a("li",null,"Scopes -> dut -> swt/led"),a("li",null,"Schematic")],-1),d=a("h3",{id:"synthesize-design"},[a("a",{class:"header-anchor",href:"#synthesize-design","aria-hidden":"true"},"#"),e(" Synthesize Design")],-1),g=a("p",null,"Schematic",-1),w=a("h3",{id:"implement-design"},[a("a",{class:"header-anchor",href:"#implement-design","aria-hidden":"true"},"#"),e(" Implement Design")],-1),y=a("p",null,"Schematic",-1),h=a("h3",{id:"post-implementation-timing-simulate-design"},[a("a",{class:"header-anchor",href:"#post-implementation-timing-simulate-design","aria-hidden":"true"},"#"),e(" Post-Implementation Timing Simulate Design")],-1),f=a("h3",{id:"generate-bit-stream"},[a("a",{class:"header-anchor",href:"#generate-bit-stream","aria-hidden":"true"},"#"),e(" Generate Bit Stream")],-1),v=a("h3",{id:"testing-and-verification"},[a("a",{class:"header-anchor",href:"#testing-and-verification","aria-hidden":"true"},"#"),e(" Testing and Verification")],-1),_=a("p",null,"low-level (circuit) simulation is much slower than high-level (C, HDL) simulation:",-1),A=a("ul",null,[a("li",null,"check only functionality at high level (C, HDL)"),a("li",null,"check only timing, power at low level (circuit)")],-1),D=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e(),a("span",{class:"token function"},"testBench"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"reg"),e(" clk"),a("span",{class:"token punctuation"},","),e(" reset"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// clock and reset are internal"),e("\n "),a("span",{class:"token keyword"},"reg"),e(" a"),a("span",{class:"token punctuation"},","),e(" b"),a("span",{class:"token punctuation"},","),e(" c"),a("span",{class:"token punctuation"},","),e(" yExpected"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// values from testVectors"),e("\n "),a("span",{class:"token keyword"},"wire"),e(" y"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// output of circuit"),e("\n "),a("span",{class:"token keyword"},"reg"),e(" "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"31"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" vectorNum"),a("span",{class:"token punctuation"},","),e(" errors"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// bookkeeping variables"),e("\n "),a("span",{class:"token keyword"},"reg"),e(" "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" testVectors"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"10000"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token comment"},"// array of testVectors"),e("\n\n "),a("span",{class:"token comment"},"// instantiate device under test"),e("\n sillyFunction "),a("span",{class:"token function"},"dut"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"a"),a("span",{class:"token punctuation"},"("),e("a"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"b"),a("span",{class:"token punctuation"},"("),e("b"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"c"),a("span",{class:"token punctuation"},"("),e("c"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"y"),a("span",{class:"token punctuation"},"("),e("y"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token comment"},"// generate clock"),e("\n "),a("span",{class:"token important"},"always "),e(" "),a("span",{class:"token comment"},"// no sensitivity list, so it always executes"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n clk "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token number"},"#5"),a("span",{class:"token punctuation"},";"),e(" clk "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token number"},"#5"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 10ns period"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n "),a("span",{class:"token comment"},"// at start of test, load vectors and pulse reset"),e("\n "),a("span",{class:"token keyword"},"initial"),e(" "),a("span",{class:"token comment"},"// Only executes once"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token property"},"$readmemb"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"example.tv"'),a("span",{class:"token punctuation"},","),e(" testVectors"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token comment"},"// Read vectors: e.g 000_0 001_1 ... xxx_x"),e("\n vectorNum "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(" errors "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// Initialize"),e("\n reset "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token number"},"#27"),a("span",{class:"token punctuation"},";"),e(" reset "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// Apply reset wait"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n "),a("span",{class:"token comment"},"// Note: $readmemh reads testVector files written in"),e("\n "),a("span",{class:"token comment"},"// hexadecimal"),e("\n "),a("span",{class:"token comment"},"// apply test vectors on rising edge of clk"),e("\n "),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token number"},"#1"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token operator"},"{"),e("a"),a("span",{class:"token punctuation"},","),e(" b"),a("span",{class:"token punctuation"},","),e(" c"),a("span",{class:"token punctuation"},","),e(" yExpected"),a("span",{class:"token operator"},"}"),e(),a("span",{class:"token operator"},"="),e(" testVectors"),a("span",{class:"token punctuation"},"["),e("vectorNum"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n "),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"negedge"),e(" clk"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"~"),e("reset"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token comment"},"// don’t test during reset"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("y "),a("span",{class:"token operator"},"!=="),e(" yExpected"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token property"},"$display"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"Error: inputs = %b"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},"{"),e("a"),a("span",{class:"token punctuation"},","),e(" b"),a("span",{class:"token punctuation"},","),e(" c"),a("span",{class:"token operator"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token property"},"$display"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'" outputs = %b (%b exp)"'),a("span",{class:"token punctuation"},","),e("y"),a("span",{class:"token punctuation"},","),e("yExpected"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n errors "),a("span",{class:"token operator"},"="),e(" errors "),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n "),a("span",{class:"token comment"},"// increment array index and read next testVector"),e("\n vectorNum "),a("span",{class:"token operator"},"="),e(" vectorNum "),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("testVectors"),a("span",{class:"token punctuation"},"["),e("vectorNum"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"==="),e(),a("span",{class:"token number"},"4'bx"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token property"},"$display"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"%d tests completed with %d errors"'),a("span",{class:"token punctuation"},","),e(" vectorNum"),a("span",{class:"token punctuation"},","),e(" errors"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token property"},"$finish"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// End simulation"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br")])],-1),T=a("h2",{id:"timing-in-circuits"},[a("a",{class:"header-anchor",href:"#timing-in-circuits","aria-hidden":"true"},"#"),e(" Timing in Circuits")],-1),x=a("h3",{id:"combination-circuit-timing"},[a("a",{class:"header-anchor",href:"#combination-circuit-timing","aria-hidden":"true"},"#"),e(" Combination Circuit Timing")],-1),I=a("ul",null,[a("li",null,[e("contamination delay ("),a("code",null,"t_cd"),e("): minimum path in circuits, outputs start to change")]),a("li",null,[e("propagation delay ("),a("code",null,"t_pd"),e("): maximum path in circuits, outputs complete change")]),a("li",null,[e("(delay) heavy dependence on "),a("strong",null,"voltage"),e(" and "),a("strong",null,"temperature")])],-1),B=a("h3",{id:"sequential-circuit-timing"},[a("a",{class:"header-anchor",href:"#sequential-circuit-timing","aria-hidden":"true"},"#"),e(" Sequential Circuit Timing")],-1),W=a("p",null,[e("minimize clock skew time: requires intelligent "),a("strong",null,"clock network"),e(" across a chip, making clock arrives at all locations at roughly the same time.")],-1),C=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[e("T_clock "),a("span",{class:"token operator"},">="),e(" T_pcq "),a("span",{class:"token operator"},"+"),e(" T_pd "),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token punctuation"},"("),e("T_setup "),a("span",{class:"token operator"},"+"),e(" T_skew"),a("span",{class:"token punctuation"},")"),e("\nT_ccq "),a("span",{class:"token operator"},"+"),e(" T_cd "),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"("),e("T_hold "),a("span",{class:"token operator"},"+"),e(" T_skew"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),H=a("h2",{id:"key-words"},[a("a",{class:"header-anchor",href:"#key-words","aria-hidden":"true"},"#"),e(" Key Words")],-1),N=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e("\n"),a("span",{class:"token keyword"},"input"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"output"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"inout"),e("\n"),a("span",{class:"token keyword"},"wire"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"reg"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"parameter"),e("\n"),a("span",{class:"token important"},"always@"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"assign"),e("\n"),a("span",{class:"token keyword"},"posedge"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"negedge"),e("\n"),a("span",{class:"token keyword"},"if"),a("span",{class:"token operator"},"-"),a("span",{class:"token keyword"},"else"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"case"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"begin"),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),e(),a("span",{class:"token keyword"},"end"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),O=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[e("port"),a("span",{class:"token punctuation"},","),e(" signal\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),z=a("h2",{id:"module"},[a("a",{class:"header-anchor",href:"#module","aria-hidden":"true"},"#"),e(" Module")],-1),S=a("ul",null,[a("li",null,"Inout(Net) -> (Net)Module(Net) -> Inout(Net)"),a("li",null,"Input(Net/Register) -> (Net)Module(Net/Register) -> Output(Net)")],-1),P=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e(),a("span",{class:"token function"},"moduleName"),a("span",{class:"token punctuation"},"("),e(" In1"),a("span",{class:"token punctuation"},","),e(" In2"),a("span",{class:"token punctuation"},","),e(" Out1"),a("span",{class:"token punctuation"},","),e(" Out2"),a("span",{class:"token punctuation"},","),e(" InOut1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token comment"},"// 输入输出定义: 说明端口是输入还是输出"),e("\n "),a("span",{class:"token keyword"},"input"),e(" In1"),a("span",{class:"token punctuation"},","),e(" In2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"output"),e(" Out1"),a("span",{class:"token punctuation"},","),e(" Out2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"inout"),e(" InOut1"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token comment"},"// 数据类型定义: 说明端口数据类型 - Net/Register"),e("\n "),a("span",{class:"token keyword"},"wire"),e(" In1"),a("span",{class:"token punctuation"},","),e(" In2"),a("span",{class:"token punctuation"},","),e(" Out1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"wire"),e(" InOut1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"reg"),e(" Out2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token comment"},"// Instantiation of lower level modules"),e("\n Design "),a("span",{class:"token function"},"u_2"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"("),e("端口"),a("span",{class:"token punctuation"},"("),e("信号"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"("),e("端口"),a("span",{class:"token function"},"2"),a("span",{class:"token punctuation"},"("),e("信号"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"("),e("端口"),a("span",{class:"token function"},"3"),a("span",{class:"token punctuation"},"("),e("信号"),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token comment"},"// Functionality"),e("\n\n "),a("span",{class:"token comment"},"// 三种层次的描述: 逻辑层次(Gate Level), 数据流层次(Dataflow Level), 行为层次(Behavior Level)"),e("\n "),a("span",{class:"token comment"},"// and/or - gate level"),e("\n "),a("span",{class:"token keyword"},"and"),e(),a("span",{class:"token function"},"and1"),a("span",{class:"token punctuation"},"("),e(" Out1"),a("span",{class:"token punctuation"},","),e(" In1"),a("span",{class:"token punctuation"},","),e(" In2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token comment"},"// assign - dataflow level"),e("\n "),a("span",{class:"token keyword"},"assign"),e(),a("span",{class:"token number"},"#2"),e(" Out1 "),a("span",{class:"token operator"},"="),e(" In1 "),a("span",{class:"token operator"},"&"),e(" In2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token comment"},"// always/initial - behavior level"),e("\n "),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n Out2 "),a("span",{class:"token operator"},"="),e(" In1 "),a("span",{class:"token operator"},"&"),e(" In2\n "),a("span",{class:"token keyword"},"end"),e("\n\n "),a("span",{class:"token comment"},"// Timing specification"),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br")])],-1),U=a("h3",{id:"外部端口"},[a("a",{class:"header-anchor",href:"#外部端口","aria-hidden":"true"},"#"),e(" 外部端口")],-1),M=a("ul",null,[a("li",null,"封装内部端口,装饰者模式"),a("li",null,"一个内部端口可与多个外部端口相连")],-1),E=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e(" scram_b "),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"data"),a("span",{class:"token punctuation"},"("),e("arb"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"control"),a("span",{class:"token punctuation"},"("),e("ctrl"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"mem_word"),a("span",{class:"token punctuation"},"("),e("mem_blk"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"addr"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"byte"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e(" arb"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"input"),e(" ctrl"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" mem_blk"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token keyword"},"byte"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br")])],-1),L=a("h2",{id:"function"},[a("a",{class:"header-anchor",href:"#function","aria-hidden":"true"},"#"),e(" function")],-1),R=a("ul",null,[a("li",null,"不含时间/事件控制"),a("li",null,"至少 1 个输入"),a("li",null,"至多 1 个输出"),a("li",null,"只含行为模块"),a("li",null,"只含阻塞赋值语句")],-1),F=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"function"),e(" "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" aligned_word"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// function declaration"),e("\n "),a("span",{class:"token keyword"},"input"),e(" "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" word"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n aligned_word "),a("span",{class:"token operator"},"="),e(" word"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("aligned_word "),a("span",{class:"token operator"},"!="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"while"),e(),a("span",{class:"token punctuation"},"("),e("aligned_word"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e(" aligned_word "),a("span",{class:"token operator"},"="),e(" aligned_word "),a("span",{class:"token operator"},"<<"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"endfunction"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),$=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e(" arithmetic_unit "),a("span",{class:"token punctuation"},"("),e("result_1"),a("span",{class:"token punctuation"},","),e(" result_2"),a("span",{class:"token punctuation"},","),e(" operand_1"),a("span",{class:"token punctuation"},","),e(" operand_2"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"output"),e(" "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" result_1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"output"),e(" "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" result_2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"input"),e(" "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" operand_1"),a("span",{class:"token punctuation"},","),e(" operand_2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"assign"),e(" result_1 "),a("span",{class:"token operator"},"="),e(" sum_of_operands "),a("span",{class:"token punctuation"},"("),e("operand_1"),a("span",{class:"token punctuation"},","),e(" operand_2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"assign"),e(" result_2 "),a("span",{class:"token operator"},"="),e(" larger_operand "),a("span",{class:"token punctuation"},"("),e("operand_1"),a("span",{class:"token punctuation"},","),e(" operand_2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"function"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token function"},"sum_of_operands"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" operand_1"),a("span",{class:"token punctuation"},","),e(" operand_2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n sum_of_operands "),a("span",{class:"token operator"},"="),e(" operand_1 "),a("span",{class:"token operator"},"+"),e(" operand_2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endfunction"),e("\n\n "),a("span",{class:"token keyword"},"function"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token function"},"larger_operand"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" operand_1"),a("span",{class:"token punctuation"},","),e(" operand_2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n larger_operand "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),e("operand_1 "),a("span",{class:"token operator"},">="),e(" operand_2"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"?"),e(" operand_1 "),a("span",{class:"token punctuation"},":"),e(" operand_2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endfunction"),e("\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br")])],-1),q=a("h3",{id:"task"},[a("a",{class:"header-anchor",href:"#task","aria-hidden":"true"},"#"),e(" task")],-1),V=a("p",null,"将测试流程分为多个任务:",-1),G=a("ul",null,[a("li",null,"初始化任务"),a("li",null,"模拟生成任务"),a("li",null,"自我检查任务")],-1),X=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e(" adder_task "),a("span",{class:"token punctuation"},"("),e("c_out"),a("span",{class:"token punctuation"},","),e(" sum"),a("span",{class:"token punctuation"},","),e(" clk"),a("span",{class:"token punctuation"},","),e(" reset"),a("span",{class:"token punctuation"},","),e(" c_in"),a("span",{class:"token punctuation"},","),e(" data_a"),a("span",{class:"token punctuation"},","),e(" data_b"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" sum"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token keyword"},"reg"),e(" c_out"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"input"),e(" "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" data_a"),a("span",{class:"token punctuation"},","),e(" data_b"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"input"),e(" clk"),a("span",{class:"token punctuation"},","),e(" reset"),a("span",{class:"token punctuation"},","),e(" c_in"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk "),a("span",{class:"token keyword"},"or"),e(),a("span",{class:"token keyword"},"posedge"),e(" reset"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("reset"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"{"),e("c_out"),a("span",{class:"token punctuation"},","),e(" sum"),a("span",{class:"token operator"},"}"),e(),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"else"),e(" add_values "),a("span",{class:"token punctuation"},"("),e("sum"),a("span",{class:"token punctuation"},","),e(" c_out"),a("span",{class:"token punctuation"},","),e(" data_a"),a("span",{class:"token punctuation"},","),e(" data_b"),a("span",{class:"token punctuation"},","),e(" c_in"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token comment"},"// invoke task"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"task"),e(" add_values"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token comment"},"// task declaration"),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" SUM"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token keyword"},"reg"),e(" C_OUT"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"input"),e(" "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" DATA_A"),a("span",{class:"token punctuation"},","),e(" DATA_B"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"input"),e(" C_IN"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token operator"},"{"),e("C_OUT"),a("span",{class:"token punctuation"},","),e(" SUM"),a("span",{class:"token operator"},"}"),e(),a("span",{class:"token operator"},"="),e(" DATA_A "),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token punctuation"},"("),e("DATA_B "),a("span",{class:"token operator"},"+"),e(" C_IN"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endtask"),e("\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br")])],-1),K=a("p",null,'常用的 task 有: $display("fmt", ...), $monitor("fmt", ...), $time, $finish',-1),j=a("h2",{id:"data-structure"},[a("a",{class:"header-anchor",href:"#data-structure","aria-hidden":"true"},"#"),e(" Data Structure")],-1),Z=a("h3",{id:"常量"},[a("a",{class:"header-anchor",href:"#常量","aria-hidden":"true"},"#"),e(" 常量")],-1),Y=a("ul",null,[a("li",null,"0: 逻辑 0"),a("li",null,"1: 逻辑 1"),a("li",null,"x/X: Unknown/Floating"),a("li",null,"z/Z: 高阻抗状态(High Impedance)"),a("li",null,"parameter: #define")],-1),Q=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"localparam"),e(" idle "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"2'b00"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"parameter"),e(" Bit "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),e(" cnt_up "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1'b1"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token punctuation"},"["),e("Bit "),a("span",{class:"token operator"},"-"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" A"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),e("Bit "),a("span",{class:"token operator"},"-"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" A"),a("span",{class:"token punctuation"},";"),e("\n\nA "),a("span",{class:"token operator"},"="),e(" A "),a("span",{class:"token operator"},"+"),e(" cnt_up"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),J=a("h3",{id:"向量"},[a("a",{class:"header-anchor",href:"#向量","aria-hidden":"true"},"#"),e(" 向量")],-1),nn=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token punctuation"},"["),e("MSB"),a("span",{class:"token punctuation"},":"),e(" LSB"),a("span",{class:"token punctuation"},"]"),e(" 或 "),a("span",{class:"token punctuation"},"["),e("LSB"),a("span",{class:"token punctuation"},":"),e(" MSB"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),sn=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" A"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 4 bit"),e("\n"),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e(" B"),a("span",{class:"token punctuation"},","),e(" C"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 4 bit"),e("\n"),a("span",{class:"token keyword"},"wire"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"63"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" D"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 64 bit"),e("\n"),a("span",{class:"token keyword"},"wire"),e(" E"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 1 bit"),e("\n\nA"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(" B"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"&"),e(" C"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// A[2] = 0 & C[1], A[1] = B[0] & C[2]"),e("\nB"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\nC "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"4'b1011"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// C[0] = 1, C[1] = 0, C[2] = 1, C[3] = 1"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),an=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"integer"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" A "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 4元素数组. 每个元素为16bit元"),e("\n"),a("span",{class:"token keyword"},"reg"),e(" B "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"15"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// arr[4][16]数组, 每个元素为1bit元"),e("\n"),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" C "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"15"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// arr[4][16]数组, 每个元素为8bit元"),e("\n\nA"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 置零A中第三个元素(8 bit)"),e("\nA "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 置零A"),e("\nB"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// B[1][0](1 bit)置1"),e("\nC"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"4'b0010"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// C[0][0] 低4bit为0010"),e("\nC"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// C[2][8] 第5bit为1"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br")])],-1),en=a("h4",{id:"部分位选"},[a("a",{class:"header-anchor",href:"#部分位选","aria-hidden":"true"},"#"),e(" 部分位选")],-1),tn=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[e("vector"),a("span",{class:"token punctuation"},"["),e("base_expr"),a("span",{class:"token operator"},"+"),a("span",{class:"token punctuation"},":"),e(" const_width"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\nvector"),a("span",{class:"token punctuation"},"["),e("base_expr"),a("span",{class:"token operator"},"-"),a("span",{class:"token punctuation"},":"),e(" const_width"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n\ninst_mode"),a("span",{class:"token punctuation"},"["),e("mark"),a("span",{class:"token operator"},"+"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token comment"},"// => mark,mark+1"),e("\ngpio_mode"),a("span",{class:"token punctuation"},"["),e("mark"),a("span",{class:"token operator"},"-"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token comment"},"// => mark,mark-1,mark-2,mark-3"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),on=a("h3",{id:"数字"},[a("a",{class:"header-anchor",href:"#数字","aria-hidden":"true"},"#"),e(" 数字")],-1),ln=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// size ' signed base value"),e("\n"),a("span",{class:"token operator"},"<"),e("Bits长度"),a("span",{class:"token operator"},">"),e("'"),a("span",{class:"token punctuation"},"["),a("span",{class:"token keyword"},"signed"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token operator"},"<"),e("进制"),a("span",{class:"token operator"},"><"),e("数值"),a("span",{class:"token operator"},">"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),cn=a("ul",null,[a("li",null,"位长不能用表达式表示,只可用固定的 parameter")],-1),pn=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[e("Num "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"5'b01101"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 二进制"),e("\nNum "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"22"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 十进制"),e("\nNum "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"12'b0000_1111_0000"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 可读性"),e("\nNum "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"4'hf"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 十六进制(1111)"),e("\nNum "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"4'bxxx1"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 前三位未知"),e("\nNum "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"4'bz01"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 前两位为z, 后两位为01"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),un=a("h4",{id:"有符号数"},[a("a",{class:"header-anchor",href:"#有符号数","aria-hidden":"true"},"#"),e(" 有符号数")],-1),rn=a("ul",null,[a("li",null,"signed reg"),a("li",null,"signed wire"),a("li",null,"integer"),a("li",null,"'sxx")],-1),kn=a("h4",{id:"无符号数"},[a("a",{class:"header-anchor",href:"#无符号数","aria-hidden":"true"},"#"),e(" 无符号数")],-1),bn=a("ul",null,[a("li",null,"reg"),a("li",null,"wire"),a("li",null,"'xx")],-1),mn=a("h3",{id:"register"},[a("a",{class:"header-anchor",href:"#register","aria-hidden":"true"},"#"),e(" Register")],-1),dn=a("ul",null,[a("li",null,"reg/integer/time/real/realtime"),a("li",null,"有记忆性"),a("li",null,"默认值: x")],-1),gn=a("h4",{id:"integer"},[a("a",{class:"header-anchor",href:"#integer","aria-hidden":"true"},"#"),e(" integer")],-1),wn=a("p",null,"长度为 32 Bit, 补码表示, 常用于计数器",-1),yn=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" CLK"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"integer"),e(" i"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"for"),e(),a("span",{class:"token punctuation"},"("),e("i "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("i "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},";"),e(" i "),a("span",{class:"token operator"},"="),e(" i "),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),e(" tmp"),a("span",{class:"token punctuation"},"["),e("i"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(" In"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),hn=a("h4",{id:"real"},[a("a",{class:"header-anchor",href:"#real","aria-hidden":"true"},"#"),e(" real")],-1),fn=a("ul",null,[a("li",null,"real 默认值为 0,不可为 x/z"),a("li",null,"不可声明位宽")],-1),vn=a("h3",{id:"net"},[a("a",{class:"header-anchor",href:"#net","aria-hidden":"true"},"#"),e(" Net")],-1),_n=a("ul",null,[a("li",null,"wire/wand/wor"),a("li",null,"局部变量, 没有记忆性"),a("li",null,"默认值: z"),a("li",null,"wire 间不可直接相连, wand/wor 间课直接相连"),a("li",null,"可用 wire 定义局部变量")],-1),An=a("h2",{id:"gate-level"},[a("a",{class:"header-anchor",href:"#gate-level","aria-hidden":"true"},"#"),e(" Gate Level")],-1),Dn=a("h3",{id:"basic-gate"},[a("a",{class:"header-anchor",href:"#basic-gate","aria-hidden":"true"},"#"),e(" Basic Gate")],-1),Tn=a("ul",null,[a("li",null,"and"),a("li",null,"nand(与非)"),a("li",null,"or"),a("li",null,"nor(或非)"),a("li",null,"xor(异或)"),a("li",null,"xnor(同或)")],-1),xn=a("h3",{id:"use-gate"},[a("a",{class:"header-anchor",href:"#use-gate","aria-hidden":"true"},"#"),e(" Use Gate")],-1),In=a("ul",null,[a("li",null,"同一模块中, 实例名不能与线网名相同")],-1),Bn=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"and"),e(),a("span",{class:"token punctuation"},"("),e("w1"),a("span",{class:"token punctuation"},","),e(" In1"),a("span",{class:"token punctuation"},","),e(" In2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// w1 = Int and In2"),e("\n"),a("span",{class:"token keyword"},"or"),e(),a("span",{class:"token function"},"or1"),a("span",{class:"token punctuation"},"("),e("w2"),a("span",{class:"token punctuation"},","),e(" w1"),a("span",{class:"token punctuation"},","),e(" In2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// w2 = w1 or In2"),e("\n"),a("span",{class:"token keyword"},"xor"),e(),a("span",{class:"token function"},"xor"),a("span",{class:"token punctuation"},"("),e("Out"),a("span",{class:"token punctuation"},","),e(" w1"),a("span",{class:"token punctuation"},","),e(" w2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// Out = w1 xor w2"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),Wn=a("ul",null,[a("li",null,"实例数组")],-1),Cn=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"wire"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" irq"),a("span",{class:"token punctuation"},","),e(" ctrl"),a("span",{class:"token punctuation"},","),e(" sense"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token comment"},"/*\n * =>\n * nand\n * u8nand3 (irq[3], ctrl[3], sense[3]);\n * u8nand2 (irq[2], ctrl[2], sense[2]);\n * u8nand1 (irq[1], ctrl[1], sense[1]);\n * u8nand0 (irq[0], ctrl[0], sense[0]);\n */"),e("\n"),a("span",{class:"token keyword"},"nand"),e(" u8nand "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"("),e("irq"),a("span",{class:"token punctuation"},","),e(" ctrl"),a("span",{class:"token punctuation"},","),e(" sense"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),Hn=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"parameter"),e(" NUM_BITS "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"wire"),e(),a("span",{class:"token punctuation"},"["),e("NUM_BITS "),a("span",{class:"token operator"},"-"),e(),a("span",{class:"token number"},"1"),e(),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" gated_d"),a("span",{class:"token punctuation"},","),e(" din"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"wire"),e(" bypass"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"and"),e(" #"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e(" u0and "),a("span",{class:"token punctuation"},"["),e("NUM_BITS "),a("span",{class:"token operator"},"-"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"("),e("gated_d"),a("span",{class:"token punctuation"},","),e(" din"),a("span",{class:"token punctuation"},","),e(" bypass"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),Nn=a("h3",{id:"self-defined-gate-用户自定义原语"},[a("a",{class:"header-anchor",href:"#self-defined-gate-用户自定义原语","aria-hidden":"true"},"#"),e(" Self-Defined Gate(用户自定义原语)")],-1),On=a("ul",null,[a("li",null,"可以有一个/多个输入"),a("li",null,"只能有一个输出"),a("li",null,"第一个端口必须是输出端口"),a("li",null,[a("code",null,"-"),e(' 表示 值"无变化"')])],-1),zn=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"primitive"),e(" XOR2 "),a("span",{class:"token punctuation"},"("),e("D_OUT"),a("span",{class:"token punctuation"},","),e(" X1"),a("span",{class:"token punctuation"},","),e(" X2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"input"),e(" X1"),a("span",{class:"token punctuation"},","),e(" X2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"output"),e(" D_OUT"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"table"),e(),a("span",{class:"token comment"},"// X1 X2 : D_OUT"),e("\n "),a("span",{class:"token number"},"0"),e(),a("span",{class:"token number"},"0"),e(),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"0"),e(),a("span",{class:"token number"},"1"),e(),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"1"),e(),a("span",{class:"token number"},"0"),e(),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"1"),e(),a("span",{class:"token number"},"1"),e(),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endtable"),e("\n"),a("span",{class:"token keyword"},"endprimitive"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),Sn=a("h2",{id:"dataflow-level"},[a("a",{class:"header-anchor",href:"#dataflow-level","aria-hidden":"true"},"#"),e(" Dataflow Level")],-1),Pn=a("ul",null,[a("li",null,[e("assign net = net/reg: "),a("strong",null,"左式只能是 net")])],-1),Un=a("h3",{id:"operators"},[a("a",{class:"header-anchor",href:"#operators","aria-hidden":"true"},"#"),e(" Operators")],-1),Mn=a("ul",null,[a("li",null,[a("a",{href:"https://hom-wang.gitbooks.io/verilog-hdl/content/Chapter_04.html",target:"_blank",rel:"noopener noreferrer"},"Operators List")])],-1),En=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[e("赋值"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token operator"},"<="),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},"="),e("\n"),a("span",{class:"token operator"},">"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},"<"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},"<="),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},">="),e("\n"),a("span",{class:"token operator"},"!="),a("span",{class:"token punctuation"},"."),e(),a("span",{class:"token operator"},"=="),e("\n"),a("span",{class:"token punctuation"},"["),e(),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),e(),a("span",{class:"token operator"},"{"),e(),a("span",{class:"token operator"},"}"),e("\n"),a("span",{class:"token operator"},"<<"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},">>"),e("\n"),a("span",{class:"token operator"},"+"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},"-"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},"/"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},"%"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),Ln=a("h3",{id:"整数提升"},[a("a",{class:"header-anchor",href:"#整数提升","aria-hidden":"true"},"#"),e(" 整数提升")],-1),Rn=a("ul",null,[a("li",null,"表达式所有中间取 最大位宽(最长(左/右)操作数)")],-1),Fn=a("h4",{id:""},[a("a",{class:"header-anchor",href:"#","aria-hidden":"true"},"#"),e(" { }")],-1),$n=a("p",null,[e("可实现 haskell 中的"),a("strong",null,"模式匹配")],-1),qn=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// 连接运算符"),e("\nA "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"{"),e(),a("span",{class:"token number"},"1'b0"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"1'b1"),a("span",{class:"token operator"},"}"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// A = 2'b01"),e("\nA "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"{"),e(" B"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),e(" C"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),e(" D"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"}"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// A = B[1], B[2], C[0], D[2]"),e("\nA "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"{"),e(),a("span",{class:"token number"},"2"),a("span",{class:"token operator"},"{"),a("span",{class:"token number"},"2'b01"),a("span",{class:"token operator"},"}"),e(),a("span",{class:"token operator"},"}"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// A = 4'b0101"),e("\nA "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"{"),e(),a("span",{class:"token number"},"3'b101"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"2"),a("span",{class:"token operator"},"{"),a("span",{class:"token number"},"1'b0"),a("span",{class:"token operator"},"}"),e(),a("span",{class:"token operator"},"}"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// A = 5'b101_00"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),Vn=a("h2",{id:"behavior-level"},[a("a",{class:"header-anchor",href:"#behavior-level","aria-hidden":"true"},"#"),e(" Behavior Level")],-1),Gn=a("ul",null,[a("li",null,[e("reg = net/reg: *"),a("em",null,"左式只能是 reg")])],-1),Xn=a("h3",{id:"时延控制"},[a("a",{class:"header-anchor",href:"#时延控制","aria-hidden":"true"},"#"),e(" 时延控制")],-1),Kn=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[e("#num\n\n"),a("span",{class:"token keyword"},"parameter"),e(" cycle "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"30"),a("span",{class:"token punctuation"},";"),e("\n\n# "),a("span",{class:"token number"},"2"),e("\n# cycle"),a("span",{class:"token operator"},"/"),a("span",{class:"token number"},"2"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),jn=a("h3",{id:"事件控制"},[a("a",{class:"header-anchor",href:"#事件控制","aria-hidden":"true"},"#"),e(" 事件控制")],-1),Zn=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[e("@"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n@"),a("span",{class:"token punctuation"},"("),e(" sel"),a("span",{class:"token punctuation"},","),e(" a"),a("span",{class:"token punctuation"},","),e(" b"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n@"),a("span",{class:"token punctuation"},"("),e("sel "),a("span",{class:"token keyword"},"or"),e(" a "),a("span",{class:"token keyword"},"or"),e(" b"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n@"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" CLK"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n@"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"negedge"),e(" CLK"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),Yn=a("h3",{id:"语句内-间控制"},[a("a",{class:"header-anchor",href:"#语句内-间控制","aria-hidden":"true"},"#"),e(" 语句内/间控制")],-1),Qn=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[e("q "),a("span",{class:"token operator"},"="),e(" @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk_iol"),a("span",{class:"token punctuation"},")"),e(" d"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token comment"},"// 语句内事件控制"),e("\n\n@"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk_iol"),a("span",{class:"token punctuation"},")"),e(" "),a("span",{class:"token comment"},"// 语句间事件控制"),e("\n q "),a("span",{class:"token operator"},"="),e(" temp"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Jn=a("h3",{id:"always"},[a("a",{class:"header-anchor",href:"#always","aria-hidden":"true"},"#"),e(" always")],-1),ns=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),e("事件"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),e(" 事件"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),ss=a("h3",{id:"if-else"},[a("a",{class:"header-anchor",href:"#if-else","aria-hidden":"true"},"#"),e(" if-else")],-1),as=a("ul",null,[a("li",null,"必须添加 else")],-1),es=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("condition1"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n"),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("condition2"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n"),a("span",{class:"token keyword"},"else"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br")])],-1),ts=a("h3",{id:"case-statement"},[a("a",{class:"header-anchor",href:"#case-statement","aria-hidden":"true"},"#"),e(" Case Statement")],-1),os=a("ul",null,[a("li",null,"expr: 常量/变量/连接运算符{ }/x/z"),a("li",null,"casex: 当输入某一位为 x/z 时,忽略此位匹配(恒将此位匹配为真)"),a("li",null,"casez: 当输入某一位为 z 时,忽略此位匹配(恒将此位匹配为真)")],-1),ls=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"case"),e(),a("span",{class:"token punctuation"},"("),e("expr"),a("span",{class:"token punctuation"},")"),e("\n item "),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n item "),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},":"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n item "),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"default"),a("span",{class:"token punctuation"},":"),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"endcase"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br")])],-1),cs=a("h3",{id:"for"},[a("a",{class:"header-anchor",href:"#for","aria-hidden":"true"},"#"),e(" for")],-1),ps=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"for"),e(),a("span",{class:"token punctuation"},"("),e("循环初值"),a("span",{class:"token punctuation"},";"),e(" 循环条件"),a("span",{class:"token punctuation"},";"),e(" 控制部分"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),us=a("h3",{id:"repeat-loop"},[a("a",{class:"header-anchor",href:"#repeat-loop","aria-hidden":"true"},"#"),e(" repeat loop")],-1),rs=a("ul",null,[a("li",null,[e("initial for "),a("strong",null,"test bench")]),a("li",null,[e("当需 if/else 进行断言时,注意 "),a("strong",null,"延时"),e(" 造成的错误逻辑")])],-1),is=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// 重复事件控制:"),e("\n"),a("span",{class:"token comment"},"// 先计算好右值, 等待时钟 clk 上出现2个负跳变沿, 再把右值赋给 result"),e("\nresult "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"repeat"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e(" @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"negedge"),e(" clk"),a("span",{class:"token punctuation"},")"),e(" hw_data "),a("span",{class:"token operator"},"+"),e(" hr_data"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token comment"},"// repeat 循环语句:"),e("\n"),a("span",{class:"token keyword"},"repeat"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e("\n @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk"),a("span",{class:"token punctuation"},")"),e(" result "),a("span",{class:"token operator"},"="),e(" hw_data "),a("span",{class:"token operator"},"+"),e(" hr_data"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),ks=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"initial"),e(),a("span",{class:"token keyword"},"begin"),e("\n inc_DAC "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1"),e("’b1"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token function"},"repeat"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4095"),a("span",{class:"token punctuation"},")"),e(" @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token comment"},"// bring DAC right up to point of rollover"),e("\n inc_DAC "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1"),e("’b0"),a("span",{class:"token punctuation"},";"),e("\n inc_sym "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1"),e("’b1"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token function"},"repeat"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},")"),e("@"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token comment"},"// bring sample count up to 7"),e("\n inc_sym "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1"),e("’b0"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"end"),e("\n\n"),a("span",{class:"token keyword"},"initial"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token number"},"#100"),e(),a("span",{class:"token property"},"$finish"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token comment"},"// run simulation for 100 units"),e("\n"),a("span",{class:"token keyword"},"end"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br")])],-1),bs=a("h3",{id:"forever-loop"},[a("a",{class:"header-anchor",href:"#forever-loop","aria-hidden":"true"},"#"),e(" forever loop")],-1),ms=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// $stop, $finish 可以终止 forever loop"),e("\n"),a("span",{class:"token keyword"},"forever"),e(),a("span",{class:"token number"},"#10"),e(" clk "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"~"),e(" clk"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),ds=a("h3",{id:"force-and-release"},[a("a",{class:"header-anchor",href:"#force-and-release","aria-hidden":"true"},"#"),e(" Force and Release")],-1),gs=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"initial"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"force"),e(" test_reset "),a("span",{class:"token operator"},"="),e(" penalty "),a("span",{class:"token operator"},"&"),e(" rtc_intr"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"#5"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"release"),e(" test_reset"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),ws=a("h3",{id:"blocking-and-non-blocking"},[a("a",{class:"header-anchor",href:"#blocking-and-non-blocking","aria-hidden":"true"},"#"),e(" Blocking and Non-Blocking")],-1),ys=a("ul",null,[a("li",null,"Blocking(=): 顺序执行"),a("li",null,"Non-Blocking(<=): 并行执行")],-1),hs=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token operator"},"="),e(" input_logic"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token operator"},"<="),e(" input_logic"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),fs=a("h3",{id:"disable"},[a("a",{class:"header-anchor",href:"#disable","aria-hidden":"true"},"#"),e(" disable")],-1),vs=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"begin"),e(),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token keyword"},"break"),e("\n "),a("span",{class:"token keyword"},"for"),e(),a("span",{class:"token punctuation"},"("),e("i "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(" i "),a("span",{class:"token operator"},"<"),e(" n"),a("span",{class:"token punctuation"},";"),e(" i "),a("span",{class:"token operator"},"="),e(" i"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e(),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token keyword"},"continue"),e("\n @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("a "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token comment"},'// "continue" loop'),e("\n "),a("span",{class:"token keyword"},"disable"),e(),a("span",{class:"token keyword"},"continue"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("a "),a("span",{class:"token operator"},"=="),e(" b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token comment"},'// "break" from loop'),e("\n "),a("span",{class:"token keyword"},"disable"),e(),a("span",{class:"token keyword"},"break"),a("span",{class:"token punctuation"},";"),e("\n statement1\n statement2\n "),a("span",{class:"token keyword"},"end"),e("\n"),a("span",{class:"token keyword"},"end"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),_s=a("h2",{id:"结构建模"},[a("a",{class:"header-anchor",href:"#结构建模","aria-hidden":"true"},"#"),e(" 结构建模")],-1),As=a("h3",{id:"generate-语句"},[a("a",{class:"header-anchor",href:"#generate-语句","aria-hidden":"true"},"#"),e(" generate 语句")],-1),Ds=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"generate"),e("\n "),a("span",{class:"token keyword"},"for"),e(),a("span",{class:"token punctuation"},"("),e("gv_i "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(" gv_i "),a("span",{class:"token operator"},"<"),e(" SIZE"),a("span",{class:"token punctuation"},";"),e(" gv_i "),a("span",{class:"token operator"},"="),e(" gv_i "),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"begin"),a("span",{class:"token punctuation"},":"),e(" blk\n "),a("span",{class:"token keyword"},"xor"),e(" uxor "),a("span",{class:"token punctuation"},"("),e("y"),a("span",{class:"token punctuation"},"["),e("gv_i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),e(" a"),a("span",{class:"token punctuation"},"["),e("gv_i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),e(" b"),a("span",{class:"token punctuation"},"["),e("gv_i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n"),a("span",{class:"token keyword"},"endgenerate"),e("\n"),a("span",{class:"token comment"},"// =>"),e("\n"),a("span",{class:"token comment"},"// module.blk[0].uxor"),e("\n"),a("span",{class:"token comment"},"// module.blk[1].uxor"),e("\n"),a("span",{class:"token comment"},"// module.blk[2].uxor"),e("\n"),a("span",{class:"token comment"},"// ..."),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),Ts=a("h2",{id:"delay-时延"},[a("a",{class:"header-anchor",href:"#delay-时延","aria-hidden":"true"},"#"),e(" Delay(时延)")],-1),xs=a("ul",null,[a("li",null,"语句内时延"),a("li",null,"语句间时延"),a("li",null,"语句内时延期间:右值保持稳定不变,才可成功赋给左值")],-1),Is=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[e("sum "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),e("a "),a("span",{class:"token operator"},"^"),e(" b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"^"),e(" cin"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token number"},"#4"),e(" t1 "),a("span",{class:"token operator"},"="),e(" a "),a("span",{class:"token operator"},"&"),e(" cin"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Bs=a("h2",{id:"预编译指令"},[a("a",{class:"header-anchor",href:"#预编译指令","aria-hidden":"true"},"#"),e(" 预编译指令")],-1),Ws=a("h3",{id:"define-宏"},[a("a",{class:"header-anchor",href:"#define-宏","aria-hidden":"true"},"#"),e(" define 宏")],-1),Cs=a("p",null,"将多个 define 宏,放至 _defines.v, 作为全局宏",-1),Hs=a("h2",{id:"data-path"},[a("a",{class:"header-anchor",href:"#data-path","aria-hidden":"true"},"#"),e(" Data Path")],-1),Ns=a("h3",{id:"multiplexer"},[a("a",{class:"header-anchor",href:"#multiplexer","aria-hidden":"true"},"#"),e(" Multiplexer")],-1),Os=a("h3",{id:"adder"},[a("a",{class:"header-anchor",href:"#adder","aria-hidden":"true"},"#"),e(" Adder")],-1),zs=a("h3",{id:"register-data-path"},[a("a",{class:"header-anchor",href:"#register-data-path","aria-hidden":"true"},"#"),e(" Register Data Path")],-1),Ss=a("h3",{id:"memory"},[a("a",{class:"header-anchor",href:"#memory","aria-hidden":"true"},"#"),e(" Memory")],-1),Ps=a("ul",null,[a("li",null,"其中数据文件中地址必须在系统任务中定义的范围内,系统任务中定义的地址必须在存储器定义的地址范围内"),a("li",null,"优先考虑数据文件中的地址>系统任务中定义的起始地址和结束地址>存储器定义的起始地址和结束地址")],-1),Us=a("h2",{id:"demos"},[a("a",{class:"header-anchor",href:"#demos","aria-hidden":"true"},"#"),e(" Demos")],-1),Ms=a("ul",null,[a("li",null,[a("a",{href:"https://hom-wang.gitbooks.io/verilog-hdl/content/Chapter_07.html",target:"_blank",rel:"noopener noreferrer"},"GitBook")]),a("li",null,[a("a",{href:"http://www.xilinx.com/support/university/ise/ise-teaching-material/hdl-design.html",target:"_blank",rel:"noopener noreferrer"},"Xilinx Lab")])],-1),Es=a("h3",{id:"binary-multiplier"},[a("a",{class:"header-anchor",href:"#binary-multiplier","aria-hidden":"true"},"#"),e(" Binary Multiplier")],-1),Ls=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[e(" "),a("span",{class:"token number"},"1100"),e(),a("span",{class:"token punctuation"},"("),e("the multiplicand"),a("span",{class:"token punctuation"},")"),e("\nx "),a("span",{class:"token number"},"1011"),e(),a("span",{class:"token punctuation"},"("),e("the multiplier"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token operator"},"----"),e("\n "),a("span",{class:"token number"},"0000"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"initial"),e(" partial product"),a("span",{class:"token punctuation"},","),e(" start "),a("span",{class:"token keyword"},"with"),e(),a("span",{class:"token number"},"0000"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token number"},"1100"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),e("st multiplier "),a("span",{class:"token keyword"},"bit"),e(" is "),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),e(" so add the multiplicand"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token operator"},"----"),e("\n "),a("span",{class:"token number"},"1100"),e(),a("span",{class:"token punctuation"},"("),e("sum"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token operator"},"----"),e("\n "),a("span",{class:"token number"},"01100"),e(),a("span",{class:"token punctuation"},"("),e("shift sum one position to the right"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token number"},"1100"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),e("nd multiplier "),a("span",{class:"token keyword"},"bit"),e(" is "),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),e(" so add multiplicand again"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token operator"},"----"),e("\n "),a("span",{class:"token number"},"100100"),e(),a("span",{class:"token punctuation"},"("),e("sum"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"with"),e(" a carry generated on the left"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token operator"},"----"),e("\n "),a("span",{class:"token number"},"100100"),e(),a("span",{class:"token punctuation"},"("),e("shift sum once to the right"),a("span",{class:"token punctuation"},","),e(" including carry"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token number"},"0100100"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),e("rd multiplier "),a("span",{class:"token keyword"},"bit"),e(" is "),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),e(" so skip add"),a("span",{class:"token punctuation"},","),e(" shift once"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token operator"},"----"),e("\n "),a("span",{class:"token number"},"1100"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),e("th multiplier "),a("span",{class:"token keyword"},"bit"),e(" is "),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),e(" so add multiplicand again"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token operator"},"----"),e("\n "),a("span",{class:"token number"},"10000100"),e(),a("span",{class:"token punctuation"},"("),e("sum"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"with"),e(" a carry generated on the left"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token number"},"10000100"),e(),a("span",{class:"token punctuation"},"("),e("shift sum once to the right"),a("span",{class:"token punctuation"},","),e(" including carry"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br")])],-1),Rs=a("h3",{id:"multi-hz"},[a("a",{class:"header-anchor",href:"#multi-hz","aria-hidden":"true"},"#"),e(" Multi-Hz")],-1),Fs=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/*\n * 利用计数器实现任意分频\n */"),e("\n"),a("span",{class:"token important"},"always"),e(" @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" f_clk"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n\n "),a("span",{class:"token comment"},"//设定频率控制字p "),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("i "),a("span",{class:"token operator"},"=="),e(" p"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n i"),a("span",{class:"token operator"},"="),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n f_out"),a("span",{class:"token operator"},"=~"),e("f_out"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token keyword"},"begin"),e("\n i"),a("span",{class:"token operator"},"="),e("i"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n"),a("span",{class:"token keyword"},"end"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br")])],-1),$s=a("h2",{id:"tips"},[a("a",{class:"header-anchor",href:"#tips","aria-hidden":"true"},"#"),e(" Tips")],-1),qs=a("h3",{id:"不可综合结构"},[a("a",{class:"header-anchor",href:"#不可综合结构","aria-hidden":"true"},"#"),e(" 不可综合结构")],-1),Vs=a("ul",null,[a("li",null,"initial: 只用于 test bench"),a("li",null,"events: Events 同步测试各个组件"),a("li",null,"real: Real 数据类型不可综合"),a("li",null,"time: Time 数据类型不可综合"),a("li",null,"force/release"),a("li",null,"assign(reg)/deassign(reg)"),a("li",null,"fork join"),a("li",null,"primitive: 只有门级的原语(primitives)可综合"),a("li",null,"table: 用户自定义原语(UDP)及 table 不可综合"),a("li",null,[a("code",null,"#1"),e(" 延迟只用于仿真,综合器直接忽略延迟")])],-1),Gs=a("h3",{id:"混合编程"},[a("a",{class:"header-anchor",href:"#混合编程","aria-hidden":"true"},"#"),e(" 混合编程")],-1),Xs=a("ul",null,[a("li",null,"内部变量用 assign 赋值"),a("li",null,"输出变量通过监听 内部变量 改变输出值")],-1),Ks=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[e(" "),a("span",{class:"token keyword"},"assign"),e(" DT0 "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"assign"),e(" DT1 "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),e("DT0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n AOut "),a("span",{class:"token operator"},"<="),e(" DT0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),e("DT1"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n BOut "),a("span",{class:"token operator"},"<="),e(" DT1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br")])],-1),js=a("h3",{id:"上升沿-下降沿"},[a("a",{class:"header-anchor",href:"#上升沿-下降沿","aria-hidden":"true"},"#"),e(" 上升沿/下降沿")],-1),Zs=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[e(" "),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" A "),a("span",{class:"token keyword"},"or"),e(),a("span",{class:"token keyword"},"negedge"),e(" B"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("A"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),e("\n "),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),e("B"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),e("\n "),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),e("\n "),a("span",{class:"token keyword"},"end"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),Ys=a("h3",{id:"parameter"},[a("a",{class:"header-anchor",href:"#parameter","aria-hidden":"true"},"#"),e(" Parameter")],-1),Qs=a("ul",null,[a("li",null,"只在定义的模块内部起作用")],-1),Js=a("h4",{id:"overload-method"},[a("a",{class:"header-anchor",href:"#overload-method","aria-hidden":"true"},"#"),e(" Overload Method")],-1),na=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e(" data_path\n#"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"parameter"),e(" DATA_WIDTH "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token keyword"},"input"),e(" A"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH "),a("span",{class:"token operator"},"-"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" B"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH "),a("span",{class:"token operator"},"-"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" C\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),sa=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e(" data_path_tb\n"),a("span",{class:"token punctuation"},"("),e("\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n data_path #"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"DATA_WIDTH"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"16"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(" DUT "),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"A"),a("span",{class:"token punctuation"},"("),e("A"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"B"),a("span",{class:"token punctuation"},"("),e("B"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"C"),a("span",{class:"token punctuation"},"("),e("C"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),aa=a("h4",{id:"constant-variable"},[a("a",{class:"header-anchor",href:"#constant-variable","aria-hidden":"true"},"#"),e(" Constant Variable")],-1),ea=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[e("reset_value "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"{{"),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH"),a("span",{class:"token operator"},"/"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"{"),a("span",{class:"token number"},"1'b0"),a("span",{class:"token operator"},"}}"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},"{"),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH"),a("span",{class:"token operator"},"/"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"{"),a("span",{class:"token number"},"1'b1"),a("span",{class:"token operator"},"}}}"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),ta=a("h4",{id:"test-bench"},[a("a",{class:"header-anchor",href:"#test-bench","aria-hidden":"true"},"#"),e(" Test Bench")],-1),oa=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token important"},"always "),a("span",{class:"token keyword"},"begin"),e("\n clk "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"forever"),e(" #DELAY clk "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"~"),e("clk"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"end"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),la=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"reg"),e(" clock"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"integer"),e(" no_of_clocks"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"parameter"),e(" CLOCK_PERIOD "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"parameter"),e(" TIME "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"50000"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"initial"),e(" no_of_clocks "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"initial"),e(" clock "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1'b0"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token important"},"always "),e("#"),a("span",{class:"token punctuation"},"("),e("CLOCK_PERIOD"),a("span",{class:"token operator"},"/"),a("span",{class:"token number"},"2.0"),a("span",{class:"token punctuation"},")"),e(" clock "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"~"),e("clock"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clock"),a("span",{class:"token punctuation"},")"),e("\n no_of_clocks "),a("span",{class:"token operator"},"="),e(" no_of_clocks "),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),e(),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"initial"),e(),a("span",{class:"token keyword"},"begin"),e("\n #TIME"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token property"},"$display"),a("span",{class:"token punctuation"},"("),e('"End of simulation '),a("span",{class:"token keyword"},"time"),e(" is "),a("span",{class:"token operator"},"%"),e("d "),a("span",{class:"token punctuation"},","),e("\n total number of clocks seen is "),a("span",{class:"token operator"},"%"),e("d expected is "),a("span",{class:"token operator"},"%"),e('d"'),a("span",{class:"token punctuation"},","),a("span",{class:"token property"},"$time"),a("span",{class:"token punctuation"},","),e("no_of_clocks"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token property"},"$time"),a("span",{class:"token operator"},"/"),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token property"},"$finish"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"end"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br")])],-1),ca=a("h2",{id:"有限状态机-fsm"},[a("a",{class:"header-anchor",href:"#有限状态机-fsm","aria-hidden":"true"},"#"),e(" 有限状态机(FSM)")],-1),pa=a("ul",null,[a("li",null,"reset: initial state"),a("li",null,"default: illegal/unreachable state")],-1),ua=a("h2",{id:"算术状态机-asm"},[a("a",{class:"header-anchor",href:"#算术状态机-asm","aria-hidden":"true"},"#"),e(" 算术状态机(ASM)")],-1),ra=a("ul",null,[a("li",null,"state box: moore fsm"),a("li",null,"conditional box: mealy fsm"),a("li",null,[e("decision box: "),a("code",null,"x_input"),e(" = 0/1")])],-1),ia=a("h2",{id:"system-verilog"},[a("a",{class:"header-anchor",href:"#system-verilog","aria-hidden":"true"},"#"),e(" System Verilog")],-1),ka=a("h3",{id:"enum"},[a("a",{class:"header-anchor",href:"#enum","aria-hidden":"true"},"#"),e(" Enum")],-1),ba=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"typedef"),e(),a("span",{class:"token keyword"},"enum"),e(),a("span",{class:"token keyword"},"logic"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"{"),e("\n RED"),a("span",{class:"token punctuation"},","),e(" GREEN"),a("span",{class:"token punctuation"},","),e(" BLUE"),a("span",{class:"token punctuation"},","),e(" CYAN"),a("span",{class:"token punctuation"},","),e(" MAGENTA"),a("span",{class:"token punctuation"},","),e(" YELLOW\n"),a("span",{class:"token operator"},"}"),e(" color_t"),a("span",{class:"token punctuation"},";"),e("\n\ncolor_t my_color "),a("span",{class:"token operator"},"="),e(" GREEN"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"initial"),e(),a("span",{class:"token property"},"$display"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"The color is %s"'),a("span",{class:"token punctuation"},","),e(" my_color"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"name"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),ma=a("h3",{id:"struct-and-union"},[a("a",{class:"header-anchor",href:"#struct-and-union","aria-hidden":"true"},"#"),e(" Struct and Union")],-1),da=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"typedef"),e(),a("span",{class:"token keyword"},"struct"),e(),a("span",{class:"token keyword"},"packed"),e(),a("span",{class:"token operator"},"{"),e("\n "),a("span",{class:"token keyword"},"bit"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" expo"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"bit"),e(" sign"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"bit"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"51"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" man"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token operator"},"}"),e(" FP"),a("span",{class:"token punctuation"},";"),e("\n\nFP zero "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"64'b0"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),ga=a("h3",{id:"procedural-block"},[a("a",{class:"header-anchor",href:"#procedural-block","aria-hidden":"true"},"#"),e(" Procedural Block")],-1),wa=a("ul",null,[a("li",null,"always_comb: 用于组合逻辑电路(相当于 Verilog 中对所有输入变量电平敏感的 always,但 always_comb 无需手动列出所有输入变量,系统会自动识别)"),a("li",null,"always_ff: 用于触发器及相关的时序逻辑电路(相当于 Verilog 中对某个或某几个信号有效跳变沿敏感、并带有信号储存特性的 always)"),a("li",null,"always_latch: 用于锁存器级相关的时序逻辑电路(相当于 Verilog 中对某个或某几个信号电平敏感、并带有信号储存特性的的 always)")],-1),ya=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token important"},"always_comb "),a("span",{class:"token keyword"},"begin"),e("\n tmp "),a("span",{class:"token operator"},"="),e(" b "),a("span",{class:"token operator"},"*"),e(" b "),a("span",{class:"token operator"},"-"),e(),a("span",{class:"token number"},"4"),e(),a("span",{class:"token operator"},"*"),e(" a "),a("span",{class:"token operator"},"*"),e(" c"),a("span",{class:"token punctuation"},";"),e("\n no_root "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),e("tmp "),a("span",{class:"token operator"},"<"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"end"),e("\n\n"),a("span",{class:"token important"},"always_ff @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk"),a("span",{class:"token punctuation"},")"),e("\n count "),a("span",{class:"token operator"},"<="),e(" count "),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e("\n\n\n"),a("span",{class:"token important"},"always_latch"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("en"),a("span",{class:"token punctuation"},")"),e(" q "),a("span",{class:"token operator"},"<="),e(" d"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),ha=a("h3",{id:"interface"},[a("a",{class:"header-anchor",href:"#interface","aria-hidden":"true"},"#"),e(" Interface")],-1),fa=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"interface"),e(" interfaceName"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"logic"),e(" a"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"logic"),e(" b"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"modport"),e(" in "),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"input"),e(" a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"output"),e(" b"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"modport"),e(" out "),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"input"),e(" b"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"output"),e(" a"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"endinterface"),e("\n\n"),a("span",{class:"token keyword"},"module"),e(" top"),a("span",{class:"token punctuation"},";"),e("\n interfaceName i "),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n u_a m1 "),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"i1"),a("span",{class:"token punctuation"},"("),e("i"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n u_b m2 "),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"i2"),a("span",{class:"token punctuation"},"("),e("i"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"endmodule"),e("\n\n"),a("span",{class:"token keyword"},"module"),e(" u_a "),a("span",{class:"token punctuation"},"("),e("interfaceName"),a("span",{class:"token punctuation"},"."),e("in i1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"endmodule"),e("\n\n"),a("span",{class:"token keyword"},"module"),e(" u_b "),a("span",{class:"token punctuation"},"("),e("interfaceName"),a("span",{class:"token punctuation"},"."),e("out i2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br")])],-1),va=a("h3",{id:"testing"},[a("a",{class:"header-anchor",href:"#testing","aria-hidden":"true"},"#"),e(" Testing")],-1),_a=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e(" top"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"integer"),e(" num_packets "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token property"},"$random"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"reg"),e(" A"),a("span",{class:"token punctuation"},","),e(" B"),a("span",{class:"token punctuation"},","),e(" C"),a("span",{class:"token punctuation"},","),e(" clk"),a("span",{class:"token punctuation"},","),e(" reset_n"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"wire"),e(" D"),a("span",{class:"token punctuation"},";"),e("\n register_logic "),a("span",{class:"token function"},"dut"),a("span",{class:"token punctuation"},"("),e("A"),a("span",{class:"token punctuation"},","),e(" B"),a("span",{class:"token punctuation"},","),e(" C"),a("span",{class:"token punctuation"},","),e(" clk"),a("span",{class:"token punctuation"},","),e(" reset_n"),a("span",{class:"token punctuation"},","),e(" D"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token comment"},"// generate clock"),e("\n "),a("span",{class:"token comment"},"// ..."),e("\n\n "),a("span",{class:"token keyword"},"initial"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token function"},"run"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n "),a("span",{class:"token keyword"},"task"),e(),a("span",{class:"token function"},"run"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n reset_n "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"#20"),e(" reset_n "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk"),a("span",{class:"token punctuation"},")"),e(" reset_n "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"#1"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"repeat"),e(),a("span",{class:"token punctuation"},"("),e("num_packets"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n A "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token property"},"$random"),a("span",{class:"token punctuation"},";"),e(" B "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token property"},"$random"),a("span",{class:"token punctuation"},";"),e(" C "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token property"},"$random"),a("span",{class:"token punctuation"},";"),e("\n @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token property"},"$display"),a("span",{class:"token punctuation"},"("),e("A"),a("span",{class:"token punctuation"},","),e(" B"),a("span",{class:"token punctuation"},","),e(" C"),a("span",{class:"token punctuation"},","),e(" D"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token property"},"$finish"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endtask"),e("\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br")])],-1),Aa=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(" Packet"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"string"),e(" name"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"rand"),e(),a("span",{class:"token keyword"},"bit"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" sa"),a("span",{class:"token punctuation"},","),e(" da"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"rand"),e(),a("span",{class:"token keyword"},"reg"),e(" A"),a("span",{class:"token punctuation"},","),e(" B"),a("span",{class:"token punctuation"},","),e(" C"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"function"),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"display"),a("span",{class:"token punctuation"},"("),e("result"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token property"},"$display"),a("span",{class:"token punctuation"},"("),e("A"),a("span",{class:"token punctuation"},","),e(" B"),a("span",{class:"token punctuation"},","),e(" C"),a("span",{class:"token punctuation"},","),e(" result"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endfunction"),e("\n"),a("span",{class:"token keyword"},"endclass"),a("span",{class:"token punctuation"},":"),e(" Packet\n\n"),a("span",{class:"token comment"},"// inheritance"),e("\n"),a("span",{class:"token keyword"},"class"),e(" Packet_da_3 "),a("span",{class:"token keyword"},"extends"),e(" Packet"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"constraint"),e(" da_3 "),a("span",{class:"token operator"},"{"),e("\n da "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token operator"},"}"),e("\n\n "),a("span",{class:"token keyword"},"function"),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"display"),a("span",{class:"token punctuation"},"("),e("result"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"super"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"display"),a("span",{class:"token punctuation"},"("),e("result"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token property"},"$display"),a("span",{class:"token punctuation"},"("),e("sa"),a("span",{class:"token punctuation"},","),e(" da"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endfunction"),e("\n"),a("span",{class:"token keyword"},"endclass"),a("span",{class:"token punctuation"},":"),e(" Packet_da_3\n\n"),a("span",{class:"token keyword"},"class"),e(" Generator"),a("span",{class:"token punctuation"},";"),e("\n Packet pkt"),a("span",{class:"token punctuation"},";"),e("\n Channel out_chan"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"int"),e(" num_packets"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"function"),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"gen"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n pkt "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token function"},"new"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},":"),e("\n pkt"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"randomize"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n out_chan"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"put"),a("span",{class:"token punctuation"},"("),e("pkt"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endfunction"),e("\n\n "),a("span",{class:"token keyword"},"task"),e(),a("span",{class:"token function"},"run"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"while"),e(),a("span",{class:"token punctuation"},"("),e("num_packets"),a("span",{class:"token operator"},"--"),e(),a("span",{class:"token operator"},"!="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token function"},"gen"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endtask"),e("\n"),a("span",{class:"token keyword"},"endclass"),e("\n\n"),a("span",{class:"token keyword"},"class"),e(" Driver"),a("span",{class:"token punctuation"},";"),e("\n Channel in_chan"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"task"),e(),a("span",{class:"token function"},"send"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n in_chan"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"get"),a("span",{class:"token punctuation"},"("),e("pkt"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n top"),a("span",{class:"token punctuation"},"."),e("A "),a("span",{class:"token operator"},"="),e(" pkt"),a("span",{class:"token punctuation"},"."),e("A"),a("span",{class:"token punctuation"},";"),e("\n top"),a("span",{class:"token punctuation"},"."),e("B "),a("span",{class:"token operator"},"="),e(" pkt"),a("span",{class:"token punctuation"},"."),e("B"),a("span",{class:"token punctuation"},";"),e("\n top"),a("span",{class:"token punctuation"},"."),e("C "),a("span",{class:"token operator"},"="),e(" pkt"),a("span",{class:"token punctuation"},"."),e("C"),a("span",{class:"token punctuation"},";"),e("\n @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" top"),a("span",{class:"token punctuation"},"."),e("clk"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endtask"),e("\n\n "),a("span",{class:"token keyword"},"task"),e(),a("span",{class:"token function"},"run"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"forever"),e(),a("span",{class:"token function"},"send"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endtask"),e("\n"),a("span",{class:"token keyword"},"endclass"),e("\n\n"),a("span",{class:"token keyword"},"module"),e(" top"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"initial"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token function"},"build"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token function"},"run"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n "),a("span",{class:"token keyword"},"task"),e(),a("span",{class:"token function"},"build"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n Config cfg "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token function"},"new"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n Channel chan "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token function"},"new"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n Generator gen "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token function"},"new"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n Driver drv "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token function"},"new"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n gen"),a("span",{class:"token punctuation"},"."),e("out_chan "),a("span",{class:"token operator"},"="),e(" chan"),a("span",{class:"token punctuation"},";"),e("\n drv"),a("span",{class:"token punctuation"},"."),e("in_chan "),a("span",{class:"token operator"},"="),e(" chan"),a("span",{class:"token punctuation"},";"),e("\n\n cfg"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"randomize"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"with"),e(),a("span",{class:"token operator"},"{"),e(" num_packets "),a("span",{class:"token operator"},">"),e(),a("span",{class:"token number"},"1500"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token operator"},"}"),e("\n gen"),a("span",{class:"token punctuation"},"."),e("num_packets "),a("span",{class:"token operator"},"="),e(" cfg"),a("span",{class:"token punctuation"},"."),e("num_packets"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endtask"),e("\n\n "),a("span",{class:"token keyword"},"task"),e(),a("span",{class:"token function"},"run"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"fork"),e("\n gen"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"run"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n drv"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"run"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"join"),e("\n "),a("span",{class:"token property"},"$finish"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endtask"),e("\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br"),a("span",{class:"line-number"},"58"),a("br"),a("span",{class:"line-number"},"59"),a("br"),a("span",{class:"line-number"},"60"),a("br"),a("span",{class:"line-number"},"61"),a("br"),a("span",{class:"line-number"},"62"),a("br"),a("span",{class:"line-number"},"63"),a("br"),a("span",{class:"line-number"},"64"),a("br"),a("span",{class:"line-number"},"65"),a("br"),a("span",{class:"line-number"},"66"),a("br"),a("span",{class:"line-number"},"67"),a("br"),a("span",{class:"line-number"},"68"),a("br"),a("span",{class:"line-number"},"69"),a("br"),a("span",{class:"line-number"},"70"),a("br"),a("span",{class:"line-number"},"71"),a("br"),a("span",{class:"line-number"},"72"),a("br"),a("span",{class:"line-number"},"73"),a("br"),a("span",{class:"line-number"},"74"),a("br"),a("span",{class:"line-number"},"75"),a("br"),a("span",{class:"line-number"},"76"),a("br"),a("span",{class:"line-number"},"77"),a("br"),a("span",{class:"line-number"},"78"),a("br"),a("span",{class:"line-number"},"79"),a("br"),a("span",{class:"line-number"},"80"),a("br"),a("span",{class:"line-number"},"81"),a("br")])],-1),Da=a("h2",{id:"u280-platform"},[a("a",{class:"header-anchor",href:"#u280-platform","aria-hidden":"true"},"#"),e(" U280 Platform")],-1),Ta=a("div",{class:"language-bash line-numbers-mode"},[a("pre",null,[a("code",null,[e("-xp param "),a("span",{class:"token punctuation"},"("),e("clock frequency etc."),a("span",{class:"token punctuation"},")"),e("\n-R report level\n-slr SLR region setting\n-sp memory resources mapping\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),xa=a("p",null,"tools:",-1),Ia=a("ul",null,[a("li",null,"xbutil query"),a("li",null,"platforminfo"),a("li",null,"kernelinfo"),a("li",null,[a("strong",null,"xclbinutil")]),a("li",null,"dmesg")],-1),Ba=a("h3",{id:"host-application"},[a("a",{class:"header-anchor",href:"#host-application","aria-hidden":"true"},"#"),e(" Host Application")],-1),Wa=a("h4",{id:"basic-flow"},[a("a",{class:"header-anchor",href:"#basic-flow","aria-hidden":"true"},"#"),e(" Basic Flow")],-1),Ca=a("ul",null,[a("li",null,"set the kernel arguments before performing any enqueue operation"),a("li",null,[e("keeping the buffer size "),a("strong",null,"2 MB ~ 4 GB")]),a("li",null,[a("code",null,"posix_memalign"),e(" is used instead of malloc for the host memory space pointer")])],-1),Ha=a("div",{class:"language-cpp line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"uint32_t"),e(),a("span",{class:"token operator"},"*"),e("a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},"*"),e("b"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},"*"),e("c"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},"*"),e("d "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"NULL"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token function"},"posix_memalign"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"&"),e("a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"4096"),a("span",{class:"token punctuation"},","),e(" BUF_SIZE "),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token keyword"},"sizeof"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"uint32_t"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token function"},"posix_memalign"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"&"),e("b"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"4096"),a("span",{class:"token punctuation"},","),e(" BUF_SIZE "),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token keyword"},"sizeof"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"uint32_t"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token function"},"posix_memalign"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"&"),e("c"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"4096"),a("span",{class:"token punctuation"},","),e(" BUF_SIZE "),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token keyword"},"sizeof"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"uint32_t"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token function"},"posix_memalign"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"&"),e("d"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"4096"),a("span",{class:"token punctuation"},","),e(" BUF_SIZE "),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token keyword"},"sizeof"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"uint32_t"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),Na=a("ul",null,[a("li",null,"release resources for proper performance profile report")],-1),Oa=a("div",{class:"language-cpp line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token function"},"clReleaseCommandQueue"),a("span",{class:"token punctuation"},"("),e("Command_Queue"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token function"},"clReleaseContext"),a("span",{class:"token punctuation"},"("),e("Context"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token function"},"clReleaseDevice"),a("span",{class:"token punctuation"},"("),e("Target_Device_ID"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token function"},"clReleaseKernel"),a("span",{class:"token punctuation"},"("),e("Kernel"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token function"},"clReleaseProgram"),a("span",{class:"token punctuation"},"("),e("Program"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token function"},"free"),a("span",{class:"token punctuation"},"("),e("Platform_IDs"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token function"},"free"),a("span",{class:"token punctuation"},"("),e("Device_IDs"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),za=a("h4",{id:"tlp"},[a("a",{class:"header-anchor",href:"#tlp","aria-hidden":"true"},"#"),e(" TLP")],-1),Sa=a("p",null,[e("It is advisable to use the "),a("code",null,"posix_spawn()"),e(" system call to launch another process from the SDAccel environment application.")],-1),Pa=a("h3",{id:"u280-tools"},[a("a",{class:"header-anchor",href:"#u280-tools","aria-hidden":"true"},"#"),e(" U280 Tools")],-1),Ua=a("h4",{id:"gdb-based-debugging"},[a("a",{class:"header-anchor",href:"#gdb-based-debugging","aria-hidden":"true"},"#"),e(" GDB Based Debugging")],-1),Ma=a("div",{class:"language-bash line-numbers-mode"},[a("pre",null,[a("code",null,[e("xprint queue "),a("span",{class:"token punctuation"},"["),a("span",{class:"token operator"},"<"),e("cl_command_queue"),a("span",{class:"token operator"},">"),a("span",{class:"token punctuation"},"]"),e("\nxprint event "),a("span",{class:"token operator"},"<"),e("cl_event"),a("span",{class:"token operator"},">"),e("\nxprint mem "),a("span",{class:"token punctuation"},"["),a("span",{class:"token operator"},"<"),e("cl_mem"),a("span",{class:"token operator"},">"),a("span",{class:"token punctuation"},"]"),e("\nxprint kernel\nxprint all\nxstatus all\nxstatus --"),a("span",{class:"token operator"},"<"),e("ipName"),a("span",{class:"token operator"},">"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),Ea=a("h4",{id:"xcl-binary-util"},[a("a",{class:"header-anchor",href:"#xcl-binary-util","aria-hidden":"true"},"#"),e(" XCL Binary Util")],-1),La=a("div",{class:"language-bash line-numbers-mode"},[a("pre",null,[a("code",null,"xclbinutil -i binary_container_1.xclbin --info\n")]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),Ra=a("h4",{id:"xocc"},[a("a",{class:"header-anchor",href:"#xocc","aria-hidden":"true"},"#"),e(" XOCC")],-1),Fa=a("p",null,"Checking out-of-bound access made by kernel interface buffers (option: address) and uninitialized memory access initiated by kernel local to kernel (option: memory).",-1),$a=a("div",{class:"language-bash line-numbers-mode"},[a("pre",null,[a("code",null,[e("xocc -l –t sw_emu --xp param:compiler.fsanitize"),a("span",{class:"token operator"},"="),e("address -o bin_kernel.xclbin\nxocc -l –t sw_emu --xp param:compiler.fsanitize"),a("span",{class:"token operator"},"="),e("memory -o bin_kernel.xclbin\nxocc -l –t sw_emu --xp param:compiler.fsanitize"),a("span",{class:"token operator"},"="),e("address,memory -o bin_kernel.xclbin\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),qa=a("h4",{id:"xbutil"},[a("a",{class:"header-anchor",href:"#xbutil","aria-hidden":"true"},"#"),e(" XBUtil")],-1),Va=a("div",{class:"language-bash line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token function"},"sudo"),e(" /opt/xilinx/xrt/bin/xbutil flash -a "),a("span",{class:"token operator"},"<"),e("shell_name"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token comment"},"# flash the firmware"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),Ga=a("div",{class:"language-bash line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token function"},"sudo"),e(" lspci -vd 10ee:\n"),a("span",{class:"token function"},"sudo"),e(" /opt/xilinx/xrt/bin/xbutil flash scan\n"),a("span",{class:"token function"},"sudo"),e(" /opt/xilinx/xrt/bin/xbutil validate -d "),a("span",{class:"token operator"},"<"),e("card_id"),a("span",{class:"token operator"},">"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),Xa=a("div",{class:"language-bash line-numbers-mode"},[a("pre",null,[a("code",null,[e("xbutil program -p "),a("span",{class:"token operator"},"<"),e("xclbin"),a("span",{class:"token operator"},">"),e("\nxbutil query "),a("span",{class:"token comment"},"# check memory banks usage"),e("\nxbutil status --lapc "),a("span",{class:"token comment"},"# check AXI violations"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),Ka=a("h4",{id:"dmesg"},[a("a",{class:"header-anchor",href:"#dmesg","aria-hidden":"true"},"#"),e(" dmesg")],-1),ja=a("h4",{id:"ila-trigger"},[a("a",{class:"header-anchor",href:"#ila-trigger","aria-hidden":"true"},"#"),e(" ILA Trigger")],-1),Za=a("ul",null,[a("li",null,"debug protocol hangs"),a("li",null,"examine the burst size, pipelining and data width to locate the bottleneck")],-1),Ya=a("div",{class:"language-cpp line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),e("\nstd"),a("span",{class:"token double-colon punctuation"},"::"),e("string binaryFile "),a("span",{class:"token operator"},"="),e(" xcl"),a("span",{class:"token double-colon punctuation"},"::"),a("span",{class:"token function"},"find_binary_file"),a("span",{class:"token punctuation"},"("),e("device_name"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"vAdd"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\ncl"),a("span",{class:"token double-colon punctuation"},"::"),e("Program"),a("span",{class:"token double-colon punctuation"},"::"),e("Binaries bins "),a("span",{class:"token operator"},"="),e(" xcl"),a("span",{class:"token double-colon punctuation"},"::"),a("span",{class:"token function"},"import_binary_file"),a("span",{class:"token punctuation"},"("),e("binaryFile"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\ndevices"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"resize"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\ncl"),a("span",{class:"token double-colon punctuation"},"::"),e("Program "),a("span",{class:"token function"},"program"),a("span",{class:"token punctuation"},"("),e("context"),a("span",{class:"token punctuation"},","),e(" devices"),a("span",{class:"token punctuation"},","),e(" bins"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\ncl"),a("span",{class:"token double-colon punctuation"},"::"),e("Kernel "),a("span",{class:"token function"},"kernel_vAdd"),a("span",{class:"token punctuation"},"("),e("program"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"kernel_vAdd_rtl"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token comment"},'// wait_for_enter("\\nPress ENTER to continue after setting up ILA trigger...");'),e("\nstd"),a("span",{class:"token double-colon punctuation"},"::"),e("cout "),a("span",{class:"token operator"},"<<"),e(),a("span",{class:"token string"},'"Pausing to arm ILA trigger. Hit enter here to resume host program..."'),e("\n "),a("span",{class:"token operator"},"<<"),e(" std"),a("span",{class:"token double-colon punctuation"},"::"),e("endl"),a("span",{class:"token punctuation"},";"),e("\nstd"),a("span",{class:"token double-colon punctuation"},"::"),e("cin"),a("span",{class:"token double-colon punctuation"},"::"),a("span",{class:"token function"},"get"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token comment"},"//Allocate Buffer in Global Memory"),e("\nstd"),a("span",{class:"token double-colon punctuation"},"::"),e("vector"),a("span",{class:"token operator"},"<"),e("cl"),a("span",{class:"token double-colon punctuation"},"::"),e("Memory"),a("span",{class:"token operator"},">"),e(" inBufVec"),a("span",{class:"token punctuation"},","),e(" outBufVec"),a("span",{class:"token punctuation"},";"),e("\ncl"),a("span",{class:"token double-colon punctuation"},"::"),e("Buffer "),a("span",{class:"token function"},"buffer_r1"),a("span",{class:"token punctuation"},"("),e("context"),a("span",{class:"token punctuation"},","),e("CL_MEM_USE_HOST_PTR "),a("span",{class:"token operator"},"|"),e(" CL_MEM_READ_ONLY"),a("span",{class:"token punctuation"},","),e("\nvector_size_bytes"),a("span",{class:"token punctuation"},","),e(" source_input1"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"data"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token comment"},"// ..."),e("\n"),a("span",{class:"token comment"},"// ..."),e("\n"),a("span",{class:"token comment"},"// ..."),e("\n\n"),a("span",{class:"token comment"},"//Copy input data to device global memory"),e("\nq"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"enqueueMigrateMemObjects"),a("span",{class:"token punctuation"},"("),e("inBufVec"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"0"),a("span",{class:"token comment"},"/* 0 means from host*/"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token comment"},"//Set the Kernel Arguments"),e("\n"),a("span",{class:"token comment"},"// ..."),e("\n"),a("span",{class:"token comment"},"// ..."),e("\n"),a("span",{class:"token comment"},"// ..."),e("\n\n"),a("span",{class:"token comment"},"//Launch the Kernel"),e("\nq"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"enqueueTask"),a("span",{class:"token punctuation"},"("),e("kernel_vAdd"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br")])],-1),Qa=a("h2",{id:"axi-protocol"},[a("a",{class:"header-anchor",href:"#axi-protocol","aria-hidden":"true"},"#"),e(" AXI Protocol")],-1),Ja=a("p",null,"Advanced eXtensible Interface Protocol:",-1),ne=a("ul",null,[a("li",null,"handshake protocol: ready-valid protocol")],-1),se=a("h3",{id:"axi-channels"},[a("a",{class:"header-anchor",href:"#axi-channels","aria-hidden":"true"},"#"),e(" AXI Channels")],-1),ae=a("h4",{id:"read-address-channel"},[a("a",{class:"header-anchor",href:"#read-address-channel","aria-hidden":"true"},"#"),e(" Read Address Channel")],-1),ee=a("ul",null,[a("li",null,"arburst: burst type"),a("li",null,"araddr: start address"),a("li",null,"arlen: (# of transfers) - 1"),a("li",null,"arsize: bytes/transfer"),a("li",null,"arready (memory to host)"),a("li",null,"arvalid")],-1),te=a("h4",{id:"read-data-channel"},[a("a",{class:"header-anchor",href:"#read-data-channel","aria-hidden":"true"},"#"),e(" Read Data Channel")],-1),oe=a("ul",null,[a("li",null,"rdata: data"),a("li",null,"rresp: response (failure check)"),a("li",null,"rlast: flag for last piece of data"),a("li",null,"rready (host to memory)"),a("li",null,"rvalid")],-1),le=a("h4",{id:"write-address-channel"},[a("a",{class:"header-anchor",href:"#write-address-channel","aria-hidden":"true"},"#"),e(" Write Address Channel")],-1),ce=a("ul",null,[a("li",null,"awburst: burst type"),a("li",null,"awaddr: start address"),a("li",null,"awlen: (# of transfers) - 1"),a("li",null,"awsize: bytes/transfer"),a("li",null,"awready (memory to host)"),a("li",null,"awvalid")],-1),pe=a("h4",{id:"write-data-channel"},[a("a",{class:"header-anchor",href:"#write-data-channel","aria-hidden":"true"},"#"),e(" Write Data Channel")],-1),ue=a("ul",null,[a("li",null,"wdata: data"),a("li",null,"wstrb: write strobe -> write mask (1 bit mask for 1 byte data)"),a("li",null,"wlast: flag for last piece of data"),a("li",null,"wready (memory to host)"),a("li",null,"wvalid")],-1),re=a("h4",{id:"write-response-channel"},[a("a",{class:"header-anchor",href:"#write-response-channel","aria-hidden":"true"},"#"),e(" Write Response Channel")],-1),ie=a("ul",null,[a("li",null,"bresp: response (failure check)"),a("li",null,"bready (host to memory)"),a("li",null,"bvalid")],-1),ke=a("h3",{id:"axi-burst"},[a("a",{class:"header-anchor",href:"#axi-burst","aria-hidden":"true"},"#"),e(" AXI Burst")],-1),be=a("table",null,[a("thead",null,[a("tr",null,[a("th",{style:{"text-align":"right"}},"AxBURST[1:0]"),a("th",{style:{"text-align":"left"}},"Burst Type")])]),a("tbody",null,[a("tr",null,[a("td",{style:{"text-align":"right"}},"0b00"),a("td",{style:{"text-align":"left"}},"FIXED")]),a("tr",null,[a("td",{style:{"text-align":"right"}},"0b01"),a("td",{style:{"text-align":"left"}},"INCR")]),a("tr",null,[a("td",{style:{"text-align":"right"}},"0b10"),a("td",{style:{"text-align":"left"}},"WRAP")]),a("tr",null,[a("td",{style:{"text-align":"right"}},"0b11"),a("td",{style:{"text-align":"left"}},"Reserved")])])],-1),me=a("p",null,"burst length = AxLEN[7:0] + 1 (up to 256 transfers in each burst)",-1),de=a("table",null,[a("thead",null,[a("tr",null,[a("th",{style:{"text-align":"right"}},"AxSIZE[2:0]"),a("th",{style:{"text-align":"right"}},"Bytes in Transfer")])]),a("tbody",null,[a("tr",null,[a("td",{style:{"text-align":"right"}},"0b000"),a("td",{style:{"text-align":"right"}},"1")]),a("tr",null,[a("td",{style:{"text-align":"right"}},"0b001"),a("td",{style:{"text-align":"right"}},"2")]),a("tr",null,[a("td",{style:{"text-align":"right"}},"0b010"),a("td",{style:{"text-align":"right"}},"4")]),a("tr",null,[a("td",{style:{"text-align":"right"}},"0b011"),a("td",{style:{"text-align":"right"}},"8")]),a("tr",null,[a("td",{style:{"text-align":"right"}},"0b100"),a("td",{style:{"text-align":"right"}},"16")]),a("tr",null,[a("td",{style:{"text-align":"right"}},"0b101"),a("td",{style:{"text-align":"right"}},"32")]),a("tr",null,[a("td",{style:{"text-align":"right"}},"0b110"),a("td",{style:{"text-align":"right"}},"64")]),a("tr",null,[a("td",{style:{"text-align":"right"}},"0b111"),a("td",{style:{"text-align":"right"}},"128")])])],-1),ge=a("h4",{id:"read-burst"},[a("a",{class:"header-anchor",href:"#read-burst","aria-hidden":"true"},"#"),e(" Read Burst")],-1),we=a("p",null,[a("img",{src:"/awesome-notes/assets/AXI_Read_Burst.0e9ed250.png",alt:"Read Burst Example"})],-1),ye=a("h4",{id:"write-burst"},[a("a",{class:"header-anchor",href:"#write-burst","aria-hidden":"true"},"#"),e(" Write Burst")],-1),he=a("p",null,[a("img",{src:"/awesome-notes/assets/AXI_Write_Burst.63cb974a.png",alt:"Write Burst Example"})],-1),fe=a("h2",{id:"verilog-components"},[a("a",{class:"header-anchor",href:"#verilog-components","aria-hidden":"true"},"#"),e(" Verilog Components")],-1),ve=a("h3",{id:"clock-unit"},[a("a",{class:"header-anchor",href:"#clock-unit","aria-hidden":"true"},"#"),e(" Clock Unit")],-1),_e=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/**\n * @module tick_divider\n * @author sabertazimi\n * @email sabertazimi@gmail.com\n * @brief simple clock divider\n * @param DATA_WIDTH data width\n * @input clk_src clock signal\n * @output clk_group divided clock signals\n */"),e("\n"),a("span",{class:"token keyword"},"module"),e(" tick_divider\n#"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"parameter"),e(" DATA_WIDTH "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"32"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token keyword"},"input"),e(" clk_src"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" clk_group\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"initial"),e(),a("span",{class:"token keyword"},"begin"),e("\n clk_group "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token operator"},"{"),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"{"),a("span",{class:"token number"},"1'b0"),a("span",{class:"token operator"},"}}"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n "),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk_src"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n clk_group "),a("span",{class:"token operator"},"<="),e(" clk_group "),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br")])],-1),Ae=a("h3",{id:"signal-unit"},[a("a",{class:"header-anchor",href:"#signal-unit","aria-hidden":"true"},"#"),e(" Signal Unit")],-1),De=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/**\n * @module integer_to_segment\n * @author sabertazimi\n * @email sabertazimi@gmail.com\n * @brief raw data to segment encoder\n * @param DATA_WIDTH data width\n * @input data raw decimal data (4 bit)\n * @output seg_data bit data for cNodes\n */"),e("\n"),a("span",{class:"token keyword"},"module"),e(" integer_to_segment\n"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" int_data"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" seg_data\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),e("int_data"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"case"),e(),a("span",{class:"token punctuation"},"("),e("int_data"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token number"},"4'b0000"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b11000000"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 0"),e("\n "),a("span",{class:"token number"},"4'b0001"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b11111001"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 1"),e("\n "),a("span",{class:"token number"},"4'b0010"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b10100100"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 2"),e("\n "),a("span",{class:"token number"},"4'b0011"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b10110000"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 3"),e("\n "),a("span",{class:"token number"},"4'b0100"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b10011001"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 4"),e("\n "),a("span",{class:"token number"},"4'b0101"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b10010010"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 5"),e("\n "),a("span",{class:"token number"},"4'b0110"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b10000010"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 6"),e("\n "),a("span",{class:"token number"},"4'b0111"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b11111000"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 7"),e("\n "),a("span",{class:"token number"},"4'b1000"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b10000000"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 8"),e("\n "),a("span",{class:"token number"},"4'b1001"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b10010000"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 9"),e("\n "),a("span",{class:"token number"},"4'b1010"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b10001000"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// a"),e("\n "),a("span",{class:"token number"},"4'b1011"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b10000011"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// b"),e("\n "),a("span",{class:"token number"},"4'b1100"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b11000110"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// c"),e("\n "),a("span",{class:"token number"},"4'b1101"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b10100001"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// d"),e("\n "),a("span",{class:"token number"},"4'b1110"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b10000110"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// e"),e("\n "),a("span",{class:"token number"},"4'b1111"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b10001110"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// f"),e("\n "),a("span",{class:"token keyword"},"default"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b11111111"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// off"),e("\n "),a("span",{class:"token keyword"},"endcase"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br")])],-1),Te=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/**\n * @module data_to_segment\n * @author sabertazimi\n * @email sabertazimi@gmail.com\n * @brief raw data to segment encoder\n * @param DATA_WIDTH data width\n * @input data raw decimal data\n * @output seg_data bit data for cNodes\n */"),e("\n"),a("span",{class:"token keyword"},"module"),e(" data_to_segment\n#"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"parameter"),e(" DATA_WIDTH "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"32"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" data"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH"),a("span",{class:"token operator"},"*"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" seg_data\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n integer_to_segment trans1 "),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"int_data"),a("span",{class:"token punctuation"},"("),e("data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"seg_data"),a("span",{class:"token punctuation"},"("),e("seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n integer_to_segment trans2 "),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"int_data"),a("span",{class:"token punctuation"},"("),e("data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"seg_data"),a("span",{class:"token punctuation"},"("),e("seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"15"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n integer_to_segment trans3 "),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"int_data"),a("span",{class:"token punctuation"},"("),e("data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"11"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"seg_data"),a("span",{class:"token punctuation"},"("),e("seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"23"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"16"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n integer_to_segment trans4 "),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"int_data"),a("span",{class:"token punctuation"},"("),e("data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"15"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"12"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"seg_data"),a("span",{class:"token punctuation"},"("),e("seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"31"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"24"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n integer_to_segment trans5 "),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"int_data"),a("span",{class:"token punctuation"},"("),e("data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"19"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"16"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"seg_data"),a("span",{class:"token punctuation"},"("),e("seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"39"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"32"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n integer_to_segment trans6 "),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"int_data"),a("span",{class:"token punctuation"},"("),e("data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"23"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"20"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"seg_data"),a("span",{class:"token punctuation"},"("),e("seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"47"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"40"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n integer_to_segment trans7 "),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"int_data"),a("span",{class:"token punctuation"},"("),e("data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"27"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"24"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"seg_data"),a("span",{class:"token punctuation"},"("),e("seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"55"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"48"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n integer_to_segment trans8 "),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"int_data"),a("span",{class:"token punctuation"},"("),e("data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"31"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"28"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"seg_data"),a("span",{class:"token punctuation"},"("),e("seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"63"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"56"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br")])],-1),xe=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/**\n * @module led_unit\n * @author sabertazimi\n * @email sabertazimi@gmail.com\n * @brief led display module (bind to aNodes and cNodes in FPGA)\n * @param DATA_WIDTH data width\n * @input clk_src clock signal (light different led on in round turn)\n * @input led_data raw decimal data\n * @output aNodes determine which led light on at now\n * @output cNodes determine how led light on (number)\n */"),e("\n"),a("span",{class:"token keyword"},"module"),e(" led_unit\n#"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"parameter"),e(" DATA_WIDTH "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"32"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token keyword"},"input"),e(" clk_src"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" led_data"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" aNodes"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" cNodes\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" count"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token comment"},"// 2^3 = 8"),e("\n "),a("span",{class:"token keyword"},"wire"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH"),a("span",{class:"token operator"},"*"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" seg_data"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"initial"),e(),a("span",{class:"token keyword"},"begin"),e("\n count "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n aNodes "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n cNodes "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n data_to_segment #"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"DATA_WIDTH"),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},")"),e(" data_to_segment "),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"data"),a("span",{class:"token punctuation"},"("),e("led_data"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"seg_data"),a("span",{class:"token punctuation"},"("),e("seg_data"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk_src"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n count "),a("span",{class:"token operator"},"="),e(" count "),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n "),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),e("count"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"case"),e(),a("span",{class:"token punctuation"},"("),e("count"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token number"},"3'b000"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token keyword"},"begin"),e("\n aNodes "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"8'b11111110"),a("span",{class:"token punctuation"},";"),e("\n cNodes "),a("span",{class:"token operator"},"="),e(" seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token number"},"3'b001"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token keyword"},"begin"),e("\n aNodes "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"8'b11111101"),a("span",{class:"token punctuation"},";"),e("\n cNodes "),a("span",{class:"token operator"},"="),e(" seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"15"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token number"},"3'b010"),a("span",{class:"token punctuation"},":"),e(" "),a("span",{class:"token keyword"},"begin"),e("\n aNodes "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"8'b11111011"),a("span",{class:"token punctuation"},";"),e("\n cNodes "),a("span",{class:"token operator"},"="),e(" seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"23"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"16"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token number"},"3'b011"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token keyword"},"begin"),e("\n aNodes "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"8'b11110111"),a("span",{class:"token punctuation"},";"),e("\n cNodes "),a("span",{class:"token operator"},"="),e(" seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"31"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"24"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token number"},"3'b100"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token keyword"},"begin"),e("\n aNodes "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"8'b11101111"),a("span",{class:"token punctuation"},";"),e("\n cNodes "),a("span",{class:"token operator"},"="),e(" seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"39"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"32"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token number"},"3'b101"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token keyword"},"begin"),e("\n aNodes "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"8'b11011111"),a("span",{class:"token punctuation"},";"),e("\n cNodes "),a("span",{class:"token operator"},"="),e(" seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"47"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"40"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token number"},"3'b110"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token keyword"},"begin"),e("\n aNodes "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"8'b10111111"),a("span",{class:"token punctuation"},";"),e("\n cNodes "),a("span",{class:"token operator"},"="),e(" seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"55"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"48"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token number"},"3'b111"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token keyword"},"begin"),e("\n aNodes "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"8'b01111111"),a("span",{class:"token punctuation"},";"),e("\n cNodes "),a("span",{class:"token operator"},"="),e(" seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"63"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"56"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"default"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token keyword"},"begin"),e("\n aNodes "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"8'b11111110"),a("span",{class:"token punctuation"},";"),e("\n cNodes "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"8'b11111111"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"endcase"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br"),a("span",{class:"line-number"},"58"),a("br"),a("span",{class:"line-number"},"59"),a("br"),a("span",{class:"line-number"},"60"),a("br"),a("span",{class:"line-number"},"61"),a("br"),a("span",{class:"line-number"},"62"),a("br"),a("span",{class:"line-number"},"63"),a("br"),a("span",{class:"line-number"},"64"),a("br"),a("span",{class:"line-number"},"65"),a("br"),a("span",{class:"line-number"},"66"),a("br"),a("span",{class:"line-number"},"67"),a("br"),a("span",{class:"line-number"},"68"),a("br"),a("span",{class:"line-number"},"69"),a("br"),a("span",{class:"line-number"},"70"),a("br"),a("span",{class:"line-number"},"71"),a("br"),a("span",{class:"line-number"},"72"),a("br"),a("span",{class:"line-number"},"73"),a("br"),a("span",{class:"line-number"},"74"),a("br"),a("span",{class:"line-number"},"75"),a("br"),a("span",{class:"line-number"},"76"),a("br"),a("span",{class:"line-number"},"77"),a("br"),a("span",{class:"line-number"},"78"),a("br"),a("span",{class:"line-number"},"79"),a("br"),a("span",{class:"line-number"},"80"),a("br"),a("span",{class:"line-number"},"81"),a("br"),a("span",{class:"line-number"},"82"),a("br")])],-1),Ie=a("h3",{id:"alu-unit"},[a("a",{class:"header-anchor",href:"#alu-unit","aria-hidden":"true"},"#"),e(" ALU Unit")],-1),Be=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/**\n * @module counter\n * @author sabertazimi\n * @email sabertazimi@gmail.com\n * @brief up counter\n * @param DATA_WIDTH data width\n * @param STEP counting step\n * @input clk clock signal\n * @input rst reset signal\n * @output en enable signal\n * @output count counting value\n */"),e("\n"),a("span",{class:"token keyword"},"module"),e(" counter\n#"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"parameter"),e(" DATA_WIDTH "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),e(" STEP "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token keyword"},"input"),e(" clk"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(" rst"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(" en"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" count\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("rst"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n count "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"0"),e(),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("en"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n count "),a("span",{class:"token operator"},"<="),e(" count "),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token keyword"},"begin"),e("\n count "),a("span",{class:"token operator"},"<="),e(" count"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e(),a("span",{class:"token comment"},"// counter"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br")])],-1),We=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/**\n * @module latch_counter\n * @author sabertazimi\n * @email sabertazimi@gmail.com\n * @brief latch counter (latching when reaching max value)\n * @input clk clock signal\n * @input rst reset signal\n * @output en enable signal\n * @output count counting value\n */"),e("\n"),a("span",{class:"token keyword"},"module"),e(" latch_counter\n"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token keyword"},"input"),e(" clk"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(" rst"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(" en"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token keyword"},"reg"),e(" count\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"initial"),e(),a("span",{class:"token keyword"},"begin"),e("\n count "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n "),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("rst"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n count "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"0"),e(),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("en"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("count "),a("span",{class:"token operator"},"!="),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n count "),a("span",{class:"token operator"},"<="),e(" count "),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token keyword"},"begin"),e("\n count "),a("span",{class:"token operator"},"<="),e(" count"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"end"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token keyword"},"begin"),e("\n count "),a("span",{class:"token operator"},"<="),e(" count"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e(),a("span",{class:"token comment"},"// latch_counter"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br")])],-1),Ce=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/**\n * @module alu_flags\n * @author sabertazimi\n * @email sabertazimi@gmail.com\n * @brief get flags after alu calculation\n * @param DATA_WIDTH data width\n * @input srcA A port data\n * @input srcB B port data\n * @input aluOP operation code\n * @output zero equal flag\n * @output of signed overflow flag\n * @output uof unsigned overflow flag\n */"),e("\n"),a("span",{class:"token keyword"},"module"),e(" alu_flags\n#"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"parameter"),e(" DATA_WIDTH "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"32"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" srcA"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" srcB"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" aluOP"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(" zero"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(" of"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(" uof\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"wire"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" sum"),a("span",{class:"token punctuation"},","),e(" diff"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"wire"),e(" carry1"),a("span",{class:"token punctuation"},","),e(" carry2"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"assign"),e(),a("span",{class:"token operator"},"{"),e("carry1"),a("span",{class:"token punctuation"},","),e(" sum"),a("span",{class:"token operator"},"}"),e(),a("span",{class:"token operator"},"="),e(" srcA "),a("span",{class:"token operator"},"+"),e(" srcB"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// awesome tip"),e("\n "),a("span",{class:"token keyword"},"assign"),e(),a("span",{class:"token operator"},"{"),e("carry2"),a("span",{class:"token punctuation"},","),e(" diff"),a("span",{class:"token operator"},"}"),e(),a("span",{class:"token operator"},"="),e(" srcA "),a("span",{class:"token operator"},"-"),e(" srcB"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// awesome tip"),e("\n\n "),a("span",{class:"token keyword"},"assign"),e(" zero "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),e("srcA "),a("span",{class:"token operator"},"=="),e(" srcB"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"assign"),e(" of "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),e("aluOP "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token number"},"4'd5"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"?"),e(),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"("),e("srcA"),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"&"),e(" srcB"),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"&"),e(),a("span",{class:"token operator"},"~"),e("sum"),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"~"),e("srcA"),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"&"),e(),a("span",{class:"token operator"},"~"),e("srcB"),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"&"),e(" sum"),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token punctuation"},"("),e("aluOP "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token number"},"4'd6"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"?"),e(),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"("),e("srcA"),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"&"),e(),a("span",{class:"token operator"},"~"),e("srcB"),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"&"),e(),a("span",{class:"token operator"},"~"),e("diff"),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"~"),e("srcA"),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"&"),e(" srcB"),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"&"),e(" diff"),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"assign"),e(" uof "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),e("aluOP "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token number"},"4'd5"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"?"),e(),a("span",{class:"token punctuation"},"("),e("carry1"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token punctuation"},"("),e("aluOP "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token number"},"4'd6"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"?"),e(),a("span",{class:"token punctuation"},"("),e("carry2"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e(),a("span",{class:"token comment"},"// alu_flags"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br")])],-1),He=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/**\n * @module alu\n * @author sabertazimi\n * @email sabertazimi@gmail.com\n * @param DATA_WIDTH data width\n * @input srcA A port data\n * @input srcB B port data\n * @input aluOP operation code\n * @output aluOut calculation result\n * @output zero equal flag\n * @output of signed overflow flag\n * @output uof unsigned overflow flag\n */"),e("\n"),a("span",{class:"token keyword"},"module"),e(" alu\n#"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"parameter"),e(" DATA_WIDTH "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"32"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" srcA"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" srcB"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" aluOP"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" aluOut"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(" zero"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(" of"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(" uof\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"wire"),e(),a("span",{class:"token keyword"},"signed"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" signed_srcA"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"wire"),e(),a("span",{class:"token keyword"},"signed"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" signed_srcB"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"assign"),e(" signed_srcA "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token property"},"$signed"),a("span",{class:"token punctuation"},"("),e("srcA"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"assign"),e(" signed_srcB "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token property"},"$signed"),a("span",{class:"token punctuation"},"("),e("srcB"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token important"},"always @"),e(),a("span",{class:"token punctuation"},"("),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"case"),e(),a("span",{class:"token punctuation"},"("),e("aluOP"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token number"},"4'd0"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(" srcA "),a("span",{class:"token operator"},"<<"),e(" srcB"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"4'd1"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(" signed_srcA "),a("span",{class:"token operator"},">>>"),e(" srcB"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"4'd2"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(" srcA "),a("span",{class:"token operator"},">>"),e(" srcB"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"4'd3"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(" srcA "),a("span",{class:"token operator"},"*"),e(" srcB"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"4'd4"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(" srcA "),a("span",{class:"token operator"},"/"),e(" srcB"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"4'd5"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(" srcA "),a("span",{class:"token operator"},"+"),e(" srcB"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// awesome tip"),e("\n "),a("span",{class:"token number"},"4'd6"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(" srcA "),a("span",{class:"token operator"},"-"),e(" srcB"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"4'd7"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(" srcA "),a("span",{class:"token operator"},"&"),e(" srcB"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"4'd8"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(" srcA "),a("span",{class:"token operator"},"|"),e(" srcB"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"4'd9"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(" srcA "),a("span",{class:"token operator"},"^"),e(" srcB"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"4'd10"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token operator"},"~"),a("span",{class:"token punctuation"},"("),e("srcA "),a("span",{class:"token operator"},"|"),e(" srcB"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"4'd11"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token punctuation"},"("),e("signed_srcA "),a("span",{class:"token operator"},"<"),e(" signed_srcB"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"?"),e(),a("span",{class:"token number"},"1"),e(),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"4'd12"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token punctuation"},"("),e("srcA "),a("span",{class:"token operator"},"<"),e(" srcB"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"?"),e(),a("span",{class:"token number"},"1"),e(),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"default"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endcase"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n alu_flags #"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"DATA_WIDTH"),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},")"),e(" FLAGS "),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"srcA"),a("span",{class:"token punctuation"},"("),e("srcA"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"srcB"),a("span",{class:"token punctuation"},"("),e("srcB"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"aluOP"),a("span",{class:"token punctuation"},"("),e("aluOP"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"zero"),a("span",{class:"token punctuation"},"("),e("zero"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"of"),a("span",{class:"token punctuation"},"("),e("of"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"uof"),a("span",{class:"token punctuation"},"("),e("uof"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e(),a("span",{class:"token comment"},"// alu"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br"),a("span",{class:"line-number"},"58"),a("br"),a("span",{class:"line-number"},"59"),a("br"),a("span",{class:"line-number"},"60"),a("br"),a("span",{class:"line-number"},"61"),a("br"),a("span",{class:"line-number"},"62"),a("br")])],-1),Ne=a("h3",{id:"memory-unit"},[a("a",{class:"header-anchor",href:"#memory-unit","aria-hidden":"true"},"#"),e(" Memory Unit")],-1),Oe=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/**\n * @module register\n * @author sabertazimi\n * @email sabertazimi@gmail.com\n * @brief D flip flop\n * @param DATA_WIDTH data width\n * @input clk clock signal\n * @input rst reset signal\n * @input en enable signal\n * @input din data in\n * @output dout data out\n */"),e("\n"),a("span",{class:"token keyword"},"module"),e(" register\n#"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"parameter"),e(" DATA_WIDTH "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"32"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token keyword"},"input"),e(" clk"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(" rst"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(" en"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" din"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" dout\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token important"},"always @"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("rst"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n dout "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// reset"),e("\n "),a("span",{class:"token keyword"},"end"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("en"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n dout "),a("span",{class:"token operator"},"<="),e(" din"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// update"),e("\n "),a("span",{class:"token keyword"},"end"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token keyword"},"begin"),e("\n dout "),a("span",{class:"token operator"},"<="),e(" dout"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// hold"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e(),a("span",{class:"token comment"},"// register"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br")])],-1),ze=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/**\n * @module regFile\n * @author sabertazimi\n * @email sabertazimi@gmail.com\n * @brief register files for MIPS CPU, contains 32 D flip-flop registers\n * @param DATA_WIDTH data width\n * @input clk clock signal\n * @input we write enable signal\n * @input raddrA read address (No.register) for A out port\n * @input raddrB read address (No.register) for B out port\n * @input waddr write address (No.register) for wdata (in port)\n * @input wdata data to write into regFile\n * @output regA A port output\n * @output regB B port output\n */"),e("\n"),a("span",{class:"token keyword"},"module"),e(" regFile\n#"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"parameter"),e(" DATA_WIDTH "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"32"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token keyword"},"input"),e(" clk"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(" rst"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(" we"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" raddrA"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" raddrB"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" waddr"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" wdata"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" regA"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" regB"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" v0_data"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" a0_data\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token constant"},"`include"),e(),a("span",{class:"token string"},'"defines.vh"'),e("\n\n "),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" i"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token comment"},"///< three ported regFile contains 32 registers"),e("\n "),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" regFile "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"31"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token important"},"always @"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("rst"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"for"),e(),a("span",{class:"token punctuation"},"("),e("i "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(" i "),a("span",{class:"token operator"},"<"),e(),a("span",{class:"token number"},"31"),a("span",{class:"token punctuation"},";"),e(" i "),a("span",{class:"token operator"},"="),e(" i "),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n regFile"),a("span",{class:"token punctuation"},"["),e("i"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"end"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("we "),a("span",{class:"token operator"},"&&"),e(" waddr "),a("span",{class:"token operator"},"!="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n regFile"),a("span",{class:"token punctuation"},"["),e("waddr"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"<="),e(" wdata"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n "),a("span",{class:"token keyword"},"assign"),e(" regA "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),e("we "),a("span",{class:"token operator"},"&&"),e(" waddr "),a("span",{class:"token operator"},"=="),e(" raddrA"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"?"),e(" wdata\n "),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token punctuation"},"("),e("raddrA "),a("span",{class:"token operator"},"!="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"?"),e(" regFile"),a("span",{class:"token punctuation"},"["),e("raddrA"),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"assign"),e(" regB "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),e("we "),a("span",{class:"token operator"},"&&"),e(" waddr "),a("span",{class:"token operator"},"=="),e(" raddrB"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"?"),e(" wdata\n "),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token punctuation"},"("),e("raddrB "),a("span",{class:"token operator"},"!="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"?"),e(" regFile"),a("span",{class:"token punctuation"},"["),e("raddrB"),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"assign"),e(" v0_data "),a("span",{class:"token operator"},"="),e(" regFile"),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"`V0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"assign"),e(" a0_data "),a("span",{class:"token operator"},"="),e(" regFile"),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"`A0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e(),a("span",{class:"token comment"},"// regFile"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br"),a("span",{class:"line-number"},"58"),a("br"),a("span",{class:"line-number"},"59"),a("br")])],-1),Se=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/**\n * @module imem\n * @author sabertazimi\n * @email sabertazimi@gmail.com\n * @brief instruction cache memory (ROM)\n * @param DATA_WIDTH data width\n * @param BUS_WIDTH bus width\n * @param CODE_FILE MIPS assembly hexadecimal code file\n * @input addr memory address\n * @output rdata instruction read out from memory\n */"),e("\n"),a("span",{class:"token keyword"},"module"),e(" imem\n#"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"parameter"),e(" DATA_WIDTH "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"32"),a("span",{class:"token punctuation"},","),e(" BUS_WIDTH "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),e(" CODE_FILE"),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"mips/benchmark.hex"'),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),e("BUS_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" addr"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" rdata\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" ROM "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},":"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token operator"},"**"),e("BUS_WIDTH"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"initial"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token property"},"$readmemh"),a("span",{class:"token punctuation"},"("),e("CODE_FILE"),a("span",{class:"token punctuation"},","),e(" ROM"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token operator"},"**"),e("BUS_WIDTH"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n "),a("span",{class:"token keyword"},"assign"),e(" rdata "),a("span",{class:"token operator"},"="),e(" ROM"),a("span",{class:"token punctuation"},"["),e("addr"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e(),a("span",{class:"token comment"},"// imem"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br")])],-1),Pe=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/**\n * @module dmem\n * @author sabertazimi\n * @email sabertazimi@gmail.com\n * @brief data cache memory (RAM)\n * @param DATA_WIDTH data width\n * @param BUS_WIDTH bus width\n * @input clk clock signal\n * @input re read enable signal\n * @input we write enable signal\n * @input addr memory address\n * @input wdata data write into memory\n * @output rdata data read out from memory\n */"),e("\n"),a("span",{class:"token keyword"},"module"),e(" dmem\n#"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"parameter"),e(" DATA_WIDTH "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"32"),a("span",{class:"token punctuation"},","),e(" BUS_WIDTH "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token keyword"},"input"),e(" clk"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(" re"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(" we"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),e("BUS_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" addr"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" wdata"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" switch_addr"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" rdata"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" led_data\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" RAM "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},":"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token operator"},"**"),e("BUS_WIDTH"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token important"},"always @"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("we"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n RAM"),a("span",{class:"token punctuation"},"["),e("addr"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"<="),e(" wdata"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n "),a("span",{class:"token keyword"},"assign"),e(" rdata "),a("span",{class:"token operator"},"="),e(" re "),a("span",{class:"token operator"},"?"),e(" RAM"),a("span",{class:"token punctuation"},"["),e("addr"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token operator"},"{"),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"{"),a("span",{class:"token number"},"1'bx"),a("span",{class:"token operator"},"}}"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"assign"),e(" led_data "),a("span",{class:"token operator"},"="),e(" RAM"),a("span",{class:"token punctuation"},"["),e("switch_addr"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e(),a("span",{class:"token comment"},"// dmem"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br")])],-1);o.render=function(a,e,t,o,Ue,Me){return n(),s("div",null,[l,c,p,u,r,i,k,b,m,d,g,w,y,h,f,v,_,A,D,T,x,I,B,W,C,H,N,O,z,S,P,U,M,E,L,R,F,$,q,V,G,X,K,j,Z,Y,Q,J,nn,sn,an,en,tn,on,ln,cn,pn,un,rn,kn,bn,mn,dn,gn,wn,yn,hn,fn,vn,_n,An,Dn,Tn,xn,In,Bn,Wn,Cn,Hn,Nn,On,zn,Sn,Pn,Un,Mn,En,Ln,Rn,Fn,$n,qn,Vn,Gn,Xn,Kn,jn,Zn,Yn,Qn,Jn,ns,ss,as,es,ts,os,ls,cs,ps,us,rs,is,ks,bs,ms,ds,gs,ws,ys,hs,fs,vs,_s,As,Ds,Ts,xs,Is,Bs,Ws,Cs,Hs,Ns,Os,zs,Ss,Ps,Us,Ms,Es,Ls,Rs,Fs,$s,qs,Vs,Gs,Xs,Ks,js,Zs,Ys,Qs,Js,na,sa,aa,ea,ta,oa,la,ca,pa,ua,ra,ia,ka,ba,ma,da,ga,wa,ya,ha,fa,va,_a,Aa,Da,Ta,xa,Ia,Ba,Wa,Ca,Ha,Na,Oa,za,Sa,Pa,Ua,Ma,Ea,La,Ra,Fa,$a,qa,Va,Ga,Xa,Ka,ja,Za,Ya,Qa,Ja,ne,se,ae,ee,te,oe,le,ce,pe,ue,re,ie,ke,be,me,de,ge,we,ye,he,fe,ve,_e,Ae,De,Te,xe,Ie,Be,We,Ce,He,Ne,Oe,ze,Se,Pe])};export default o;export{t as __pageData}; diff --git a/assets/language_verilog_verilogBasicNotes.md.8503596e.lean.js b/assets/language_verilog_verilogBasicNotes.md.8503596e.lean.js new file mode 100644 index 00000000000..8218d79aecf --- /dev/null +++ b/assets/language_verilog_verilogBasicNotes.md.8503596e.lean.js @@ -0,0 +1 @@ +import{o as n,c as s,b as a,d as e}from"./app.6dd2a1b7.js";const t='{"title":"Verilog Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"General Flow","slug":"general-flow"},{"level":3,"title":"Create Project","slug":"create-project"},{"level":3,"title":"RTL Analysis","slug":"rtl-analysis"},{"level":3,"title":"Simulate Design","slug":"simulate-design"},{"level":3,"title":"Synthesize Design","slug":"synthesize-design"},{"level":3,"title":"Implement Design","slug":"implement-design"},{"level":3,"title":"Post-Implementation Timing Simulate Design","slug":"post-implementation-timing-simulate-design"},{"level":3,"title":"Generate Bit Stream","slug":"generate-bit-stream"},{"level":3,"title":"Testing and Verification","slug":"testing-and-verification"},{"level":2,"title":"Timing in Circuits","slug":"timing-in-circuits"},{"level":3,"title":"Combination Circuit Timing","slug":"combination-circuit-timing"},{"level":3,"title":"Sequential Circuit Timing","slug":"sequential-circuit-timing"},{"level":2,"title":"Key Words","slug":"key-words"},{"level":2,"title":"Module","slug":"module"},{"level":3,"title":"外部端口","slug":"外部端口"},{"level":2,"title":"function","slug":"function"},{"level":3,"title":"task","slug":"task"},{"level":2,"title":"Data Structure","slug":"data-structure"},{"level":3,"title":"常量","slug":"常量"},{"level":3,"title":"向量","slug":"向量"},{"level":3,"title":"数字","slug":"数字"},{"level":3,"title":"Register","slug":"register"},{"level":3,"title":"Net","slug":"net"},{"level":2,"title":"Gate Level","slug":"gate-level"},{"level":3,"title":"Basic Gate","slug":"basic-gate"},{"level":3,"title":"Use Gate","slug":"use-gate"},{"level":3,"title":"Self-Defined Gate(用户自定义原语)","slug":"self-defined-gate-用户自定义原语"},{"level":2,"title":"Dataflow Level","slug":"dataflow-level"},{"level":3,"title":"Operators","slug":"operators"},{"level":3,"title":"整数提升","slug":"整数提升"},{"level":2,"title":"Behavior Level","slug":"behavior-level"},{"level":3,"title":"时延控制","slug":"时延控制"},{"level":3,"title":"事件控制","slug":"事件控制"},{"level":3,"title":"语句内/间控制","slug":"语句内-间控制"},{"level":3,"title":"always","slug":"always"},{"level":3,"title":"if-else","slug":"if-else"},{"level":3,"title":"Case Statement","slug":"case-statement"},{"level":3,"title":"for","slug":"for"},{"level":3,"title":"repeat loop","slug":"repeat-loop"},{"level":3,"title":"forever loop","slug":"forever-loop"},{"level":3,"title":"Force and Release","slug":"force-and-release"},{"level":3,"title":"Blocking and Non-Blocking","slug":"blocking-and-non-blocking"},{"level":3,"title":"disable","slug":"disable"},{"level":2,"title":"结构建模","slug":"结构建模"},{"level":3,"title":"generate 语句","slug":"generate-语句"},{"level":2,"title":"Delay(时延)","slug":"delay-时延"},{"level":2,"title":"预编译指令","slug":"预编译指令"},{"level":3,"title":"define 宏","slug":"define-宏"},{"level":2,"title":"Data Path","slug":"data-path"},{"level":3,"title":"Multiplexer","slug":"multiplexer"},{"level":3,"title":"Adder","slug":"adder"},{"level":3,"title":"Register Data Path","slug":"register-data-path"},{"level":3,"title":"Memory","slug":"memory"},{"level":2,"title":"Demos","slug":"demos"},{"level":3,"title":"Binary Multiplier","slug":"binary-multiplier"},{"level":3,"title":"Multi-Hz","slug":"multi-hz"},{"level":2,"title":"Tips","slug":"tips"},{"level":3,"title":"不可综合结构","slug":"不可综合结构"},{"level":3,"title":"混合编程","slug":"混合编程"},{"level":3,"title":"上升沿/下降沿","slug":"上升沿-下降沿"},{"level":3,"title":"Parameter","slug":"parameter"},{"level":2,"title":"有限状态机(FSM)","slug":"有限状态机-fsm"},{"level":2,"title":"算术状态机(ASM)","slug":"算术状态机-asm"},{"level":2,"title":"System Verilog","slug":"system-verilog"},{"level":3,"title":"Enum","slug":"enum"},{"level":3,"title":"Struct and Union","slug":"struct-and-union"},{"level":3,"title":"Procedural Block","slug":"procedural-block"},{"level":3,"title":"Interface","slug":"interface"},{"level":3,"title":"Testing","slug":"testing"},{"level":2,"title":"U280 Platform","slug":"u280-platform"},{"level":3,"title":"Host Application","slug":"host-application"},{"level":3,"title":"U280 Tools","slug":"u280-tools"},{"level":2,"title":"AXI Protocol","slug":"axi-protocol"},{"level":3,"title":"AXI Channels","slug":"axi-channels"},{"level":3,"title":"AXI Burst","slug":"axi-burst"},{"level":2,"title":"Verilog Components","slug":"verilog-components"},{"level":3,"title":"Clock Unit","slug":"clock-unit"},{"level":3,"title":"Signal Unit","slug":"signal-unit"},{"level":3,"title":"ALU Unit","slug":"alu-unit"},{"level":3,"title":"Memory Unit","slug":"memory-unit"}],"relativePath":"language/verilog/verilogBasicNotes.md","lastUpdated":1627196319000}',o={},l=a("h1",{id:"verilog-basic-notes"},[a("a",{class:"header-anchor",href:"#verilog-basic-notes","aria-hidden":"true"},"#"),e(" Verilog Basic Notes")],-1),c=a("p",null,[a("div",{class:"table-of-contents"},[a("ul",null,[a("li",null,[a("a",{href:"#verilog-basic-notes"},"Verilog Basic Notes"),a("ul",null,[a("li",null,[a("a",{href:"#general-flow"},"General Flow")]),a("li",null,[a("a",{href:"#timing-in-circuits"},"Timing in Circuits")]),a("li",null,[a("a",{href:"#key-words"},"Key Words")]),a("li",null,[a("a",{href:"#module"},"Module")]),a("li",null,[a("a",{href:"#function"},"function")]),a("li",null,[a("a",{href:"#data-structure"},"Data Structure")]),a("li",null,[a("a",{href:"#gate-level"},"Gate Level")]),a("li",null,[a("a",{href:"#dataflow-level"},"Dataflow Level")]),a("li",null,[a("a",{href:"#behavior-level"},"Behavior Level")]),a("li",null,[a("a",{href:"#结构建模"},"结构建模")]),a("li",null,[a("a",{href:"#delay-时延"},"Delay(时延)")]),a("li",null,[a("a",{href:"#预编译指令"},"预编译指令")]),a("li",null,[a("a",{href:"#data-path"},"Data Path")]),a("li",null,[a("a",{href:"#demos"},"Demos")]),a("li",null,[a("a",{href:"#tips"},"Tips")]),a("li",null,[a("a",{href:"#有限状态机-fsm"},"有限状态机(FSM)")]),a("li",null,[a("a",{href:"#算术状态机-asm"},"算术状态机(ASM)")]),a("li",null,[a("a",{href:"#system-verilog"},"System Verilog")]),a("li",null,[a("a",{href:"#u280-platform"},"U280 Platform")]),a("li",null,[a("a",{href:"#axi-protocol"},"AXI Protocol")]),a("li",null,[a("a",{href:"#verilog-components"},"Verilog Components")])])])])])],-1),p=a("h2",{id:"general-flow"},[a("a",{class:"header-anchor",href:"#general-flow","aria-hidden":"true"},"#"),e(" General Flow")],-1),u=a("h3",{id:"create-project"},[a("a",{class:"header-anchor",href:"#create-project","aria-hidden":"true"},"#"),e(" Create Project")],-1),r=a("ul",null,[a("li",null,[a("code",null,".v"),e(" (sources)")]),a("li",null,[a("code",null,".xdc"),e(" (constraints)")])],-1),i=a("h3",{id:"rtl-analysis"},[a("a",{class:"header-anchor",href:"#rtl-analysis","aria-hidden":"true"},"#"),e(" RTL Analysis")],-1),k=a("p",null,"Schematic",-1),b=a("h3",{id:"simulate-design"},[a("a",{class:"header-anchor",href:"#simulate-design","aria-hidden":"true"},"#"),e(" Simulate Design")],-1),m=a("ul",null,[a("li",null,[a("code",null,"_tb.v"),e(": test bench")]),a("li",null,"simulation options: 500ns"),a("li",null,"Scopes -> dut -> swt/led"),a("li",null,"Schematic")],-1),d=a("h3",{id:"synthesize-design"},[a("a",{class:"header-anchor",href:"#synthesize-design","aria-hidden":"true"},"#"),e(" Synthesize Design")],-1),g=a("p",null,"Schematic",-1),w=a("h3",{id:"implement-design"},[a("a",{class:"header-anchor",href:"#implement-design","aria-hidden":"true"},"#"),e(" Implement Design")],-1),y=a("p",null,"Schematic",-1),h=a("h3",{id:"post-implementation-timing-simulate-design"},[a("a",{class:"header-anchor",href:"#post-implementation-timing-simulate-design","aria-hidden":"true"},"#"),e(" Post-Implementation Timing Simulate Design")],-1),f=a("h3",{id:"generate-bit-stream"},[a("a",{class:"header-anchor",href:"#generate-bit-stream","aria-hidden":"true"},"#"),e(" Generate Bit Stream")],-1),v=a("h3",{id:"testing-and-verification"},[a("a",{class:"header-anchor",href:"#testing-and-verification","aria-hidden":"true"},"#"),e(" Testing and Verification")],-1),_=a("p",null,"low-level (circuit) simulation is much slower than high-level (C, HDL) simulation:",-1),A=a("ul",null,[a("li",null,"check only functionality at high level (C, HDL)"),a("li",null,"check only timing, power at low level (circuit)")],-1),D=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e(),a("span",{class:"token function"},"testBench"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"reg"),e(" clk"),a("span",{class:"token punctuation"},","),e(" reset"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// clock and reset are internal"),e("\n "),a("span",{class:"token keyword"},"reg"),e(" a"),a("span",{class:"token punctuation"},","),e(" b"),a("span",{class:"token punctuation"},","),e(" c"),a("span",{class:"token punctuation"},","),e(" yExpected"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// values from testVectors"),e("\n "),a("span",{class:"token keyword"},"wire"),e(" y"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// output of circuit"),e("\n "),a("span",{class:"token keyword"},"reg"),e(" "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"31"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" vectorNum"),a("span",{class:"token punctuation"},","),e(" errors"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// bookkeeping variables"),e("\n "),a("span",{class:"token keyword"},"reg"),e(" "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" testVectors"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"10000"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token comment"},"// array of testVectors"),e("\n\n "),a("span",{class:"token comment"},"// instantiate device under test"),e("\n sillyFunction "),a("span",{class:"token function"},"dut"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"a"),a("span",{class:"token punctuation"},"("),e("a"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"b"),a("span",{class:"token punctuation"},"("),e("b"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"c"),a("span",{class:"token punctuation"},"("),e("c"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"y"),a("span",{class:"token punctuation"},"("),e("y"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token comment"},"// generate clock"),e("\n "),a("span",{class:"token important"},"always "),e(" "),a("span",{class:"token comment"},"// no sensitivity list, so it always executes"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n clk "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token number"},"#5"),a("span",{class:"token punctuation"},";"),e(" clk "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token number"},"#5"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 10ns period"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n "),a("span",{class:"token comment"},"// at start of test, load vectors and pulse reset"),e("\n "),a("span",{class:"token keyword"},"initial"),e(" "),a("span",{class:"token comment"},"// Only executes once"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token property"},"$readmemb"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"example.tv"'),a("span",{class:"token punctuation"},","),e(" testVectors"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token comment"},"// Read vectors: e.g 000_0 001_1 ... xxx_x"),e("\n vectorNum "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(" errors "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// Initialize"),e("\n reset "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token number"},"#27"),a("span",{class:"token punctuation"},";"),e(" reset "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// Apply reset wait"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n "),a("span",{class:"token comment"},"// Note: $readmemh reads testVector files written in"),e("\n "),a("span",{class:"token comment"},"// hexadecimal"),e("\n "),a("span",{class:"token comment"},"// apply test vectors on rising edge of clk"),e("\n "),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token number"},"#1"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token operator"},"{"),e("a"),a("span",{class:"token punctuation"},","),e(" b"),a("span",{class:"token punctuation"},","),e(" c"),a("span",{class:"token punctuation"},","),e(" yExpected"),a("span",{class:"token operator"},"}"),e(),a("span",{class:"token operator"},"="),e(" testVectors"),a("span",{class:"token punctuation"},"["),e("vectorNum"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n "),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"negedge"),e(" clk"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"~"),e("reset"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token comment"},"// don’t test during reset"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("y "),a("span",{class:"token operator"},"!=="),e(" yExpected"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token property"},"$display"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"Error: inputs = %b"'),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},"{"),e("a"),a("span",{class:"token punctuation"},","),e(" b"),a("span",{class:"token punctuation"},","),e(" c"),a("span",{class:"token operator"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token property"},"$display"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'" outputs = %b (%b exp)"'),a("span",{class:"token punctuation"},","),e("y"),a("span",{class:"token punctuation"},","),e("yExpected"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n errors "),a("span",{class:"token operator"},"="),e(" errors "),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n "),a("span",{class:"token comment"},"// increment array index and read next testVector"),e("\n vectorNum "),a("span",{class:"token operator"},"="),e(" vectorNum "),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("testVectors"),a("span",{class:"token punctuation"},"["),e("vectorNum"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"==="),e(),a("span",{class:"token number"},"4'bx"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token property"},"$display"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"%d tests completed with %d errors"'),a("span",{class:"token punctuation"},","),e(" vectorNum"),a("span",{class:"token punctuation"},","),e(" errors"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token property"},"$finish"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// End simulation"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br")])],-1),T=a("h2",{id:"timing-in-circuits"},[a("a",{class:"header-anchor",href:"#timing-in-circuits","aria-hidden":"true"},"#"),e(" Timing in Circuits")],-1),x=a("h3",{id:"combination-circuit-timing"},[a("a",{class:"header-anchor",href:"#combination-circuit-timing","aria-hidden":"true"},"#"),e(" Combination Circuit Timing")],-1),I=a("ul",null,[a("li",null,[e("contamination delay ("),a("code",null,"t_cd"),e("): minimum path in circuits, outputs start to change")]),a("li",null,[e("propagation delay ("),a("code",null,"t_pd"),e("): maximum path in circuits, outputs complete change")]),a("li",null,[e("(delay) heavy dependence on "),a("strong",null,"voltage"),e(" and "),a("strong",null,"temperature")])],-1),B=a("h3",{id:"sequential-circuit-timing"},[a("a",{class:"header-anchor",href:"#sequential-circuit-timing","aria-hidden":"true"},"#"),e(" Sequential Circuit Timing")],-1),W=a("p",null,[e("minimize clock skew time: requires intelligent "),a("strong",null,"clock network"),e(" across a chip, making clock arrives at all locations at roughly the same time.")],-1),C=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[e("T_clock "),a("span",{class:"token operator"},">="),e(" T_pcq "),a("span",{class:"token operator"},"+"),e(" T_pd "),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token punctuation"},"("),e("T_setup "),a("span",{class:"token operator"},"+"),e(" T_skew"),a("span",{class:"token punctuation"},")"),e("\nT_ccq "),a("span",{class:"token operator"},"+"),e(" T_cd "),a("span",{class:"token operator"},">"),e(),a("span",{class:"token punctuation"},"("),e("T_hold "),a("span",{class:"token operator"},"+"),e(" T_skew"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),H=a("h2",{id:"key-words"},[a("a",{class:"header-anchor",href:"#key-words","aria-hidden":"true"},"#"),e(" Key Words")],-1),N=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e("\n"),a("span",{class:"token keyword"},"input"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"output"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"inout"),e("\n"),a("span",{class:"token keyword"},"wire"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"reg"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"parameter"),e("\n"),a("span",{class:"token important"},"always@"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"assign"),e("\n"),a("span",{class:"token keyword"},"posedge"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"negedge"),e("\n"),a("span",{class:"token keyword"},"if"),a("span",{class:"token operator"},"-"),a("span",{class:"token keyword"},"else"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"case"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"begin"),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),e(),a("span",{class:"token keyword"},"end"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),O=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[e("port"),a("span",{class:"token punctuation"},","),e(" signal\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),z=a("h2",{id:"module"},[a("a",{class:"header-anchor",href:"#module","aria-hidden":"true"},"#"),e(" Module")],-1),S=a("ul",null,[a("li",null,"Inout(Net) -> (Net)Module(Net) -> Inout(Net)"),a("li",null,"Input(Net/Register) -> (Net)Module(Net/Register) -> Output(Net)")],-1),P=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e(),a("span",{class:"token function"},"moduleName"),a("span",{class:"token punctuation"},"("),e(" In1"),a("span",{class:"token punctuation"},","),e(" In2"),a("span",{class:"token punctuation"},","),e(" Out1"),a("span",{class:"token punctuation"},","),e(" Out2"),a("span",{class:"token punctuation"},","),e(" InOut1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token comment"},"// 输入输出定义: 说明端口是输入还是输出"),e("\n "),a("span",{class:"token keyword"},"input"),e(" In1"),a("span",{class:"token punctuation"},","),e(" In2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"output"),e(" Out1"),a("span",{class:"token punctuation"},","),e(" Out2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"inout"),e(" InOut1"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token comment"},"// 数据类型定义: 说明端口数据类型 - Net/Register"),e("\n "),a("span",{class:"token keyword"},"wire"),e(" In1"),a("span",{class:"token punctuation"},","),e(" In2"),a("span",{class:"token punctuation"},","),e(" Out1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"wire"),e(" InOut1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"reg"),e(" Out2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token comment"},"// Instantiation of lower level modules"),e("\n Design "),a("span",{class:"token function"},"u_2"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"("),e("端口"),a("span",{class:"token punctuation"},"("),e("信号"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"("),e("端口"),a("span",{class:"token function"},"2"),a("span",{class:"token punctuation"},"("),e("信号"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"("),e("端口"),a("span",{class:"token function"},"3"),a("span",{class:"token punctuation"},"("),e("信号"),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token comment"},"// Functionality"),e("\n\n "),a("span",{class:"token comment"},"// 三种层次的描述: 逻辑层次(Gate Level), 数据流层次(Dataflow Level), 行为层次(Behavior Level)"),e("\n "),a("span",{class:"token comment"},"// and/or - gate level"),e("\n "),a("span",{class:"token keyword"},"and"),e(),a("span",{class:"token function"},"and1"),a("span",{class:"token punctuation"},"("),e(" Out1"),a("span",{class:"token punctuation"},","),e(" In1"),a("span",{class:"token punctuation"},","),e(" In2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token comment"},"// assign - dataflow level"),e("\n "),a("span",{class:"token keyword"},"assign"),e(),a("span",{class:"token number"},"#2"),e(" Out1 "),a("span",{class:"token operator"},"="),e(" In1 "),a("span",{class:"token operator"},"&"),e(" In2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token comment"},"// always/initial - behavior level"),e("\n "),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n Out2 "),a("span",{class:"token operator"},"="),e(" In1 "),a("span",{class:"token operator"},"&"),e(" In2\n "),a("span",{class:"token keyword"},"end"),e("\n\n "),a("span",{class:"token comment"},"// Timing specification"),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br")])],-1),U=a("h3",{id:"外部端口"},[a("a",{class:"header-anchor",href:"#外部端口","aria-hidden":"true"},"#"),e(" 外部端口")],-1),M=a("ul",null,[a("li",null,"封装内部端口,装饰者模式"),a("li",null,"一个内部端口可与多个外部端口相连")],-1),E=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e(" scram_b "),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"data"),a("span",{class:"token punctuation"},"("),e("arb"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"control"),a("span",{class:"token punctuation"},"("),e("ctrl"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"mem_word"),a("span",{class:"token punctuation"},"("),e("mem_blk"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"addr"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"byte"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e(" arb"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"input"),e(" ctrl"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" mem_blk"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token keyword"},"byte"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br")])],-1),L=a("h2",{id:"function"},[a("a",{class:"header-anchor",href:"#function","aria-hidden":"true"},"#"),e(" function")],-1),R=a("ul",null,[a("li",null,"不含时间/事件控制"),a("li",null,"至少 1 个输入"),a("li",null,"至多 1 个输出"),a("li",null,"只含行为模块"),a("li",null,"只含阻塞赋值语句")],-1),F=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"function"),e(" "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" aligned_word"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// function declaration"),e("\n "),a("span",{class:"token keyword"},"input"),e(" "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" word"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n aligned_word "),a("span",{class:"token operator"},"="),e(" word"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("aligned_word "),a("span",{class:"token operator"},"!="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"while"),e(),a("span",{class:"token punctuation"},"("),e("aligned_word"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e(" aligned_word "),a("span",{class:"token operator"},"="),e(" aligned_word "),a("span",{class:"token operator"},"<<"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"endfunction"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),$=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e(" arithmetic_unit "),a("span",{class:"token punctuation"},"("),e("result_1"),a("span",{class:"token punctuation"},","),e(" result_2"),a("span",{class:"token punctuation"},","),e(" operand_1"),a("span",{class:"token punctuation"},","),e(" operand_2"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"output"),e(" "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" result_1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"output"),e(" "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" result_2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"input"),e(" "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" operand_1"),a("span",{class:"token punctuation"},","),e(" operand_2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"assign"),e(" result_1 "),a("span",{class:"token operator"},"="),e(" sum_of_operands "),a("span",{class:"token punctuation"},"("),e("operand_1"),a("span",{class:"token punctuation"},","),e(" operand_2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"assign"),e(" result_2 "),a("span",{class:"token operator"},"="),e(" larger_operand "),a("span",{class:"token punctuation"},"("),e("operand_1"),a("span",{class:"token punctuation"},","),e(" operand_2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"function"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token function"},"sum_of_operands"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" operand_1"),a("span",{class:"token punctuation"},","),e(" operand_2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n sum_of_operands "),a("span",{class:"token operator"},"="),e(" operand_1 "),a("span",{class:"token operator"},"+"),e(" operand_2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endfunction"),e("\n\n "),a("span",{class:"token keyword"},"function"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token function"},"larger_operand"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" operand_1"),a("span",{class:"token punctuation"},","),e(" operand_2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n larger_operand "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),e("operand_1 "),a("span",{class:"token operator"},">="),e(" operand_2"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"?"),e(" operand_1 "),a("span",{class:"token punctuation"},":"),e(" operand_2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endfunction"),e("\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br")])],-1),q=a("h3",{id:"task"},[a("a",{class:"header-anchor",href:"#task","aria-hidden":"true"},"#"),e(" task")],-1),V=a("p",null,"将测试流程分为多个任务:",-1),G=a("ul",null,[a("li",null,"初始化任务"),a("li",null,"模拟生成任务"),a("li",null,"自我检查任务")],-1),X=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e(" adder_task "),a("span",{class:"token punctuation"},"("),e("c_out"),a("span",{class:"token punctuation"},","),e(" sum"),a("span",{class:"token punctuation"},","),e(" clk"),a("span",{class:"token punctuation"},","),e(" reset"),a("span",{class:"token punctuation"},","),e(" c_in"),a("span",{class:"token punctuation"},","),e(" data_a"),a("span",{class:"token punctuation"},","),e(" data_b"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" sum"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token keyword"},"reg"),e(" c_out"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"input"),e(" "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" data_a"),a("span",{class:"token punctuation"},","),e(" data_b"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"input"),e(" clk"),a("span",{class:"token punctuation"},","),e(" reset"),a("span",{class:"token punctuation"},","),e(" c_in"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk "),a("span",{class:"token keyword"},"or"),e(),a("span",{class:"token keyword"},"posedge"),e(" reset"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("reset"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"{"),e("c_out"),a("span",{class:"token punctuation"},","),e(" sum"),a("span",{class:"token operator"},"}"),e(),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"else"),e(" add_values "),a("span",{class:"token punctuation"},"("),e("sum"),a("span",{class:"token punctuation"},","),e(" c_out"),a("span",{class:"token punctuation"},","),e(" data_a"),a("span",{class:"token punctuation"},","),e(" data_b"),a("span",{class:"token punctuation"},","),e(" c_in"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token comment"},"// invoke task"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"task"),e(" add_values"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token comment"},"// task declaration"),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" SUM"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token keyword"},"reg"),e(" C_OUT"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"input"),e(" "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" DATA_A"),a("span",{class:"token punctuation"},","),e(" DATA_B"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"input"),e(" C_IN"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token operator"},"{"),e("C_OUT"),a("span",{class:"token punctuation"},","),e(" SUM"),a("span",{class:"token operator"},"}"),e(),a("span",{class:"token operator"},"="),e(" DATA_A "),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token punctuation"},"("),e("DATA_B "),a("span",{class:"token operator"},"+"),e(" C_IN"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endtask"),e("\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br")])],-1),K=a("p",null,'常用的 task 有: $display("fmt", ...), $monitor("fmt", ...), $time, $finish',-1),j=a("h2",{id:"data-structure"},[a("a",{class:"header-anchor",href:"#data-structure","aria-hidden":"true"},"#"),e(" Data Structure")],-1),Z=a("h3",{id:"常量"},[a("a",{class:"header-anchor",href:"#常量","aria-hidden":"true"},"#"),e(" 常量")],-1),Y=a("ul",null,[a("li",null,"0: 逻辑 0"),a("li",null,"1: 逻辑 1"),a("li",null,"x/X: Unknown/Floating"),a("li",null,"z/Z: 高阻抗状态(High Impedance)"),a("li",null,"parameter: #define")],-1),Q=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"localparam"),e(" idle "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"2'b00"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"parameter"),e(" Bit "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},","),e(" cnt_up "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1'b1"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token punctuation"},"["),e("Bit "),a("span",{class:"token operator"},"-"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" A"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),e("Bit "),a("span",{class:"token operator"},"-"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" A"),a("span",{class:"token punctuation"},";"),e("\n\nA "),a("span",{class:"token operator"},"="),e(" A "),a("span",{class:"token operator"},"+"),e(" cnt_up"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),J=a("h3",{id:"向量"},[a("a",{class:"header-anchor",href:"#向量","aria-hidden":"true"},"#"),e(" 向量")],-1),nn=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token punctuation"},"["),e("MSB"),a("span",{class:"token punctuation"},":"),e(" LSB"),a("span",{class:"token punctuation"},"]"),e(" 或 "),a("span",{class:"token punctuation"},"["),e("LSB"),a("span",{class:"token punctuation"},":"),e(" MSB"),a("span",{class:"token punctuation"},"]"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),sn=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" A"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 4 bit"),e("\n"),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e(" B"),a("span",{class:"token punctuation"},","),e(" C"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 4 bit"),e("\n"),a("span",{class:"token keyword"},"wire"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"63"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" D"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 64 bit"),e("\n"),a("span",{class:"token keyword"},"wire"),e(" E"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 1 bit"),e("\n\nA"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(" B"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"&"),e(" C"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// A[2] = 0 & C[1], A[1] = B[0] & C[2]"),e("\nB"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\nC "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"4'b1011"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// C[0] = 1, C[1] = 0, C[2] = 1, C[3] = 1"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),an=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"integer"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" A "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 4元素数组. 每个元素为16bit元"),e("\n"),a("span",{class:"token keyword"},"reg"),e(" B "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"15"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// arr[4][16]数组, 每个元素为1bit元"),e("\n"),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" C "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"15"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// arr[4][16]数组, 每个元素为8bit元"),e("\n\nA"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 置零A中第三个元素(8 bit)"),e("\nA "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 置零A"),e("\nB"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// B[1][0](1 bit)置1"),e("\nC"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"4'b0010"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// C[0][0] 低4bit为0010"),e("\nC"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// C[2][8] 第5bit为1"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br")])],-1),en=a("h4",{id:"部分位选"},[a("a",{class:"header-anchor",href:"#部分位选","aria-hidden":"true"},"#"),e(" 部分位选")],-1),tn=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[e("vector"),a("span",{class:"token punctuation"},"["),e("base_expr"),a("span",{class:"token operator"},"+"),a("span",{class:"token punctuation"},":"),e(" const_width"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\nvector"),a("span",{class:"token punctuation"},"["),e("base_expr"),a("span",{class:"token operator"},"-"),a("span",{class:"token punctuation"},":"),e(" const_width"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n\ninst_mode"),a("span",{class:"token punctuation"},"["),e("mark"),a("span",{class:"token operator"},"+"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token comment"},"// => mark,mark+1"),e("\ngpio_mode"),a("span",{class:"token punctuation"},"["),e("mark"),a("span",{class:"token operator"},"-"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token comment"},"// => mark,mark-1,mark-2,mark-3"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),on=a("h3",{id:"数字"},[a("a",{class:"header-anchor",href:"#数字","aria-hidden":"true"},"#"),e(" 数字")],-1),ln=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// size ' signed base value"),e("\n"),a("span",{class:"token operator"},"<"),e("Bits长度"),a("span",{class:"token operator"},">"),e("'"),a("span",{class:"token punctuation"},"["),a("span",{class:"token keyword"},"signed"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token operator"},"<"),e("进制"),a("span",{class:"token operator"},"><"),e("数值"),a("span",{class:"token operator"},">"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),cn=a("ul",null,[a("li",null,"位长不能用表达式表示,只可用固定的 parameter")],-1),pn=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[e("Num "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"5'b01101"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 二进制"),e("\nNum "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"22"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 十进制"),e("\nNum "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"12'b0000_1111_0000"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 可读性"),e("\nNum "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"4'hf"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 十六进制(1111)"),e("\nNum "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"4'bxxx1"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 前三位未知"),e("\nNum "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"4'bz01"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 前两位为z, 后两位为01"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),un=a("h4",{id:"有符号数"},[a("a",{class:"header-anchor",href:"#有符号数","aria-hidden":"true"},"#"),e(" 有符号数")],-1),rn=a("ul",null,[a("li",null,"signed reg"),a("li",null,"signed wire"),a("li",null,"integer"),a("li",null,"'sxx")],-1),kn=a("h4",{id:"无符号数"},[a("a",{class:"header-anchor",href:"#无符号数","aria-hidden":"true"},"#"),e(" 无符号数")],-1),bn=a("ul",null,[a("li",null,"reg"),a("li",null,"wire"),a("li",null,"'xx")],-1),mn=a("h3",{id:"register"},[a("a",{class:"header-anchor",href:"#register","aria-hidden":"true"},"#"),e(" Register")],-1),dn=a("ul",null,[a("li",null,"reg/integer/time/real/realtime"),a("li",null,"有记忆性"),a("li",null,"默认值: x")],-1),gn=a("h4",{id:"integer"},[a("a",{class:"header-anchor",href:"#integer","aria-hidden":"true"},"#"),e(" integer")],-1),wn=a("p",null,"长度为 32 Bit, 补码表示, 常用于计数器",-1),yn=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" CLK"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"integer"),e(" i"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"for"),e(),a("span",{class:"token punctuation"},"("),e("i "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("i "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},";"),e(" i "),a("span",{class:"token operator"},"="),e(" i "),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),e(" tmp"),a("span",{class:"token punctuation"},"["),e("i"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"="),e(" In"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),hn=a("h4",{id:"real"},[a("a",{class:"header-anchor",href:"#real","aria-hidden":"true"},"#"),e(" real")],-1),fn=a("ul",null,[a("li",null,"real 默认值为 0,不可为 x/z"),a("li",null,"不可声明位宽")],-1),vn=a("h3",{id:"net"},[a("a",{class:"header-anchor",href:"#net","aria-hidden":"true"},"#"),e(" Net")],-1),_n=a("ul",null,[a("li",null,"wire/wand/wor"),a("li",null,"局部变量, 没有记忆性"),a("li",null,"默认值: z"),a("li",null,"wire 间不可直接相连, wand/wor 间课直接相连"),a("li",null,"可用 wire 定义局部变量")],-1),An=a("h2",{id:"gate-level"},[a("a",{class:"header-anchor",href:"#gate-level","aria-hidden":"true"},"#"),e(" Gate Level")],-1),Dn=a("h3",{id:"basic-gate"},[a("a",{class:"header-anchor",href:"#basic-gate","aria-hidden":"true"},"#"),e(" Basic Gate")],-1),Tn=a("ul",null,[a("li",null,"and"),a("li",null,"nand(与非)"),a("li",null,"or"),a("li",null,"nor(或非)"),a("li",null,"xor(异或)"),a("li",null,"xnor(同或)")],-1),xn=a("h3",{id:"use-gate"},[a("a",{class:"header-anchor",href:"#use-gate","aria-hidden":"true"},"#"),e(" Use Gate")],-1),In=a("ul",null,[a("li",null,"同一模块中, 实例名不能与线网名相同")],-1),Bn=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"and"),e(),a("span",{class:"token punctuation"},"("),e("w1"),a("span",{class:"token punctuation"},","),e(" In1"),a("span",{class:"token punctuation"},","),e(" In2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// w1 = Int and In2"),e("\n"),a("span",{class:"token keyword"},"or"),e(),a("span",{class:"token function"},"or1"),a("span",{class:"token punctuation"},"("),e("w2"),a("span",{class:"token punctuation"},","),e(" w1"),a("span",{class:"token punctuation"},","),e(" In2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// w2 = w1 or In2"),e("\n"),a("span",{class:"token keyword"},"xor"),e(),a("span",{class:"token function"},"xor"),a("span",{class:"token punctuation"},"("),e("Out"),a("span",{class:"token punctuation"},","),e(" w1"),a("span",{class:"token punctuation"},","),e(" w2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// Out = w1 xor w2"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),Wn=a("ul",null,[a("li",null,"实例数组")],-1),Cn=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"wire"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" irq"),a("span",{class:"token punctuation"},","),e(" ctrl"),a("span",{class:"token punctuation"},","),e(" sense"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token comment"},"/*\n * =>\n * nand\n * u8nand3 (irq[3], ctrl[3], sense[3]);\n * u8nand2 (irq[2], ctrl[2], sense[2]);\n * u8nand1 (irq[1], ctrl[1], sense[1]);\n * u8nand0 (irq[0], ctrl[0], sense[0]);\n */"),e("\n"),a("span",{class:"token keyword"},"nand"),e(" u8nand "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"("),e("irq"),a("span",{class:"token punctuation"},","),e(" ctrl"),a("span",{class:"token punctuation"},","),e(" sense"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),Hn=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"parameter"),e(" NUM_BITS "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"wire"),e(),a("span",{class:"token punctuation"},"["),e("NUM_BITS "),a("span",{class:"token operator"},"-"),e(),a("span",{class:"token number"},"1"),e(),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" gated_d"),a("span",{class:"token punctuation"},","),e(" din"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"wire"),e(" bypass"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"and"),e(" #"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e(" u0and "),a("span",{class:"token punctuation"},"["),e("NUM_BITS "),a("span",{class:"token operator"},"-"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},"("),e("gated_d"),a("span",{class:"token punctuation"},","),e(" din"),a("span",{class:"token punctuation"},","),e(" bypass"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),Nn=a("h3",{id:"self-defined-gate-用户自定义原语"},[a("a",{class:"header-anchor",href:"#self-defined-gate-用户自定义原语","aria-hidden":"true"},"#"),e(" Self-Defined Gate(用户自定义原语)")],-1),On=a("ul",null,[a("li",null,"可以有一个/多个输入"),a("li",null,"只能有一个输出"),a("li",null,"第一个端口必须是输出端口"),a("li",null,[a("code",null,"-"),e(' 表示 值"无变化"')])],-1),zn=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"primitive"),e(" XOR2 "),a("span",{class:"token punctuation"},"("),e("D_OUT"),a("span",{class:"token punctuation"},","),e(" X1"),a("span",{class:"token punctuation"},","),e(" X2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"input"),e(" X1"),a("span",{class:"token punctuation"},","),e(" X2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"output"),e(" D_OUT"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"table"),e(),a("span",{class:"token comment"},"// X1 X2 : D_OUT"),e("\n "),a("span",{class:"token number"},"0"),e(),a("span",{class:"token number"},"0"),e(),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"0"),e(),a("span",{class:"token number"},"1"),e(),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"1"),e(),a("span",{class:"token number"},"0"),e(),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"1"),e(),a("span",{class:"token number"},"1"),e(),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endtable"),e("\n"),a("span",{class:"token keyword"},"endprimitive"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),Sn=a("h2",{id:"dataflow-level"},[a("a",{class:"header-anchor",href:"#dataflow-level","aria-hidden":"true"},"#"),e(" Dataflow Level")],-1),Pn=a("ul",null,[a("li",null,[e("assign net = net/reg: "),a("strong",null,"左式只能是 net")])],-1),Un=a("h3",{id:"operators"},[a("a",{class:"header-anchor",href:"#operators","aria-hidden":"true"},"#"),e(" Operators")],-1),Mn=a("ul",null,[a("li",null,[a("a",{href:"https://hom-wang.gitbooks.io/verilog-hdl/content/Chapter_04.html",target:"_blank",rel:"noopener noreferrer"},"Operators List")])],-1),En=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[e("赋值"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token operator"},"<="),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},"="),e("\n"),a("span",{class:"token operator"},">"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},"<"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},"<="),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},">="),e("\n"),a("span",{class:"token operator"},"!="),a("span",{class:"token punctuation"},"."),e(),a("span",{class:"token operator"},"=="),e("\n"),a("span",{class:"token punctuation"},"["),e(),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),e(),a("span",{class:"token operator"},"{"),e(),a("span",{class:"token operator"},"}"),e("\n"),a("span",{class:"token operator"},"<<"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},">>"),e("\n"),a("span",{class:"token operator"},"+"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},"-"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},"/"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},"%"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),Ln=a("h3",{id:"整数提升"},[a("a",{class:"header-anchor",href:"#整数提升","aria-hidden":"true"},"#"),e(" 整数提升")],-1),Rn=a("ul",null,[a("li",null,"表达式所有中间取 最大位宽(最长(左/右)操作数)")],-1),Fn=a("h4",{id:""},[a("a",{class:"header-anchor",href:"#","aria-hidden":"true"},"#"),e(" { }")],-1),$n=a("p",null,[e("可实现 haskell 中的"),a("strong",null,"模式匹配")],-1),qn=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// 连接运算符"),e("\nA "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"{"),e(),a("span",{class:"token number"},"1'b0"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"1'b1"),a("span",{class:"token operator"},"}"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// A = 2'b01"),e("\nA "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"{"),e(" B"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),e(" C"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),e(" D"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"}"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// A = B[1], B[2], C[0], D[2]"),e("\nA "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"{"),e(),a("span",{class:"token number"},"2"),a("span",{class:"token operator"},"{"),a("span",{class:"token number"},"2'b01"),a("span",{class:"token operator"},"}"),e(),a("span",{class:"token operator"},"}"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// A = 4'b0101"),e("\nA "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"{"),e(),a("span",{class:"token number"},"3'b101"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"2"),a("span",{class:"token operator"},"{"),a("span",{class:"token number"},"1'b0"),a("span",{class:"token operator"},"}"),e(),a("span",{class:"token operator"},"}"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// A = 5'b101_00"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),Vn=a("h2",{id:"behavior-level"},[a("a",{class:"header-anchor",href:"#behavior-level","aria-hidden":"true"},"#"),e(" Behavior Level")],-1),Gn=a("ul",null,[a("li",null,[e("reg = net/reg: *"),a("em",null,"左式只能是 reg")])],-1),Xn=a("h3",{id:"时延控制"},[a("a",{class:"header-anchor",href:"#时延控制","aria-hidden":"true"},"#"),e(" 时延控制")],-1),Kn=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[e("#num\n\n"),a("span",{class:"token keyword"},"parameter"),e(" cycle "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"30"),a("span",{class:"token punctuation"},";"),e("\n\n# "),a("span",{class:"token number"},"2"),e("\n# cycle"),a("span",{class:"token operator"},"/"),a("span",{class:"token number"},"2"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),jn=a("h3",{id:"事件控制"},[a("a",{class:"header-anchor",href:"#事件控制","aria-hidden":"true"},"#"),e(" 事件控制")],-1),Zn=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[e("@"),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n@"),a("span",{class:"token punctuation"},"("),e(" sel"),a("span",{class:"token punctuation"},","),e(" a"),a("span",{class:"token punctuation"},","),e(" b"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n@"),a("span",{class:"token punctuation"},"("),e("sel "),a("span",{class:"token keyword"},"or"),e(" a "),a("span",{class:"token keyword"},"or"),e(" b"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n@"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" CLK"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n@"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"negedge"),e(" CLK"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),Yn=a("h3",{id:"语句内-间控制"},[a("a",{class:"header-anchor",href:"#语句内-间控制","aria-hidden":"true"},"#"),e(" 语句内/间控制")],-1),Qn=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[e("q "),a("span",{class:"token operator"},"="),e(" @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk_iol"),a("span",{class:"token punctuation"},")"),e(" d"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token comment"},"// 语句内事件控制"),e("\n\n@"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk_iol"),a("span",{class:"token punctuation"},")"),e(" "),a("span",{class:"token comment"},"// 语句间事件控制"),e("\n q "),a("span",{class:"token operator"},"="),e(" temp"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),Jn=a("h3",{id:"always"},[a("a",{class:"header-anchor",href:"#always","aria-hidden":"true"},"#"),e(" always")],-1),ns=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),e("事件"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),e(" 事件"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),ss=a("h3",{id:"if-else"},[a("a",{class:"header-anchor",href:"#if-else","aria-hidden":"true"},"#"),e(" if-else")],-1),as=a("ul",null,[a("li",null,"必须添加 else")],-1),es=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("condition1"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n"),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("condition2"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n"),a("span",{class:"token keyword"},"else"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br")])],-1),ts=a("h3",{id:"case-statement"},[a("a",{class:"header-anchor",href:"#case-statement","aria-hidden":"true"},"#"),e(" Case Statement")],-1),os=a("ul",null,[a("li",null,"expr: 常量/变量/连接运算符{ }/x/z"),a("li",null,"casex: 当输入某一位为 x/z 时,忽略此位匹配(恒将此位匹配为真)"),a("li",null,"casez: 当输入某一位为 z 时,忽略此位匹配(恒将此位匹配为真)")],-1),ls=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"case"),e(),a("span",{class:"token punctuation"},"("),e("expr"),a("span",{class:"token punctuation"},")"),e("\n item "),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n item "),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},":"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n item "),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"default"),a("span",{class:"token punctuation"},":"),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"endcase"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br")])],-1),cs=a("h3",{id:"for"},[a("a",{class:"header-anchor",href:"#for","aria-hidden":"true"},"#"),e(" for")],-1),ps=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"for"),e(),a("span",{class:"token punctuation"},"("),e("循环初值"),a("span",{class:"token punctuation"},";"),e(" 循环条件"),a("span",{class:"token punctuation"},";"),e(" 控制部分"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),us=a("h3",{id:"repeat-loop"},[a("a",{class:"header-anchor",href:"#repeat-loop","aria-hidden":"true"},"#"),e(" repeat loop")],-1),rs=a("ul",null,[a("li",null,[e("initial for "),a("strong",null,"test bench")]),a("li",null,[e("当需 if/else 进行断言时,注意 "),a("strong",null,"延时"),e(" 造成的错误逻辑")])],-1),is=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// 重复事件控制:"),e("\n"),a("span",{class:"token comment"},"// 先计算好右值, 等待时钟 clk 上出现2个负跳变沿, 再把右值赋给 result"),e("\nresult "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"repeat"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e(" @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"negedge"),e(" clk"),a("span",{class:"token punctuation"},")"),e(" hw_data "),a("span",{class:"token operator"},"+"),e(" hr_data"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token comment"},"// repeat 循环语句:"),e("\n"),a("span",{class:"token keyword"},"repeat"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),e("\n @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk"),a("span",{class:"token punctuation"},")"),e(" result "),a("span",{class:"token operator"},"="),e(" hw_data "),a("span",{class:"token operator"},"+"),e(" hr_data"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),ks=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"initial"),e(),a("span",{class:"token keyword"},"begin"),e("\n inc_DAC "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1"),e("’b1"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token function"},"repeat"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4095"),a("span",{class:"token punctuation"},")"),e(" @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token comment"},"// bring DAC right up to point of rollover"),e("\n inc_DAC "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1"),e("’b0"),a("span",{class:"token punctuation"},";"),e("\n inc_sym "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1"),e("’b1"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token function"},"repeat"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},")"),e("@"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token comment"},"// bring sample count up to 7"),e("\n inc_sym "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1"),e("’b0"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"end"),e("\n\n"),a("span",{class:"token keyword"},"initial"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token number"},"#100"),e(),a("span",{class:"token property"},"$finish"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token comment"},"// run simulation for 100 units"),e("\n"),a("span",{class:"token keyword"},"end"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br")])],-1),bs=a("h3",{id:"forever-loop"},[a("a",{class:"header-anchor",href:"#forever-loop","aria-hidden":"true"},"#"),e(" forever loop")],-1),ms=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// $stop, $finish 可以终止 forever loop"),e("\n"),a("span",{class:"token keyword"},"forever"),e(),a("span",{class:"token number"},"#10"),e(" clk "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"~"),e(" clk"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),ds=a("h3",{id:"force-and-release"},[a("a",{class:"header-anchor",href:"#force-and-release","aria-hidden":"true"},"#"),e(" Force and Release")],-1),gs=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"initial"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"force"),e(" test_reset "),a("span",{class:"token operator"},"="),e(" penalty "),a("span",{class:"token operator"},"&"),e(" rtc_intr"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"#5"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"release"),e(" test_reset"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),ws=a("h3",{id:"blocking-and-non-blocking"},[a("a",{class:"header-anchor",href:"#blocking-and-non-blocking","aria-hidden":"true"},"#"),e(" Blocking and Non-Blocking")],-1),ys=a("ul",null,[a("li",null,"Blocking(=): 顺序执行"),a("li",null,"Non-Blocking(<=): 并行执行")],-1),hs=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token operator"},"="),e(" input_logic"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token operator"},"<="),e(" input_logic"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),fs=a("h3",{id:"disable"},[a("a",{class:"header-anchor",href:"#disable","aria-hidden":"true"},"#"),e(" disable")],-1),vs=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"begin"),e(),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token keyword"},"break"),e("\n "),a("span",{class:"token keyword"},"for"),e(),a("span",{class:"token punctuation"},"("),e("i "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(" i "),a("span",{class:"token operator"},"<"),e(" n"),a("span",{class:"token punctuation"},";"),e(" i "),a("span",{class:"token operator"},"="),e(" i"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e(),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token keyword"},"continue"),e("\n @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("a "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token comment"},'// "continue" loop'),e("\n "),a("span",{class:"token keyword"},"disable"),e(),a("span",{class:"token keyword"},"continue"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("a "),a("span",{class:"token operator"},"=="),e(" b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token comment"},'// "break" from loop'),e("\n "),a("span",{class:"token keyword"},"disable"),e(),a("span",{class:"token keyword"},"break"),a("span",{class:"token punctuation"},";"),e("\n statement1\n statement2\n "),a("span",{class:"token keyword"},"end"),e("\n"),a("span",{class:"token keyword"},"end"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),_s=a("h2",{id:"结构建模"},[a("a",{class:"header-anchor",href:"#结构建模","aria-hidden":"true"},"#"),e(" 结构建模")],-1),As=a("h3",{id:"generate-语句"},[a("a",{class:"header-anchor",href:"#generate-语句","aria-hidden":"true"},"#"),e(" generate 语句")],-1),Ds=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"generate"),e("\n "),a("span",{class:"token keyword"},"for"),e(),a("span",{class:"token punctuation"},"("),e("gv_i "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(" gv_i "),a("span",{class:"token operator"},"<"),e(" SIZE"),a("span",{class:"token punctuation"},";"),e(" gv_i "),a("span",{class:"token operator"},"="),e(" gv_i "),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"begin"),a("span",{class:"token punctuation"},":"),e(" blk\n "),a("span",{class:"token keyword"},"xor"),e(" uxor "),a("span",{class:"token punctuation"},"("),e("y"),a("span",{class:"token punctuation"},"["),e("gv_i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),e(" a"),a("span",{class:"token punctuation"},"["),e("gv_i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),e(" b"),a("span",{class:"token punctuation"},"["),e("gv_i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n"),a("span",{class:"token keyword"},"endgenerate"),e("\n"),a("span",{class:"token comment"},"// =>"),e("\n"),a("span",{class:"token comment"},"// module.blk[0].uxor"),e("\n"),a("span",{class:"token comment"},"// module.blk[1].uxor"),e("\n"),a("span",{class:"token comment"},"// module.blk[2].uxor"),e("\n"),a("span",{class:"token comment"},"// ..."),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),Ts=a("h2",{id:"delay-时延"},[a("a",{class:"header-anchor",href:"#delay-时延","aria-hidden":"true"},"#"),e(" Delay(时延)")],-1),xs=a("ul",null,[a("li",null,"语句内时延"),a("li",null,"语句间时延"),a("li",null,"语句内时延期间:右值保持稳定不变,才可成功赋给左值")],-1),Is=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[e("sum "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),e("a "),a("span",{class:"token operator"},"^"),e(" b"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"^"),e(" cin"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token number"},"#4"),e(" t1 "),a("span",{class:"token operator"},"="),e(" a "),a("span",{class:"token operator"},"&"),e(" cin"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Bs=a("h2",{id:"预编译指令"},[a("a",{class:"header-anchor",href:"#预编译指令","aria-hidden":"true"},"#"),e(" 预编译指令")],-1),Ws=a("h3",{id:"define-宏"},[a("a",{class:"header-anchor",href:"#define-宏","aria-hidden":"true"},"#"),e(" define 宏")],-1),Cs=a("p",null,"将多个 define 宏,放至 _defines.v, 作为全局宏",-1),Hs=a("h2",{id:"data-path"},[a("a",{class:"header-anchor",href:"#data-path","aria-hidden":"true"},"#"),e(" Data Path")],-1),Ns=a("h3",{id:"multiplexer"},[a("a",{class:"header-anchor",href:"#multiplexer","aria-hidden":"true"},"#"),e(" Multiplexer")],-1),Os=a("h3",{id:"adder"},[a("a",{class:"header-anchor",href:"#adder","aria-hidden":"true"},"#"),e(" Adder")],-1),zs=a("h3",{id:"register-data-path"},[a("a",{class:"header-anchor",href:"#register-data-path","aria-hidden":"true"},"#"),e(" Register Data Path")],-1),Ss=a("h3",{id:"memory"},[a("a",{class:"header-anchor",href:"#memory","aria-hidden":"true"},"#"),e(" Memory")],-1),Ps=a("ul",null,[a("li",null,"其中数据文件中地址必须在系统任务中定义的范围内,系统任务中定义的地址必须在存储器定义的地址范围内"),a("li",null,"优先考虑数据文件中的地址>系统任务中定义的起始地址和结束地址>存储器定义的起始地址和结束地址")],-1),Us=a("h2",{id:"demos"},[a("a",{class:"header-anchor",href:"#demos","aria-hidden":"true"},"#"),e(" Demos")],-1),Ms=a("ul",null,[a("li",null,[a("a",{href:"https://hom-wang.gitbooks.io/verilog-hdl/content/Chapter_07.html",target:"_blank",rel:"noopener noreferrer"},"GitBook")]),a("li",null,[a("a",{href:"http://www.xilinx.com/support/university/ise/ise-teaching-material/hdl-design.html",target:"_blank",rel:"noopener noreferrer"},"Xilinx Lab")])],-1),Es=a("h3",{id:"binary-multiplier"},[a("a",{class:"header-anchor",href:"#binary-multiplier","aria-hidden":"true"},"#"),e(" Binary Multiplier")],-1),Ls=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[e(" "),a("span",{class:"token number"},"1100"),e(),a("span",{class:"token punctuation"},"("),e("the multiplicand"),a("span",{class:"token punctuation"},")"),e("\nx "),a("span",{class:"token number"},"1011"),e(),a("span",{class:"token punctuation"},"("),e("the multiplier"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token operator"},"----"),e("\n "),a("span",{class:"token number"},"0000"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"initial"),e(" partial product"),a("span",{class:"token punctuation"},","),e(" start "),a("span",{class:"token keyword"},"with"),e(),a("span",{class:"token number"},"0000"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token number"},"1100"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),e("st multiplier "),a("span",{class:"token keyword"},"bit"),e(" is "),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),e(" so add the multiplicand"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token operator"},"----"),e("\n "),a("span",{class:"token number"},"1100"),e(),a("span",{class:"token punctuation"},"("),e("sum"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token operator"},"----"),e("\n "),a("span",{class:"token number"},"01100"),e(),a("span",{class:"token punctuation"},"("),e("shift sum one position to the right"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token number"},"1100"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),e("nd multiplier "),a("span",{class:"token keyword"},"bit"),e(" is "),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),e(" so add multiplicand again"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token operator"},"----"),e("\n "),a("span",{class:"token number"},"100100"),e(),a("span",{class:"token punctuation"},"("),e("sum"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"with"),e(" a carry generated on the left"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token operator"},"----"),e("\n "),a("span",{class:"token number"},"100100"),e(),a("span",{class:"token punctuation"},"("),e("shift sum once to the right"),a("span",{class:"token punctuation"},","),e(" including carry"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token number"},"0100100"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"3"),e("rd multiplier "),a("span",{class:"token keyword"},"bit"),e(" is "),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),e(" so skip add"),a("span",{class:"token punctuation"},","),e(" shift once"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token operator"},"----"),e("\n "),a("span",{class:"token number"},"1100"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"4"),e("th multiplier "),a("span",{class:"token keyword"},"bit"),e(" is "),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),e(" so add multiplicand again"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token operator"},"----"),e("\n "),a("span",{class:"token number"},"10000100"),e(),a("span",{class:"token punctuation"},"("),e("sum"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"with"),e(" a carry generated on the left"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token number"},"10000100"),e(),a("span",{class:"token punctuation"},"("),e("shift sum once to the right"),a("span",{class:"token punctuation"},","),e(" including carry"),a("span",{class:"token punctuation"},")"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br")])],-1),Rs=a("h3",{id:"multi-hz"},[a("a",{class:"header-anchor",href:"#multi-hz","aria-hidden":"true"},"#"),e(" Multi-Hz")],-1),Fs=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/*\n * 利用计数器实现任意分频\n */"),e("\n"),a("span",{class:"token important"},"always"),e(" @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" f_clk"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n\n "),a("span",{class:"token comment"},"//设定频率控制字p "),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("i "),a("span",{class:"token operator"},"=="),e(" p"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n i"),a("span",{class:"token operator"},"="),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n f_out"),a("span",{class:"token operator"},"=~"),e("f_out"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token keyword"},"begin"),e("\n i"),a("span",{class:"token operator"},"="),e("i"),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n"),a("span",{class:"token keyword"},"end"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br")])],-1),$s=a("h2",{id:"tips"},[a("a",{class:"header-anchor",href:"#tips","aria-hidden":"true"},"#"),e(" Tips")],-1),qs=a("h3",{id:"不可综合结构"},[a("a",{class:"header-anchor",href:"#不可综合结构","aria-hidden":"true"},"#"),e(" 不可综合结构")],-1),Vs=a("ul",null,[a("li",null,"initial: 只用于 test bench"),a("li",null,"events: Events 同步测试各个组件"),a("li",null,"real: Real 数据类型不可综合"),a("li",null,"time: Time 数据类型不可综合"),a("li",null,"force/release"),a("li",null,"assign(reg)/deassign(reg)"),a("li",null,"fork join"),a("li",null,"primitive: 只有门级的原语(primitives)可综合"),a("li",null,"table: 用户自定义原语(UDP)及 table 不可综合"),a("li",null,[a("code",null,"#1"),e(" 延迟只用于仿真,综合器直接忽略延迟")])],-1),Gs=a("h3",{id:"混合编程"},[a("a",{class:"header-anchor",href:"#混合编程","aria-hidden":"true"},"#"),e(" 混合编程")],-1),Xs=a("ul",null,[a("li",null,"内部变量用 assign 赋值"),a("li",null,"输出变量通过监听 内部变量 改变输出值")],-1),Ks=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[e(" "),a("span",{class:"token keyword"},"assign"),e(" DT0 "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"assign"),e(" DT1 "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),e("DT0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n AOut "),a("span",{class:"token operator"},"<="),e(" DT0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),e("DT1"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n BOut "),a("span",{class:"token operator"},"<="),e(" DT1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br")])],-1),js=a("h3",{id:"上升沿-下降沿"},[a("a",{class:"header-anchor",href:"#上升沿-下降沿","aria-hidden":"true"},"#"),e(" 上升沿/下降沿")],-1),Zs=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[e(" "),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" A "),a("span",{class:"token keyword"},"or"),e(),a("span",{class:"token keyword"},"negedge"),e(" B"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("A"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),e("\n "),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),e("B"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),e("\n "),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),e("\n "),a("span",{class:"token keyword"},"end"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),Ys=a("h3",{id:"parameter"},[a("a",{class:"header-anchor",href:"#parameter","aria-hidden":"true"},"#"),e(" Parameter")],-1),Qs=a("ul",null,[a("li",null,"只在定义的模块内部起作用")],-1),Js=a("h4",{id:"overload-method"},[a("a",{class:"header-anchor",href:"#overload-method","aria-hidden":"true"},"#"),e(" Overload Method")],-1),na=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e(" data_path\n#"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"parameter"),e(" DATA_WIDTH "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token keyword"},"input"),e(" A"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH "),a("span",{class:"token operator"},"-"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" B"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH "),a("span",{class:"token operator"},"-"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" C\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),sa=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e(" data_path_tb\n"),a("span",{class:"token punctuation"},"("),e("\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n data_path #"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"DATA_WIDTH"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"16"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e(" DUT "),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"A"),a("span",{class:"token punctuation"},"("),e("A"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"B"),a("span",{class:"token punctuation"},"("),e("B"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"C"),a("span",{class:"token punctuation"},"("),e("C"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),aa=a("h4",{id:"constant-variable"},[a("a",{class:"header-anchor",href:"#constant-variable","aria-hidden":"true"},"#"),e(" Constant Variable")],-1),ea=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[e("reset_value "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"{{"),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH"),a("span",{class:"token operator"},"/"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"{"),a("span",{class:"token number"},"1'b0"),a("span",{class:"token operator"},"}}"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},"{"),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH"),a("span",{class:"token operator"},"/"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"{"),a("span",{class:"token number"},"1'b1"),a("span",{class:"token operator"},"}}}"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),ta=a("h4",{id:"test-bench"},[a("a",{class:"header-anchor",href:"#test-bench","aria-hidden":"true"},"#"),e(" Test Bench")],-1),oa=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token important"},"always "),a("span",{class:"token keyword"},"begin"),e("\n clk "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"forever"),e(" #DELAY clk "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"~"),e("clk"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"end"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),la=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"reg"),e(" clock"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"integer"),e(" no_of_clocks"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"parameter"),e(" CLOCK_PERIOD "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"parameter"),e(" TIME "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"50000"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"initial"),e(" no_of_clocks "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"initial"),e(" clock "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1'b0"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token important"},"always "),e("#"),a("span",{class:"token punctuation"},"("),e("CLOCK_PERIOD"),a("span",{class:"token operator"},"/"),a("span",{class:"token number"},"2.0"),a("span",{class:"token punctuation"},")"),e(" clock "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token operator"},"~"),e("clock"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clock"),a("span",{class:"token punctuation"},")"),e("\n no_of_clocks "),a("span",{class:"token operator"},"="),e(" no_of_clocks "),a("span",{class:"token operator"},"+"),a("span",{class:"token number"},"1"),e(),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"initial"),e(),a("span",{class:"token keyword"},"begin"),e("\n #TIME"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token property"},"$display"),a("span",{class:"token punctuation"},"("),e('"End of simulation '),a("span",{class:"token keyword"},"time"),e(" is "),a("span",{class:"token operator"},"%"),e("d "),a("span",{class:"token punctuation"},","),e("\n total number of clocks seen is "),a("span",{class:"token operator"},"%"),e("d expected is "),a("span",{class:"token operator"},"%"),e('d"'),a("span",{class:"token punctuation"},","),a("span",{class:"token property"},"$time"),a("span",{class:"token punctuation"},","),e("no_of_clocks"),a("span",{class:"token punctuation"},","),a("span",{class:"token punctuation"},"("),a("span",{class:"token property"},"$time"),a("span",{class:"token operator"},"/"),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token property"},"$finish"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"end"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br")])],-1),ca=a("h2",{id:"有限状态机-fsm"},[a("a",{class:"header-anchor",href:"#有限状态机-fsm","aria-hidden":"true"},"#"),e(" 有限状态机(FSM)")],-1),pa=a("ul",null,[a("li",null,"reset: initial state"),a("li",null,"default: illegal/unreachable state")],-1),ua=a("h2",{id:"算术状态机-asm"},[a("a",{class:"header-anchor",href:"#算术状态机-asm","aria-hidden":"true"},"#"),e(" 算术状态机(ASM)")],-1),ra=a("ul",null,[a("li",null,"state box: moore fsm"),a("li",null,"conditional box: mealy fsm"),a("li",null,[e("decision box: "),a("code",null,"x_input"),e(" = 0/1")])],-1),ia=a("h2",{id:"system-verilog"},[a("a",{class:"header-anchor",href:"#system-verilog","aria-hidden":"true"},"#"),e(" System Verilog")],-1),ka=a("h3",{id:"enum"},[a("a",{class:"header-anchor",href:"#enum","aria-hidden":"true"},"#"),e(" Enum")],-1),ba=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"typedef"),e(),a("span",{class:"token keyword"},"enum"),e(),a("span",{class:"token keyword"},"logic"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"{"),e("\n RED"),a("span",{class:"token punctuation"},","),e(" GREEN"),a("span",{class:"token punctuation"},","),e(" BLUE"),a("span",{class:"token punctuation"},","),e(" CYAN"),a("span",{class:"token punctuation"},","),e(" MAGENTA"),a("span",{class:"token punctuation"},","),e(" YELLOW\n"),a("span",{class:"token operator"},"}"),e(" color_t"),a("span",{class:"token punctuation"},";"),e("\n\ncolor_t my_color "),a("span",{class:"token operator"},"="),e(" GREEN"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"initial"),e(),a("span",{class:"token property"},"$display"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"The color is %s"'),a("span",{class:"token punctuation"},","),e(" my_color"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"name"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),ma=a("h3",{id:"struct-and-union"},[a("a",{class:"header-anchor",href:"#struct-and-union","aria-hidden":"true"},"#"),e(" Struct and Union")],-1),da=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"typedef"),e(),a("span",{class:"token keyword"},"struct"),e(),a("span",{class:"token keyword"},"packed"),e(),a("span",{class:"token operator"},"{"),e("\n "),a("span",{class:"token keyword"},"bit"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" expo"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"bit"),e(" sign"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"bit"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"51"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" man"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token operator"},"}"),e(" FP"),a("span",{class:"token punctuation"},";"),e("\n\nFP zero "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"64'b0"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),ga=a("h3",{id:"procedural-block"},[a("a",{class:"header-anchor",href:"#procedural-block","aria-hidden":"true"},"#"),e(" Procedural Block")],-1),wa=a("ul",null,[a("li",null,"always_comb: 用于组合逻辑电路(相当于 Verilog 中对所有输入变量电平敏感的 always,但 always_comb 无需手动列出所有输入变量,系统会自动识别)"),a("li",null,"always_ff: 用于触发器及相关的时序逻辑电路(相当于 Verilog 中对某个或某几个信号有效跳变沿敏感、并带有信号储存特性的 always)"),a("li",null,"always_latch: 用于锁存器级相关的时序逻辑电路(相当于 Verilog 中对某个或某几个信号电平敏感、并带有信号储存特性的的 always)")],-1),ya=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token important"},"always_comb "),a("span",{class:"token keyword"},"begin"),e("\n tmp "),a("span",{class:"token operator"},"="),e(" b "),a("span",{class:"token operator"},"*"),e(" b "),a("span",{class:"token operator"},"-"),e(),a("span",{class:"token number"},"4"),e(),a("span",{class:"token operator"},"*"),e(" a "),a("span",{class:"token operator"},"*"),e(" c"),a("span",{class:"token punctuation"},";"),e("\n no_root "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),e("tmp "),a("span",{class:"token operator"},"<"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"end"),e("\n\n"),a("span",{class:"token important"},"always_ff @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk"),a("span",{class:"token punctuation"},")"),e("\n count "),a("span",{class:"token operator"},"<="),e(" count "),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e("\n\n\n"),a("span",{class:"token important"},"always_latch"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("en"),a("span",{class:"token punctuation"},")"),e(" q "),a("span",{class:"token operator"},"<="),e(" d"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),ha=a("h3",{id:"interface"},[a("a",{class:"header-anchor",href:"#interface","aria-hidden":"true"},"#"),e(" Interface")],-1),fa=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"interface"),e(" interfaceName"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"logic"),e(" a"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"logic"),e(" b"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"modport"),e(" in "),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"input"),e(" a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"output"),e(" b"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"modport"),e(" out "),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"input"),e(" b"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token keyword"},"output"),e(" a"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"endinterface"),e("\n\n"),a("span",{class:"token keyword"},"module"),e(" top"),a("span",{class:"token punctuation"},";"),e("\n interfaceName i "),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n u_a m1 "),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"i1"),a("span",{class:"token punctuation"},"("),e("i"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n u_b m2 "),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"i2"),a("span",{class:"token punctuation"},"("),e("i"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"endmodule"),e("\n\n"),a("span",{class:"token keyword"},"module"),e(" u_a "),a("span",{class:"token punctuation"},"("),e("interfaceName"),a("span",{class:"token punctuation"},"."),e("in i1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"endmodule"),e("\n\n"),a("span",{class:"token keyword"},"module"),e(" u_b "),a("span",{class:"token punctuation"},"("),e("interfaceName"),a("span",{class:"token punctuation"},"."),e("out i2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br")])],-1),va=a("h3",{id:"testing"},[a("a",{class:"header-anchor",href:"#testing","aria-hidden":"true"},"#"),e(" Testing")],-1),_a=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"module"),e(" top"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"integer"),e(" num_packets "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token property"},"$random"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"reg"),e(" A"),a("span",{class:"token punctuation"},","),e(" B"),a("span",{class:"token punctuation"},","),e(" C"),a("span",{class:"token punctuation"},","),e(" clk"),a("span",{class:"token punctuation"},","),e(" reset_n"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"wire"),e(" D"),a("span",{class:"token punctuation"},";"),e("\n register_logic "),a("span",{class:"token function"},"dut"),a("span",{class:"token punctuation"},"("),e("A"),a("span",{class:"token punctuation"},","),e(" B"),a("span",{class:"token punctuation"},","),e(" C"),a("span",{class:"token punctuation"},","),e(" clk"),a("span",{class:"token punctuation"},","),e(" reset_n"),a("span",{class:"token punctuation"},","),e(" D"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token comment"},"// generate clock"),e("\n "),a("span",{class:"token comment"},"// ..."),e("\n\n "),a("span",{class:"token keyword"},"initial"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token function"},"run"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n "),a("span",{class:"token keyword"},"task"),e(),a("span",{class:"token function"},"run"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n reset_n "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"#20"),e(" reset_n "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk"),a("span",{class:"token punctuation"},")"),e(" reset_n "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"#1"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"repeat"),e(),a("span",{class:"token punctuation"},"("),e("num_packets"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n A "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token property"},"$random"),a("span",{class:"token punctuation"},";"),e(" B "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token property"},"$random"),a("span",{class:"token punctuation"},";"),e(" C "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token property"},"$random"),a("span",{class:"token punctuation"},";"),e("\n @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token property"},"$display"),a("span",{class:"token punctuation"},"("),e("A"),a("span",{class:"token punctuation"},","),e(" B"),a("span",{class:"token punctuation"},","),e(" C"),a("span",{class:"token punctuation"},","),e(" D"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token property"},"$finish"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endtask"),e("\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br")])],-1),Aa=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(" Packet"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"string"),e(" name"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"rand"),e(),a("span",{class:"token keyword"},"bit"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" sa"),a("span",{class:"token punctuation"},","),e(" da"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"rand"),e(),a("span",{class:"token keyword"},"reg"),e(" A"),a("span",{class:"token punctuation"},","),e(" B"),a("span",{class:"token punctuation"},","),e(" C"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"function"),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"display"),a("span",{class:"token punctuation"},"("),e("result"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token property"},"$display"),a("span",{class:"token punctuation"},"("),e("A"),a("span",{class:"token punctuation"},","),e(" B"),a("span",{class:"token punctuation"},","),e(" C"),a("span",{class:"token punctuation"},","),e(" result"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endfunction"),e("\n"),a("span",{class:"token keyword"},"endclass"),a("span",{class:"token punctuation"},":"),e(" Packet\n\n"),a("span",{class:"token comment"},"// inheritance"),e("\n"),a("span",{class:"token keyword"},"class"),e(" Packet_da_3 "),a("span",{class:"token keyword"},"extends"),e(" Packet"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"constraint"),e(" da_3 "),a("span",{class:"token operator"},"{"),e("\n da "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token operator"},"}"),e("\n\n "),a("span",{class:"token keyword"},"function"),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"display"),a("span",{class:"token punctuation"},"("),e("result"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"super"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"display"),a("span",{class:"token punctuation"},"("),e("result"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token property"},"$display"),a("span",{class:"token punctuation"},"("),e("sa"),a("span",{class:"token punctuation"},","),e(" da"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endfunction"),e("\n"),a("span",{class:"token keyword"},"endclass"),a("span",{class:"token punctuation"},":"),e(" Packet_da_3\n\n"),a("span",{class:"token keyword"},"class"),e(" Generator"),a("span",{class:"token punctuation"},";"),e("\n Packet pkt"),a("span",{class:"token punctuation"},";"),e("\n Channel out_chan"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"int"),e(" num_packets"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"function"),e(),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token function"},"gen"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n pkt "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token function"},"new"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},":"),e("\n pkt"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"randomize"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n out_chan"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"put"),a("span",{class:"token punctuation"},"("),e("pkt"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endfunction"),e("\n\n "),a("span",{class:"token keyword"},"task"),e(),a("span",{class:"token function"},"run"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"while"),e(),a("span",{class:"token punctuation"},"("),e("num_packets"),a("span",{class:"token operator"},"--"),e(),a("span",{class:"token operator"},"!="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token function"},"gen"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endtask"),e("\n"),a("span",{class:"token keyword"},"endclass"),e("\n\n"),a("span",{class:"token keyword"},"class"),e(" Driver"),a("span",{class:"token punctuation"},";"),e("\n Channel in_chan"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"task"),e(),a("span",{class:"token function"},"send"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n in_chan"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"get"),a("span",{class:"token punctuation"},"("),e("pkt"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n top"),a("span",{class:"token punctuation"},"."),e("A "),a("span",{class:"token operator"},"="),e(" pkt"),a("span",{class:"token punctuation"},"."),e("A"),a("span",{class:"token punctuation"},";"),e("\n top"),a("span",{class:"token punctuation"},"."),e("B "),a("span",{class:"token operator"},"="),e(" pkt"),a("span",{class:"token punctuation"},"."),e("B"),a("span",{class:"token punctuation"},";"),e("\n top"),a("span",{class:"token punctuation"},"."),e("C "),a("span",{class:"token operator"},"="),e(" pkt"),a("span",{class:"token punctuation"},"."),e("C"),a("span",{class:"token punctuation"},";"),e("\n @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" top"),a("span",{class:"token punctuation"},"."),e("clk"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endtask"),e("\n\n "),a("span",{class:"token keyword"},"task"),e(),a("span",{class:"token function"},"run"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"forever"),e(),a("span",{class:"token function"},"send"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endtask"),e("\n"),a("span",{class:"token keyword"},"endclass"),e("\n\n"),a("span",{class:"token keyword"},"module"),e(" top"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"initial"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token function"},"build"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token function"},"run"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n "),a("span",{class:"token keyword"},"task"),e(),a("span",{class:"token function"},"build"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n Config cfg "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token function"},"new"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n Channel chan "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token function"},"new"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n Generator gen "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token function"},"new"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n Driver drv "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token function"},"new"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n gen"),a("span",{class:"token punctuation"},"."),e("out_chan "),a("span",{class:"token operator"},"="),e(" chan"),a("span",{class:"token punctuation"},";"),e("\n drv"),a("span",{class:"token punctuation"},"."),e("in_chan "),a("span",{class:"token operator"},"="),e(" chan"),a("span",{class:"token punctuation"},";"),e("\n\n cfg"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"randomize"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"with"),e(),a("span",{class:"token operator"},"{"),e(" num_packets "),a("span",{class:"token operator"},">"),e(),a("span",{class:"token number"},"1500"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token operator"},"}"),e("\n gen"),a("span",{class:"token punctuation"},"."),e("num_packets "),a("span",{class:"token operator"},"="),e(" cfg"),a("span",{class:"token punctuation"},"."),e("num_packets"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endtask"),e("\n\n "),a("span",{class:"token keyword"},"task"),e(),a("span",{class:"token function"},"run"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"fork"),e("\n gen"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"run"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n drv"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"run"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"join"),e("\n "),a("span",{class:"token property"},"$finish"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endtask"),e("\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br"),a("span",{class:"line-number"},"58"),a("br"),a("span",{class:"line-number"},"59"),a("br"),a("span",{class:"line-number"},"60"),a("br"),a("span",{class:"line-number"},"61"),a("br"),a("span",{class:"line-number"},"62"),a("br"),a("span",{class:"line-number"},"63"),a("br"),a("span",{class:"line-number"},"64"),a("br"),a("span",{class:"line-number"},"65"),a("br"),a("span",{class:"line-number"},"66"),a("br"),a("span",{class:"line-number"},"67"),a("br"),a("span",{class:"line-number"},"68"),a("br"),a("span",{class:"line-number"},"69"),a("br"),a("span",{class:"line-number"},"70"),a("br"),a("span",{class:"line-number"},"71"),a("br"),a("span",{class:"line-number"},"72"),a("br"),a("span",{class:"line-number"},"73"),a("br"),a("span",{class:"line-number"},"74"),a("br"),a("span",{class:"line-number"},"75"),a("br"),a("span",{class:"line-number"},"76"),a("br"),a("span",{class:"line-number"},"77"),a("br"),a("span",{class:"line-number"},"78"),a("br"),a("span",{class:"line-number"},"79"),a("br"),a("span",{class:"line-number"},"80"),a("br"),a("span",{class:"line-number"},"81"),a("br")])],-1),Da=a("h2",{id:"u280-platform"},[a("a",{class:"header-anchor",href:"#u280-platform","aria-hidden":"true"},"#"),e(" U280 Platform")],-1),Ta=a("div",{class:"language-bash line-numbers-mode"},[a("pre",null,[a("code",null,[e("-xp param "),a("span",{class:"token punctuation"},"("),e("clock frequency etc."),a("span",{class:"token punctuation"},")"),e("\n-R report level\n-slr SLR region setting\n-sp memory resources mapping\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br")])],-1),xa=a("p",null,"tools:",-1),Ia=a("ul",null,[a("li",null,"xbutil query"),a("li",null,"platforminfo"),a("li",null,"kernelinfo"),a("li",null,[a("strong",null,"xclbinutil")]),a("li",null,"dmesg")],-1),Ba=a("h3",{id:"host-application"},[a("a",{class:"header-anchor",href:"#host-application","aria-hidden":"true"},"#"),e(" Host Application")],-1),Wa=a("h4",{id:"basic-flow"},[a("a",{class:"header-anchor",href:"#basic-flow","aria-hidden":"true"},"#"),e(" Basic Flow")],-1),Ca=a("ul",null,[a("li",null,"set the kernel arguments before performing any enqueue operation"),a("li",null,[e("keeping the buffer size "),a("strong",null,"2 MB ~ 4 GB")]),a("li",null,[a("code",null,"posix_memalign"),e(" is used instead of malloc for the host memory space pointer")])],-1),Ha=a("div",{class:"language-cpp line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"uint32_t"),e(),a("span",{class:"token operator"},"*"),e("a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},"*"),e("b"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},"*"),e("c"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token operator"},"*"),e("d "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token constant"},"NULL"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token function"},"posix_memalign"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"&"),e("a"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"4096"),a("span",{class:"token punctuation"},","),e(" BUF_SIZE "),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token keyword"},"sizeof"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"uint32_t"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token function"},"posix_memalign"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"&"),e("b"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"4096"),a("span",{class:"token punctuation"},","),e(" BUF_SIZE "),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token keyword"},"sizeof"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"uint32_t"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token function"},"posix_memalign"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"&"),e("c"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"4096"),a("span",{class:"token punctuation"},","),e(" BUF_SIZE "),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token keyword"},"sizeof"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"uint32_t"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token function"},"posix_memalign"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"void"),e(),a("span",{class:"token operator"},"*"),a("span",{class:"token operator"},"*"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"&"),e("d"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"4096"),a("span",{class:"token punctuation"},","),e(" BUF_SIZE "),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token keyword"},"sizeof"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"uint32_t"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br")])],-1),Na=a("ul",null,[a("li",null,"release resources for proper performance profile report")],-1),Oa=a("div",{class:"language-cpp line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token function"},"clReleaseCommandQueue"),a("span",{class:"token punctuation"},"("),e("Command_Queue"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token function"},"clReleaseContext"),a("span",{class:"token punctuation"},"("),e("Context"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token function"},"clReleaseDevice"),a("span",{class:"token punctuation"},"("),e("Target_Device_ID"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token function"},"clReleaseKernel"),a("span",{class:"token punctuation"},"("),e("Kernel"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token function"},"clReleaseProgram"),a("span",{class:"token punctuation"},"("),e("Program"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token function"},"free"),a("span",{class:"token punctuation"},"("),e("Platform_IDs"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token function"},"free"),a("span",{class:"token punctuation"},"("),e("Device_IDs"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),za=a("h4",{id:"tlp"},[a("a",{class:"header-anchor",href:"#tlp","aria-hidden":"true"},"#"),e(" TLP")],-1),Sa=a("p",null,[e("It is advisable to use the "),a("code",null,"posix_spawn()"),e(" system call to launch another process from the SDAccel environment application.")],-1),Pa=a("h3",{id:"u280-tools"},[a("a",{class:"header-anchor",href:"#u280-tools","aria-hidden":"true"},"#"),e(" U280 Tools")],-1),Ua=a("h4",{id:"gdb-based-debugging"},[a("a",{class:"header-anchor",href:"#gdb-based-debugging","aria-hidden":"true"},"#"),e(" GDB Based Debugging")],-1),Ma=a("div",{class:"language-bash line-numbers-mode"},[a("pre",null,[a("code",null,[e("xprint queue "),a("span",{class:"token punctuation"},"["),a("span",{class:"token operator"},"<"),e("cl_command_queue"),a("span",{class:"token operator"},">"),a("span",{class:"token punctuation"},"]"),e("\nxprint event "),a("span",{class:"token operator"},"<"),e("cl_event"),a("span",{class:"token operator"},">"),e("\nxprint mem "),a("span",{class:"token punctuation"},"["),a("span",{class:"token operator"},"<"),e("cl_mem"),a("span",{class:"token operator"},">"),a("span",{class:"token punctuation"},"]"),e("\nxprint kernel\nxprint all\nxstatus all\nxstatus --"),a("span",{class:"token operator"},"<"),e("ipName"),a("span",{class:"token operator"},">"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),Ea=a("h4",{id:"xcl-binary-util"},[a("a",{class:"header-anchor",href:"#xcl-binary-util","aria-hidden":"true"},"#"),e(" XCL Binary Util")],-1),La=a("div",{class:"language-bash line-numbers-mode"},[a("pre",null,[a("code",null,"xclbinutil -i binary_container_1.xclbin --info\n")]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),Ra=a("h4",{id:"xocc"},[a("a",{class:"header-anchor",href:"#xocc","aria-hidden":"true"},"#"),e(" XOCC")],-1),Fa=a("p",null,"Checking out-of-bound access made by kernel interface buffers (option: address) and uninitialized memory access initiated by kernel local to kernel (option: memory).",-1),$a=a("div",{class:"language-bash line-numbers-mode"},[a("pre",null,[a("code",null,[e("xocc -l –t sw_emu --xp param:compiler.fsanitize"),a("span",{class:"token operator"},"="),e("address -o bin_kernel.xclbin\nxocc -l –t sw_emu --xp param:compiler.fsanitize"),a("span",{class:"token operator"},"="),e("memory -o bin_kernel.xclbin\nxocc -l –t sw_emu --xp param:compiler.fsanitize"),a("span",{class:"token operator"},"="),e("address,memory -o bin_kernel.xclbin\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),qa=a("h4",{id:"xbutil"},[a("a",{class:"header-anchor",href:"#xbutil","aria-hidden":"true"},"#"),e(" XBUtil")],-1),Va=a("div",{class:"language-bash line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token function"},"sudo"),e(" /opt/xilinx/xrt/bin/xbutil flash -a "),a("span",{class:"token operator"},"<"),e("shell_name"),a("span",{class:"token operator"},">"),e(),a("span",{class:"token comment"},"# flash the firmware"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br")])],-1),Ga=a("div",{class:"language-bash line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token function"},"sudo"),e(" lspci -vd 10ee:\n"),a("span",{class:"token function"},"sudo"),e(" /opt/xilinx/xrt/bin/xbutil flash scan\n"),a("span",{class:"token function"},"sudo"),e(" /opt/xilinx/xrt/bin/xbutil validate -d "),a("span",{class:"token operator"},"<"),e("card_id"),a("span",{class:"token operator"},">"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),Xa=a("div",{class:"language-bash line-numbers-mode"},[a("pre",null,[a("code",null,[e("xbutil program -p "),a("span",{class:"token operator"},"<"),e("xclbin"),a("span",{class:"token operator"},">"),e("\nxbutil query "),a("span",{class:"token comment"},"# check memory banks usage"),e("\nxbutil status --lapc "),a("span",{class:"token comment"},"# check AXI violations"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br")])],-1),Ka=a("h4",{id:"dmesg"},[a("a",{class:"header-anchor",href:"#dmesg","aria-hidden":"true"},"#"),e(" dmesg")],-1),ja=a("h4",{id:"ila-trigger"},[a("a",{class:"header-anchor",href:"#ila-trigger","aria-hidden":"true"},"#"),e(" ILA Trigger")],-1),Za=a("ul",null,[a("li",null,"debug protocol hangs"),a("li",null,"examine the burst size, pipelining and data width to locate the bottleneck")],-1),Ya=a("div",{class:"language-cpp line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),a("span",{class:"token punctuation"},"."),e("\nstd"),a("span",{class:"token double-colon punctuation"},"::"),e("string binaryFile "),a("span",{class:"token operator"},"="),e(" xcl"),a("span",{class:"token double-colon punctuation"},"::"),a("span",{class:"token function"},"find_binary_file"),a("span",{class:"token punctuation"},"("),e("device_name"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"vAdd"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\ncl"),a("span",{class:"token double-colon punctuation"},"::"),e("Program"),a("span",{class:"token double-colon punctuation"},"::"),e("Binaries bins "),a("span",{class:"token operator"},"="),e(" xcl"),a("span",{class:"token double-colon punctuation"},"::"),a("span",{class:"token function"},"import_binary_file"),a("span",{class:"token punctuation"},"("),e("binaryFile"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\ndevices"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"resize"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\ncl"),a("span",{class:"token double-colon punctuation"},"::"),e("Program "),a("span",{class:"token function"},"program"),a("span",{class:"token punctuation"},"("),e("context"),a("span",{class:"token punctuation"},","),e(" devices"),a("span",{class:"token punctuation"},","),e(" bins"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\ncl"),a("span",{class:"token double-colon punctuation"},"::"),e("Kernel "),a("span",{class:"token function"},"kernel_vAdd"),a("span",{class:"token punctuation"},"("),e("program"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},'"kernel_vAdd_rtl"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token comment"},'// wait_for_enter("\\nPress ENTER to continue after setting up ILA trigger...");'),e("\nstd"),a("span",{class:"token double-colon punctuation"},"::"),e("cout "),a("span",{class:"token operator"},"<<"),e(),a("span",{class:"token string"},'"Pausing to arm ILA trigger. Hit enter here to resume host program..."'),e("\n "),a("span",{class:"token operator"},"<<"),e(" std"),a("span",{class:"token double-colon punctuation"},"::"),e("endl"),a("span",{class:"token punctuation"},";"),e("\nstd"),a("span",{class:"token double-colon punctuation"},"::"),e("cin"),a("span",{class:"token double-colon punctuation"},"::"),a("span",{class:"token function"},"get"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token comment"},"//Allocate Buffer in Global Memory"),e("\nstd"),a("span",{class:"token double-colon punctuation"},"::"),e("vector"),a("span",{class:"token operator"},"<"),e("cl"),a("span",{class:"token double-colon punctuation"},"::"),e("Memory"),a("span",{class:"token operator"},">"),e(" inBufVec"),a("span",{class:"token punctuation"},","),e(" outBufVec"),a("span",{class:"token punctuation"},";"),e("\ncl"),a("span",{class:"token double-colon punctuation"},"::"),e("Buffer "),a("span",{class:"token function"},"buffer_r1"),a("span",{class:"token punctuation"},"("),e("context"),a("span",{class:"token punctuation"},","),e("CL_MEM_USE_HOST_PTR "),a("span",{class:"token operator"},"|"),e(" CL_MEM_READ_ONLY"),a("span",{class:"token punctuation"},","),e("\nvector_size_bytes"),a("span",{class:"token punctuation"},","),e(" source_input1"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"data"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token comment"},"// ..."),e("\n"),a("span",{class:"token comment"},"// ..."),e("\n"),a("span",{class:"token comment"},"// ..."),e("\n\n"),a("span",{class:"token comment"},"//Copy input data to device global memory"),e("\nq"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"enqueueMigrateMemObjects"),a("span",{class:"token punctuation"},"("),e("inBufVec"),a("span",{class:"token punctuation"},","),a("span",{class:"token number"},"0"),a("span",{class:"token comment"},"/* 0 means from host*/"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token comment"},"//Set the Kernel Arguments"),e("\n"),a("span",{class:"token comment"},"// ..."),e("\n"),a("span",{class:"token comment"},"// ..."),e("\n"),a("span",{class:"token comment"},"// ..."),e("\n\n"),a("span",{class:"token comment"},"//Launch the Kernel"),e("\nq"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"enqueueTask"),a("span",{class:"token punctuation"},"("),e("kernel_vAdd"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br")])],-1),Qa=a("h2",{id:"axi-protocol"},[a("a",{class:"header-anchor",href:"#axi-protocol","aria-hidden":"true"},"#"),e(" AXI Protocol")],-1),Ja=a("p",null,"Advanced eXtensible Interface Protocol:",-1),ne=a("ul",null,[a("li",null,"handshake protocol: ready-valid protocol")],-1),se=a("h3",{id:"axi-channels"},[a("a",{class:"header-anchor",href:"#axi-channels","aria-hidden":"true"},"#"),e(" AXI Channels")],-1),ae=a("h4",{id:"read-address-channel"},[a("a",{class:"header-anchor",href:"#read-address-channel","aria-hidden":"true"},"#"),e(" Read Address Channel")],-1),ee=a("ul",null,[a("li",null,"arburst: burst type"),a("li",null,"araddr: start address"),a("li",null,"arlen: (# of transfers) - 1"),a("li",null,"arsize: bytes/transfer"),a("li",null,"arready (memory to host)"),a("li",null,"arvalid")],-1),te=a("h4",{id:"read-data-channel"},[a("a",{class:"header-anchor",href:"#read-data-channel","aria-hidden":"true"},"#"),e(" Read Data Channel")],-1),oe=a("ul",null,[a("li",null,"rdata: data"),a("li",null,"rresp: response (failure check)"),a("li",null,"rlast: flag for last piece of data"),a("li",null,"rready (host to memory)"),a("li",null,"rvalid")],-1),le=a("h4",{id:"write-address-channel"},[a("a",{class:"header-anchor",href:"#write-address-channel","aria-hidden":"true"},"#"),e(" Write Address Channel")],-1),ce=a("ul",null,[a("li",null,"awburst: burst type"),a("li",null,"awaddr: start address"),a("li",null,"awlen: (# of transfers) - 1"),a("li",null,"awsize: bytes/transfer"),a("li",null,"awready (memory to host)"),a("li",null,"awvalid")],-1),pe=a("h4",{id:"write-data-channel"},[a("a",{class:"header-anchor",href:"#write-data-channel","aria-hidden":"true"},"#"),e(" Write Data Channel")],-1),ue=a("ul",null,[a("li",null,"wdata: data"),a("li",null,"wstrb: write strobe -> write mask (1 bit mask for 1 byte data)"),a("li",null,"wlast: flag for last piece of data"),a("li",null,"wready (memory to host)"),a("li",null,"wvalid")],-1),re=a("h4",{id:"write-response-channel"},[a("a",{class:"header-anchor",href:"#write-response-channel","aria-hidden":"true"},"#"),e(" Write Response Channel")],-1),ie=a("ul",null,[a("li",null,"bresp: response (failure check)"),a("li",null,"bready (host to memory)"),a("li",null,"bvalid")],-1),ke=a("h3",{id:"axi-burst"},[a("a",{class:"header-anchor",href:"#axi-burst","aria-hidden":"true"},"#"),e(" AXI Burst")],-1),be=a("table",null,[a("thead",null,[a("tr",null,[a("th",{style:{"text-align":"right"}},"AxBURST[1:0]"),a("th",{style:{"text-align":"left"}},"Burst Type")])]),a("tbody",null,[a("tr",null,[a("td",{style:{"text-align":"right"}},"0b00"),a("td",{style:{"text-align":"left"}},"FIXED")]),a("tr",null,[a("td",{style:{"text-align":"right"}},"0b01"),a("td",{style:{"text-align":"left"}},"INCR")]),a("tr",null,[a("td",{style:{"text-align":"right"}},"0b10"),a("td",{style:{"text-align":"left"}},"WRAP")]),a("tr",null,[a("td",{style:{"text-align":"right"}},"0b11"),a("td",{style:{"text-align":"left"}},"Reserved")])])],-1),me=a("p",null,"burst length = AxLEN[7:0] + 1 (up to 256 transfers in each burst)",-1),de=a("table",null,[a("thead",null,[a("tr",null,[a("th",{style:{"text-align":"right"}},"AxSIZE[2:0]"),a("th",{style:{"text-align":"right"}},"Bytes in Transfer")])]),a("tbody",null,[a("tr",null,[a("td",{style:{"text-align":"right"}},"0b000"),a("td",{style:{"text-align":"right"}},"1")]),a("tr",null,[a("td",{style:{"text-align":"right"}},"0b001"),a("td",{style:{"text-align":"right"}},"2")]),a("tr",null,[a("td",{style:{"text-align":"right"}},"0b010"),a("td",{style:{"text-align":"right"}},"4")]),a("tr",null,[a("td",{style:{"text-align":"right"}},"0b011"),a("td",{style:{"text-align":"right"}},"8")]),a("tr",null,[a("td",{style:{"text-align":"right"}},"0b100"),a("td",{style:{"text-align":"right"}},"16")]),a("tr",null,[a("td",{style:{"text-align":"right"}},"0b101"),a("td",{style:{"text-align":"right"}},"32")]),a("tr",null,[a("td",{style:{"text-align":"right"}},"0b110"),a("td",{style:{"text-align":"right"}},"64")]),a("tr",null,[a("td",{style:{"text-align":"right"}},"0b111"),a("td",{style:{"text-align":"right"}},"128")])])],-1),ge=a("h4",{id:"read-burst"},[a("a",{class:"header-anchor",href:"#read-burst","aria-hidden":"true"},"#"),e(" Read Burst")],-1),we=a("p",null,[a("img",{src:"/awesome-notes/assets/AXI_Read_Burst.0e9ed250.png",alt:"Read Burst Example"})],-1),ye=a("h4",{id:"write-burst"},[a("a",{class:"header-anchor",href:"#write-burst","aria-hidden":"true"},"#"),e(" Write Burst")],-1),he=a("p",null,[a("img",{src:"/awesome-notes/assets/AXI_Write_Burst.63cb974a.png",alt:"Write Burst Example"})],-1),fe=a("h2",{id:"verilog-components"},[a("a",{class:"header-anchor",href:"#verilog-components","aria-hidden":"true"},"#"),e(" Verilog Components")],-1),ve=a("h3",{id:"clock-unit"},[a("a",{class:"header-anchor",href:"#clock-unit","aria-hidden":"true"},"#"),e(" Clock Unit")],-1),_e=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/**\n * @module tick_divider\n * @author sabertazimi\n * @email sabertazimi@gmail.com\n * @brief simple clock divider\n * @param DATA_WIDTH data width\n * @input clk_src clock signal\n * @output clk_group divided clock signals\n */"),e("\n"),a("span",{class:"token keyword"},"module"),e(" tick_divider\n#"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"parameter"),e(" DATA_WIDTH "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"32"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token keyword"},"input"),e(" clk_src"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" clk_group\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"initial"),e(),a("span",{class:"token keyword"},"begin"),e("\n clk_group "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token operator"},"{"),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"{"),a("span",{class:"token number"},"1'b0"),a("span",{class:"token operator"},"}}"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n "),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk_src"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n clk_group "),a("span",{class:"token operator"},"<="),e(" clk_group "),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br")])],-1),Ae=a("h3",{id:"signal-unit"},[a("a",{class:"header-anchor",href:"#signal-unit","aria-hidden":"true"},"#"),e(" Signal Unit")],-1),De=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/**\n * @module integer_to_segment\n * @author sabertazimi\n * @email sabertazimi@gmail.com\n * @brief raw data to segment encoder\n * @param DATA_WIDTH data width\n * @input data raw decimal data (4 bit)\n * @output seg_data bit data for cNodes\n */"),e("\n"),a("span",{class:"token keyword"},"module"),e(" integer_to_segment\n"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" int_data"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" seg_data\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),e("int_data"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"case"),e(),a("span",{class:"token punctuation"},"("),e("int_data"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token number"},"4'b0000"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b11000000"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 0"),e("\n "),a("span",{class:"token number"},"4'b0001"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b11111001"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 1"),e("\n "),a("span",{class:"token number"},"4'b0010"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b10100100"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 2"),e("\n "),a("span",{class:"token number"},"4'b0011"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b10110000"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 3"),e("\n "),a("span",{class:"token number"},"4'b0100"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b10011001"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 4"),e("\n "),a("span",{class:"token number"},"4'b0101"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b10010010"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 5"),e("\n "),a("span",{class:"token number"},"4'b0110"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b10000010"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 6"),e("\n "),a("span",{class:"token number"},"4'b0111"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b11111000"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 7"),e("\n "),a("span",{class:"token number"},"4'b1000"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b10000000"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 8"),e("\n "),a("span",{class:"token number"},"4'b1001"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b10010000"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// 9"),e("\n "),a("span",{class:"token number"},"4'b1010"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b10001000"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// a"),e("\n "),a("span",{class:"token number"},"4'b1011"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b10000011"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// b"),e("\n "),a("span",{class:"token number"},"4'b1100"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b11000110"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// c"),e("\n "),a("span",{class:"token number"},"4'b1101"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b10100001"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// d"),e("\n "),a("span",{class:"token number"},"4'b1110"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b10000110"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// e"),e("\n "),a("span",{class:"token number"},"4'b1111"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b10001110"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// f"),e("\n "),a("span",{class:"token keyword"},"default"),a("span",{class:"token punctuation"},":"),e(" seg_data "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"8'b11111111"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// off"),e("\n "),a("span",{class:"token keyword"},"endcase"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br")])],-1),Te=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/**\n * @module data_to_segment\n * @author sabertazimi\n * @email sabertazimi@gmail.com\n * @brief raw data to segment encoder\n * @param DATA_WIDTH data width\n * @input data raw decimal data\n * @output seg_data bit data for cNodes\n */"),e("\n"),a("span",{class:"token keyword"},"module"),e(" data_to_segment\n#"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"parameter"),e(" DATA_WIDTH "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"32"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" data"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH"),a("span",{class:"token operator"},"*"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" seg_data\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n integer_to_segment trans1 "),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"int_data"),a("span",{class:"token punctuation"},"("),e("data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"seg_data"),a("span",{class:"token punctuation"},"("),e("seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n integer_to_segment trans2 "),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"int_data"),a("span",{class:"token punctuation"},"("),e("data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"seg_data"),a("span",{class:"token punctuation"},"("),e("seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"15"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n integer_to_segment trans3 "),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"int_data"),a("span",{class:"token punctuation"},"("),e("data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"11"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"seg_data"),a("span",{class:"token punctuation"},"("),e("seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"23"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"16"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n integer_to_segment trans4 "),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"int_data"),a("span",{class:"token punctuation"},"("),e("data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"15"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"12"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"seg_data"),a("span",{class:"token punctuation"},"("),e("seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"31"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"24"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n integer_to_segment trans5 "),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"int_data"),a("span",{class:"token punctuation"},"("),e("data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"19"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"16"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"seg_data"),a("span",{class:"token punctuation"},"("),e("seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"39"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"32"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n integer_to_segment trans6 "),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"int_data"),a("span",{class:"token punctuation"},"("),e("data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"23"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"20"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"seg_data"),a("span",{class:"token punctuation"},"("),e("seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"47"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"40"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n integer_to_segment trans7 "),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"int_data"),a("span",{class:"token punctuation"},"("),e("data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"27"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"24"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"seg_data"),a("span",{class:"token punctuation"},"("),e("seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"55"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"48"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n integer_to_segment trans8 "),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"int_data"),a("span",{class:"token punctuation"},"("),e("data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"31"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"28"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"seg_data"),a("span",{class:"token punctuation"},"("),e("seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"63"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"56"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br")])],-1),xe=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/**\n * @module led_unit\n * @author sabertazimi\n * @email sabertazimi@gmail.com\n * @brief led display module (bind to aNodes and cNodes in FPGA)\n * @param DATA_WIDTH data width\n * @input clk_src clock signal (light different led on in round turn)\n * @input led_data raw decimal data\n * @output aNodes determine which led light on at now\n * @output cNodes determine how led light on (number)\n */"),e("\n"),a("span",{class:"token keyword"},"module"),e(" led_unit\n#"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"parameter"),e(" DATA_WIDTH "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"32"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token keyword"},"input"),e(" clk_src"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" led_data"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" aNodes"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" cNodes\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" count"),a("span",{class:"token punctuation"},";"),e(),a("span",{class:"token comment"},"// 2^3 = 8"),e("\n "),a("span",{class:"token keyword"},"wire"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH"),a("span",{class:"token operator"},"*"),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" seg_data"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"initial"),e(),a("span",{class:"token keyword"},"begin"),e("\n count "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n aNodes "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n cNodes "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n data_to_segment #"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"DATA_WIDTH"),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},")"),e(" data_to_segment "),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"data"),a("span",{class:"token punctuation"},"("),e("led_data"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"seg_data"),a("span",{class:"token punctuation"},"("),e("seg_data"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk_src"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n count "),a("span",{class:"token operator"},"="),e(" count "),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n "),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),e("count"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"case"),e(),a("span",{class:"token punctuation"},"("),e("count"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token number"},"3'b000"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token keyword"},"begin"),e("\n aNodes "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"8'b11111110"),a("span",{class:"token punctuation"},";"),e("\n cNodes "),a("span",{class:"token operator"},"="),e(" seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"7"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token number"},"3'b001"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token keyword"},"begin"),e("\n aNodes "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"8'b11111101"),a("span",{class:"token punctuation"},";"),e("\n cNodes "),a("span",{class:"token operator"},"="),e(" seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"15"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token number"},"3'b010"),a("span",{class:"token punctuation"},":"),e(" "),a("span",{class:"token keyword"},"begin"),e("\n aNodes "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"8'b11111011"),a("span",{class:"token punctuation"},";"),e("\n cNodes "),a("span",{class:"token operator"},"="),e(" seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"23"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"16"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token number"},"3'b011"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token keyword"},"begin"),e("\n aNodes "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"8'b11110111"),a("span",{class:"token punctuation"},";"),e("\n cNodes "),a("span",{class:"token operator"},"="),e(" seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"31"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"24"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token number"},"3'b100"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token keyword"},"begin"),e("\n aNodes "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"8'b11101111"),a("span",{class:"token punctuation"},";"),e("\n cNodes "),a("span",{class:"token operator"},"="),e(" seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"39"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"32"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token number"},"3'b101"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token keyword"},"begin"),e("\n aNodes "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"8'b11011111"),a("span",{class:"token punctuation"},";"),e("\n cNodes "),a("span",{class:"token operator"},"="),e(" seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"47"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"40"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token number"},"3'b110"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token keyword"},"begin"),e("\n aNodes "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"8'b10111111"),a("span",{class:"token punctuation"},";"),e("\n cNodes "),a("span",{class:"token operator"},"="),e(" seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"55"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"48"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token number"},"3'b111"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token keyword"},"begin"),e("\n aNodes "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"8'b01111111"),a("span",{class:"token punctuation"},";"),e("\n cNodes "),a("span",{class:"token operator"},"="),e(" seg_data"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"63"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"56"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"default"),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token keyword"},"begin"),e("\n aNodes "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"8'b11111110"),a("span",{class:"token punctuation"},";"),e("\n cNodes "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"8'b11111111"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"endcase"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br"),a("span",{class:"line-number"},"58"),a("br"),a("span",{class:"line-number"},"59"),a("br"),a("span",{class:"line-number"},"60"),a("br"),a("span",{class:"line-number"},"61"),a("br"),a("span",{class:"line-number"},"62"),a("br"),a("span",{class:"line-number"},"63"),a("br"),a("span",{class:"line-number"},"64"),a("br"),a("span",{class:"line-number"},"65"),a("br"),a("span",{class:"line-number"},"66"),a("br"),a("span",{class:"line-number"},"67"),a("br"),a("span",{class:"line-number"},"68"),a("br"),a("span",{class:"line-number"},"69"),a("br"),a("span",{class:"line-number"},"70"),a("br"),a("span",{class:"line-number"},"71"),a("br"),a("span",{class:"line-number"},"72"),a("br"),a("span",{class:"line-number"},"73"),a("br"),a("span",{class:"line-number"},"74"),a("br"),a("span",{class:"line-number"},"75"),a("br"),a("span",{class:"line-number"},"76"),a("br"),a("span",{class:"line-number"},"77"),a("br"),a("span",{class:"line-number"},"78"),a("br"),a("span",{class:"line-number"},"79"),a("br"),a("span",{class:"line-number"},"80"),a("br"),a("span",{class:"line-number"},"81"),a("br"),a("span",{class:"line-number"},"82"),a("br")])],-1),Ie=a("h3",{id:"alu-unit"},[a("a",{class:"header-anchor",href:"#alu-unit","aria-hidden":"true"},"#"),e(" ALU Unit")],-1),Be=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/**\n * @module counter\n * @author sabertazimi\n * @email sabertazimi@gmail.com\n * @brief up counter\n * @param DATA_WIDTH data width\n * @param STEP counting step\n * @input clk clock signal\n * @input rst reset signal\n * @output en enable signal\n * @output count counting value\n */"),e("\n"),a("span",{class:"token keyword"},"module"),e(" counter\n#"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"parameter"),e(" DATA_WIDTH "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),e(" STEP "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token keyword"},"input"),e(" clk"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(" rst"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(" en"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" count\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("rst"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n count "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"0"),e(),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("en"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n count "),a("span",{class:"token operator"},"<="),e(" count "),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token keyword"},"begin"),e("\n count "),a("span",{class:"token operator"},"<="),e(" count"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e(),a("span",{class:"token comment"},"// counter"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br")])],-1),We=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/**\n * @module latch_counter\n * @author sabertazimi\n * @email sabertazimi@gmail.com\n * @brief latch counter (latching when reaching max value)\n * @input clk clock signal\n * @input rst reset signal\n * @output en enable signal\n * @output count counting value\n */"),e("\n"),a("span",{class:"token keyword"},"module"),e(" latch_counter\n"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token keyword"},"input"),e(" clk"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(" rst"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(" en"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token keyword"},"reg"),e(" count\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"initial"),e(),a("span",{class:"token keyword"},"begin"),e("\n count "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n "),a("span",{class:"token important"},"always @"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("rst"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n count "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"0"),e(),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("en"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("count "),a("span",{class:"token operator"},"!="),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n count "),a("span",{class:"token operator"},"<="),e(" count "),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token keyword"},"begin"),e("\n count "),a("span",{class:"token operator"},"<="),e(" count"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"end"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token keyword"},"begin"),e("\n count "),a("span",{class:"token operator"},"<="),e(" count"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e(),a("span",{class:"token comment"},"// latch_counter"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br")])],-1),Ce=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/**\n * @module alu_flags\n * @author sabertazimi\n * @email sabertazimi@gmail.com\n * @brief get flags after alu calculation\n * @param DATA_WIDTH data width\n * @input srcA A port data\n * @input srcB B port data\n * @input aluOP operation code\n * @output zero equal flag\n * @output of signed overflow flag\n * @output uof unsigned overflow flag\n */"),e("\n"),a("span",{class:"token keyword"},"module"),e(" alu_flags\n#"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"parameter"),e(" DATA_WIDTH "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"32"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" srcA"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" srcB"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" aluOP"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(" zero"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(" of"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(" uof\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"wire"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" sum"),a("span",{class:"token punctuation"},","),e(" diff"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"wire"),e(" carry1"),a("span",{class:"token punctuation"},","),e(" carry2"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"assign"),e(),a("span",{class:"token operator"},"{"),e("carry1"),a("span",{class:"token punctuation"},","),e(" sum"),a("span",{class:"token operator"},"}"),e(),a("span",{class:"token operator"},"="),e(" srcA "),a("span",{class:"token operator"},"+"),e(" srcB"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// awesome tip"),e("\n "),a("span",{class:"token keyword"},"assign"),e(),a("span",{class:"token operator"},"{"),e("carry2"),a("span",{class:"token punctuation"},","),e(" diff"),a("span",{class:"token operator"},"}"),e(),a("span",{class:"token operator"},"="),e(" srcA "),a("span",{class:"token operator"},"-"),e(" srcB"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// awesome tip"),e("\n\n "),a("span",{class:"token keyword"},"assign"),e(" zero "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),e("srcA "),a("span",{class:"token operator"},"=="),e(" srcB"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"assign"),e(" of "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),e("aluOP "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token number"},"4'd5"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"?"),e(),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"("),e("srcA"),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"&"),e(" srcB"),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"&"),e(),a("span",{class:"token operator"},"~"),e("sum"),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"~"),e("srcA"),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"&"),e(),a("span",{class:"token operator"},"~"),e("srcB"),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"&"),e(" sum"),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token punctuation"},"("),e("aluOP "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token number"},"4'd6"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"?"),e(),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"("),e("srcA"),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"&"),e(),a("span",{class:"token operator"},"~"),e("srcB"),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"&"),e(),a("span",{class:"token operator"},"~"),e("diff"),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token operator"},"|"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"~"),e("srcA"),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"&"),e(" srcB"),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"&"),e(" diff"),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"assign"),e(" uof "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),e("aluOP "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token number"},"4'd5"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"?"),e(),a("span",{class:"token punctuation"},"("),e("carry1"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token punctuation"},"("),e("aluOP "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token number"},"4'd6"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"?"),e(),a("span",{class:"token punctuation"},"("),e("carry2"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e(),a("span",{class:"token comment"},"// alu_flags"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br")])],-1),He=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/**\n * @module alu\n * @author sabertazimi\n * @email sabertazimi@gmail.com\n * @param DATA_WIDTH data width\n * @input srcA A port data\n * @input srcB B port data\n * @input aluOP operation code\n * @output aluOut calculation result\n * @output zero equal flag\n * @output of signed overflow flag\n * @output uof unsigned overflow flag\n */"),e("\n"),a("span",{class:"token keyword"},"module"),e(" alu\n#"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"parameter"),e(" DATA_WIDTH "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"32"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" srcA"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" srcB"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" aluOP"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" aluOut"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(" zero"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(" of"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(" uof\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"wire"),e(),a("span",{class:"token keyword"},"signed"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" signed_srcA"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"wire"),e(),a("span",{class:"token keyword"},"signed"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" signed_srcB"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"assign"),e(" signed_srcA "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token property"},"$signed"),a("span",{class:"token punctuation"},"("),e("srcA"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"assign"),e(" signed_srcB "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token property"},"$signed"),a("span",{class:"token punctuation"},"("),e("srcB"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token important"},"always @"),e(),a("span",{class:"token punctuation"},"("),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"case"),e(),a("span",{class:"token punctuation"},"("),e("aluOP"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token number"},"4'd0"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(" srcA "),a("span",{class:"token operator"},"<<"),e(" srcB"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"4'd1"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(" signed_srcA "),a("span",{class:"token operator"},">>>"),e(" srcB"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"4'd2"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(" srcA "),a("span",{class:"token operator"},">>"),e(" srcB"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"4'd3"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(" srcA "),a("span",{class:"token operator"},"*"),e(" srcB"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"4'd4"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(" srcA "),a("span",{class:"token operator"},"/"),e(" srcB"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"4'd5"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(" srcA "),a("span",{class:"token operator"},"+"),e(" srcB"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// awesome tip"),e("\n "),a("span",{class:"token number"},"4'd6"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(" srcA "),a("span",{class:"token operator"},"-"),e(" srcB"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"4'd7"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(" srcA "),a("span",{class:"token operator"},"&"),e(" srcB"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"4'd8"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(" srcA "),a("span",{class:"token operator"},"|"),e(" srcB"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"4'd9"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(" srcA "),a("span",{class:"token operator"},"^"),e(" srcB"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"4'd10"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token operator"},"~"),a("span",{class:"token punctuation"},"("),e("srcA "),a("span",{class:"token operator"},"|"),e(" srcB"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"4'd11"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token punctuation"},"("),e("signed_srcA "),a("span",{class:"token operator"},"<"),e(" signed_srcB"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"?"),e(),a("span",{class:"token number"},"1"),e(),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token number"},"4'd12"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token punctuation"},"("),e("srcA "),a("span",{class:"token operator"},"<"),e(" srcB"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"?"),e(),a("span",{class:"token number"},"1"),e(),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"default"),a("span",{class:"token punctuation"},":"),e(" aluOut "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"endcase"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n alu_flags #"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"DATA_WIDTH"),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},")"),e(" FLAGS "),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"srcA"),a("span",{class:"token punctuation"},"("),e("srcA"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"srcB"),a("span",{class:"token punctuation"},"("),e("srcB"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"aluOP"),a("span",{class:"token punctuation"},"("),e("aluOP"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"zero"),a("span",{class:"token punctuation"},"("),e("zero"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"of"),a("span",{class:"token punctuation"},"("),e("of"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"uof"),a("span",{class:"token punctuation"},"("),e("uof"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e(),a("span",{class:"token comment"},"// alu"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br"),a("span",{class:"line-number"},"58"),a("br"),a("span",{class:"line-number"},"59"),a("br"),a("span",{class:"line-number"},"60"),a("br"),a("span",{class:"line-number"},"61"),a("br"),a("span",{class:"line-number"},"62"),a("br")])],-1),Ne=a("h3",{id:"memory-unit"},[a("a",{class:"header-anchor",href:"#memory-unit","aria-hidden":"true"},"#"),e(" Memory Unit")],-1),Oe=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/**\n * @module register\n * @author sabertazimi\n * @email sabertazimi@gmail.com\n * @brief D flip flop\n * @param DATA_WIDTH data width\n * @input clk clock signal\n * @input rst reset signal\n * @input en enable signal\n * @input din data in\n * @output dout data out\n */"),e("\n"),a("span",{class:"token keyword"},"module"),e(" register\n#"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"parameter"),e(" DATA_WIDTH "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"32"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token keyword"},"input"),e(" clk"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(" rst"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(" en"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" din"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" dout\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token important"},"always @"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("rst"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n dout "),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// reset"),e("\n "),a("span",{class:"token keyword"},"end"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("en"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n dout "),a("span",{class:"token operator"},"<="),e(" din"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// update"),e("\n "),a("span",{class:"token keyword"},"end"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token keyword"},"begin"),e("\n dout "),a("span",{class:"token operator"},"<="),e(" dout"),a("span",{class:"token punctuation"},";"),e(" "),a("span",{class:"token comment"},"// hold"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e(),a("span",{class:"token comment"},"// register"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br")])],-1),ze=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/**\n * @module regFile\n * @author sabertazimi\n * @email sabertazimi@gmail.com\n * @brief register files for MIPS CPU, contains 32 D flip-flop registers\n * @param DATA_WIDTH data width\n * @input clk clock signal\n * @input we write enable signal\n * @input raddrA read address (No.register) for A out port\n * @input raddrB read address (No.register) for B out port\n * @input waddr write address (No.register) for wdata (in port)\n * @input wdata data to write into regFile\n * @output regA A port output\n * @output regB B port output\n */"),e("\n"),a("span",{class:"token keyword"},"module"),e(" regFile\n#"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"parameter"),e(" DATA_WIDTH "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"32"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token keyword"},"input"),e(" clk"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(" rst"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(" we"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" raddrA"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" raddrB"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" waddr"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" wdata"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" regA"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" regB"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" v0_data"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" a0_data\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token constant"},"`include"),e(),a("span",{class:"token string"},'"defines.vh"'),e("\n\n "),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" i"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token comment"},"///< three ported regFile contains 32 registers"),e("\n "),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" regFile "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"31"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token important"},"always @"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("rst"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"for"),e(),a("span",{class:"token punctuation"},"("),e("i "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(" i "),a("span",{class:"token operator"},"<"),e(),a("span",{class:"token number"},"31"),a("span",{class:"token punctuation"},";"),e(" i "),a("span",{class:"token operator"},"="),e(" i "),a("span",{class:"token operator"},"+"),e(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token keyword"},"begin"),e("\n regFile"),a("span",{class:"token punctuation"},"["),e("i"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"<="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"end"),e(),a("span",{class:"token keyword"},"else"),e(),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("we "),a("span",{class:"token operator"},"&&"),e(" waddr "),a("span",{class:"token operator"},"!="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n regFile"),a("span",{class:"token punctuation"},"["),e("waddr"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"<="),e(" wdata"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n "),a("span",{class:"token keyword"},"assign"),e(" regA "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),e("we "),a("span",{class:"token operator"},"&&"),e(" waddr "),a("span",{class:"token operator"},"=="),e(" raddrA"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"?"),e(" wdata\n "),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token punctuation"},"("),e("raddrA "),a("span",{class:"token operator"},"!="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"?"),e(" regFile"),a("span",{class:"token punctuation"},"["),e("raddrA"),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"assign"),e(" regB "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"("),e("we "),a("span",{class:"token operator"},"&&"),e(" waddr "),a("span",{class:"token operator"},"=="),e(" raddrB"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"?"),e(" wdata\n "),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token punctuation"},"("),e("raddrB "),a("span",{class:"token operator"},"!="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"?"),e(" regFile"),a("span",{class:"token punctuation"},"["),e("raddrB"),a("span",{class:"token punctuation"},"]"),e("\n "),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"assign"),e(" v0_data "),a("span",{class:"token operator"},"="),e(" regFile"),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"`V0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"assign"),e(" a0_data "),a("span",{class:"token operator"},"="),e(" regFile"),a("span",{class:"token punctuation"},"["),a("span",{class:"token constant"},"`A0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e(),a("span",{class:"token comment"},"// regFile"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br"),a("span",{class:"line-number"},"58"),a("br"),a("span",{class:"line-number"},"59"),a("br")])],-1),Se=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/**\n * @module imem\n * @author sabertazimi\n * @email sabertazimi@gmail.com\n * @brief instruction cache memory (ROM)\n * @param DATA_WIDTH data width\n * @param BUS_WIDTH bus width\n * @param CODE_FILE MIPS assembly hexadecimal code file\n * @input addr memory address\n * @output rdata instruction read out from memory\n */"),e("\n"),a("span",{class:"token keyword"},"module"),e(" imem\n#"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"parameter"),e(" DATA_WIDTH "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"32"),a("span",{class:"token punctuation"},","),e(" BUS_WIDTH "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},","),e(" CODE_FILE"),a("span",{class:"token operator"},"="),e(),a("span",{class:"token string"},'"mips/benchmark.hex"'),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),e("BUS_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" addr"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" rdata\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" ROM "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},":"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token operator"},"**"),e("BUS_WIDTH"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"initial"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token property"},"$readmemh"),a("span",{class:"token punctuation"},"("),e("CODE_FILE"),a("span",{class:"token punctuation"},","),e(" ROM"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token operator"},"**"),e("BUS_WIDTH"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n "),a("span",{class:"token keyword"},"assign"),e(" rdata "),a("span",{class:"token operator"},"="),e(" ROM"),a("span",{class:"token punctuation"},"["),e("addr"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e(),a("span",{class:"token comment"},"// imem"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br")])],-1),Pe=a("div",{class:"language-verilog line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/**\n * @module dmem\n * @author sabertazimi\n * @email sabertazimi@gmail.com\n * @brief data cache memory (RAM)\n * @param DATA_WIDTH data width\n * @param BUS_WIDTH bus width\n * @input clk clock signal\n * @input re read enable signal\n * @input we write enable signal\n * @input addr memory address\n * @input wdata data write into memory\n * @output rdata data read out from memory\n */"),e("\n"),a("span",{class:"token keyword"},"module"),e(" dmem\n#"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"parameter"),e(" DATA_WIDTH "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"32"),a("span",{class:"token punctuation"},","),e(" BUS_WIDTH "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"("),e("\n "),a("span",{class:"token keyword"},"input"),e(" clk"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(" re"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(" we"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),e("BUS_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" addr"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" wdata"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"input"),e(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" switch_addr"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" rdata"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"output"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" led_data\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token keyword"},"reg"),e(),a("span",{class:"token punctuation"},"["),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},":"),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),e(" RAM "),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},":"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token operator"},"**"),e("BUS_WIDTH"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n\n "),a("span",{class:"token important"},"always @"),e(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"posedge"),e(" clk"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n "),a("span",{class:"token keyword"},"if"),e(),a("span",{class:"token punctuation"},"("),e("we"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token keyword"},"begin"),e("\n RAM"),a("span",{class:"token punctuation"},"["),e("addr"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"<="),e(" wdata"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n "),a("span",{class:"token keyword"},"end"),e("\n\n "),a("span",{class:"token keyword"},"assign"),e(" rdata "),a("span",{class:"token operator"},"="),e(" re "),a("span",{class:"token operator"},"?"),e(" RAM"),a("span",{class:"token punctuation"},"["),e("addr"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token punctuation"},":"),e(),a("span",{class:"token operator"},"{"),a("span",{class:"token punctuation"},"("),e("DATA_WIDTH"),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},"{"),a("span",{class:"token number"},"1'bx"),a("span",{class:"token operator"},"}}"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"assign"),e(" led_data "),a("span",{class:"token operator"},"="),e(" RAM"),a("span",{class:"token punctuation"},"["),e("switch_addr"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n\n"),a("span",{class:"token keyword"},"endmodule"),e(),a("span",{class:"token comment"},"// dmem"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br")])],-1);o.render=function(a,e,t,o,Ue,Me){return n(),s("div",null,[l,c,p,u,r,i,k,b,m,d,g,w,y,h,f,v,_,A,D,T,x,I,B,W,C,H,N,O,z,S,P,U,M,E,L,R,F,$,q,V,G,X,K,j,Z,Y,Q,J,nn,sn,an,en,tn,on,ln,cn,pn,un,rn,kn,bn,mn,dn,gn,wn,yn,hn,fn,vn,_n,An,Dn,Tn,xn,In,Bn,Wn,Cn,Hn,Nn,On,zn,Sn,Pn,Un,Mn,En,Ln,Rn,Fn,$n,qn,Vn,Gn,Xn,Kn,jn,Zn,Yn,Qn,Jn,ns,ss,as,es,ts,os,ls,cs,ps,us,rs,is,ks,bs,ms,ds,gs,ws,ys,hs,fs,vs,_s,As,Ds,Ts,xs,Is,Bs,Ws,Cs,Hs,Ns,Os,zs,Ss,Ps,Us,Ms,Es,Ls,Rs,Fs,$s,qs,Vs,Gs,Xs,Ks,js,Zs,Ys,Qs,Js,na,sa,aa,ea,ta,oa,la,ca,pa,ua,ra,ia,ka,ba,ma,da,ga,wa,ya,ha,fa,va,_a,Aa,Da,Ta,xa,Ia,Ba,Wa,Ca,Ha,Na,Oa,za,Sa,Pa,Ua,Ma,Ea,La,Ra,Fa,$a,qa,Va,Ga,Xa,Ka,ja,Za,Ya,Qa,Ja,ne,se,ae,ee,te,oe,le,ce,pe,ue,re,ie,ke,be,me,de,ge,we,ye,he,fe,ve,_e,Ae,De,Te,xe,Ie,Be,We,Ce,He,Ne,Oe,ze,Se,Pe])};export default o;export{t as __pageData}; diff --git a/assets/programming_android_androidBasicNotes.md.4d20a147.js b/assets/programming_android_androidBasicNotes.md.4d20a147.js new file mode 100644 index 00000000000..17a8a2b9cc5 --- /dev/null +++ b/assets/programming_android_androidBasicNotes.md.4d20a147.js @@ -0,0 +1 @@ +import{o as n,c as s,a}from"./app.6dd2a1b7.js";const p='{"title":"Android Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Android Framework","slug":"android-framework"},{"level":3,"title":"Dalvik virtual machine","slug":"dalvik-virtual-machine"},{"level":3,"title":"Basic Building Blocks","slug":"basic-building-blocks"},{"level":2,"title":"Android Studio","slug":"android-studio"},{"level":3,"title":"Plugins","slug":"plugins"},{"level":2,"title":"API Conventions","slug":"api-conventions"},{"level":3,"title":"Manager Service","slug":"manager-service"},{"level":2,"title":"Activity","slug":"activity"},{"level":3,"title":"Base Activity","slug":"base-activity"},{"level":3,"title":"Activity Collector","slug":"activity-collector"},{"level":3,"title":"Start Activity","slug":"start-activity"},{"level":2,"title":"UI Design","slug":"ui-design"},{"level":3,"title":"Layout","slug":"layout"},{"level":3,"title":"Component","slug":"component"},{"level":3,"title":"Drawable","slug":"drawable"},{"level":2,"title":"Fragment","slug":"fragment"},{"level":3,"title":"Basic Fragment","slug":"basic-fragment"},{"level":3,"title":"Transfer Information","slug":"transfer-information"},{"level":3,"title":"Runtime Loop","slug":"runtime-loop"},{"level":2,"title":"Broadcast","slug":"broadcast"},{"level":3,"title":"Register Receiver","slug":"register-receiver"},{"level":3,"title":"Custom Broadcast","slug":"custom-broadcast"},{"level":3,"title":"Local Broadcast","slug":"local-broadcast"},{"level":2,"title":"Data Store","slug":"data-store"},{"level":3,"title":"Files Store","slug":"files-store"},{"level":3,"title":"Shared Preferences","slug":"shared-preferences"},{"level":3,"title":"DataBase","slug":"database"},{"level":2,"title":"Content Provider","slug":"content-provider"},{"level":3,"title":"Read Other App Content","slug":"read-other-app-content"},{"level":3,"title":"Provide App Content","slug":"provide-app-content"},{"level":2,"title":"Service","slug":"service"},{"level":3,"title":"Handler","slug":"handler"},{"level":3,"title":"Async Task","slug":"async-task"},{"level":3,"title":"Basic Service","slug":"basic-service"},{"level":3,"title":"ForeGround Service","slug":"foreground-service"},{"level":3,"title":"Intent Service","slug":"intent-service"},{"level":3,"title":"Alarm Service","slug":"alarm-service"},{"level":2,"title":"Media","slug":"media"},{"level":3,"title":"Notification","slug":"notification"},{"level":3,"title":"SMS","slug":"sms"},{"level":3,"title":"Audio","slug":"audio"},{"level":3,"title":"Music","slug":"music"},{"level":2,"title":"NetWork","slug":"network"},{"level":3,"title":"WebView","slug":"webview"},{"level":3,"title":"HTTP URL Connection","slug":"http-url-connection"},{"level":3,"title":"HTTP Client","slug":"http-client"},{"level":3,"title":"XML","slug":"xml"},{"level":3,"title":"JSON","slug":"json"},{"level":3,"title":"Network Best Practice","slug":"network-best-practice"},{"level":2,"title":"Map","slug":"map"},{"level":3,"title":"Location","slug":"location"},{"level":2,"title":"Sensor","slug":"sensor"},{"level":3,"title":"Light Sensor","slug":"light-sensor"},{"level":3,"title":"Accelerometer Sensor","slug":"accelerometer-sensor"},{"level":3,"title":"Orientation Sensor","slug":"orientation-sensor"},{"level":2,"title":"Best Practice","slug":"best-practice"},{"level":3,"title":"Global Context","slug":"global-context"},{"level":3,"title":"用 Intent 传递对象","slug":"用-intent-传递对象"},{"level":3,"title":"Custom Logger","slug":"custom-logger"}],"relativePath":"programming/android/androidBasicNotes.md","lastUpdated":1627196177000}',t={},e=a('

    Android Basic Notes

    Android Framework

    Dalvik virtual machine

    1. register-based machine 基于寄存器(不写入内存)
    2. minimizing instruction dispatch and memory accesses 最小化指令分配黑内存访问
    3. giving more efficient instruction stream(a lot more semantic content) 提供更加高效的指令流

    Basic Building Blocks

    1. Activity(Managed by activity stack)
    2. Service(Running in the background;with no UI)
    3. Broadcast Receiver(Can invoke(调用) activity;with no UI)
    4. Content Provider(accessing and managing application data)

    Android Studio

    Plugins

    Code generator

    • Constructor
    • getter/setter
    • ViewHolder
    • Parcelable Implementation
    • GsonFormat : 根据 JSONObject 生成相应类

    API Conventions

    Manager Service

    • PreferenceManager.getDefaultSharedPreferences
    • LocalBroadcastManager.getInstance

    Activity

    Base Activity

    查看当前界面属于哪个 Activity,自定义 Activity 继承 BaseActivity

    public class BaseActivity extends Activity {\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        Log.d("BaseActivity", getClass().getSimpleName());\n    }\n}\n
    1
    2
    3
    4
    5
    6
    7

    Activity Collector

    在所有 Activity 的 onCreate 方法调用静态的 addActivity 方法,onDestroy 方法调用静态的 removeActivity 方法。

    • ActivityCollector.addActivity(this);
    • ActivityCollector.removeActivity(this);
    public class ActivityCollector {\n\n    public static List<Activity> activities = new ArrayList<Activity>();\n\n    public static void addActivity(Activity activity) {\n        activities.add(activity);\n\n    }\n\n    public static void removeActivity(Activity activity) {\n        activities.remove(activity);\n\n    }\n\n    public static void finishAll() {\n        for (Activity activity : activities) {\n            if (!activity.isFinishing()) {\n                activity.finish();\n            }\n        }\n    }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22

    Start Activity

    为每个 Activity 添加静态的 actionStart 方法,供其他 Activity 启用此 Activity

    public static void actionStart(Context context, String data1, String data2) {\n    Intent intent = new Intent(context, thisActivity.class);\n    intent.putExtra("param1", data1);\n    intent.putExtra("param2", data2);\n    context.startActivity(intent);\n}\n
    1
    2
    3
    4
    5
    6

    UI Design

    N activities can respond to a particular intent:

    Android will pop(弹出) up a little dialogue list(对话框) to user showing application icon defining the intent

    当有多个活动可相应某个特定意图时,系统将会弹出对话框提示用户选择一个应用的活动或者设定默认值(default)

    e.g web browsers

    <intent-filter>\n  <action android:name="android.intent.action.MAIN" />\n  <category android:name="android.intent.category.LAUNCHER" />\n</intent-filter>\n
    1
    2
    3
    4

    Layout

    Basic

    • android:layout_weight 自适配布局
    • android:SingleLine 单行显示模式
    • android:ellipsize="end" 文字过多时缩略方式

    Table Layout

    • <TableLayout android:stretchColumns="1"> 拉伸第 2 列
    • android:layout_span="2" 占 2 列

    Custom Layout

    LayoutInflater 作用是将 layout 的 xml 布局文件实例化为 View 类对象。

    View view = LayoutInflater.from(context).inflate(R.layout.title, this/null);\n
    1

    Component

    View(ViewGroup): e.g button、textbox(文本框)、checkbox(复选框)

    Custom Component

    custom XML

    title.xml

    <LinearLayout\n  xmlns:android="http://schemas.android.com/apk/res/android"\n  android:layout_width="match_parent"\n  android:layout_height="wrap_content"\n  android:background="@drawable/title_bg"\n>\n  <button\n    android:id="@+id/title_back"\n    android:layout_width="wrap_content"\n    android:layout_height="wrap_content"\n    android:layout_gravity="center"\n    android:layout_margin="5dip"\n    android:background="@drawable/back_bg"\n    android:text="Back"\n    android:textColor="#fff"\n  />\n  <TextView\n    android:id="@+id/title_text"\n    android:layout_width="0dip"\n    android:layout_height="wrap_content"\n    android:layout_gravity="center"\n    android:layout_weight="1"\n    android:gravity="center"\n    android:text="Title Text"\n    android:textColor="#fff"\n    android:textSize="24sp"\n  />\n  <button\n    android:id="@+id/title_edit"\n    android:layout_width="wrap_content"\n    android:layout_height="wrap_content"\n    android:layout_gravity="center"\n    android:layout_margin="5dip"\n    android:background="@drawable/edit_bg"\n    android:text="Edit"\n    android:textColor="#fff"\n  />\n</LinearLayout>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38

    custom class

    public class TitleLayout extends LinearLayout {\n    public TitleLayout(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        LayoutInflater.from(context).inflate(R.layout.title, this);\n\n        //Register button click Listener\n        titleBack.setOnClickListener(new OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                ((Activity) getContext()).finish();\n            }\n        });\n        titleEdit.setOnClickListener(new OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Toast.makeText(getContext(), "You clicked Edit button", Toast.LENGTH_SHORT).show();\n            }\n        });\n\n        //other awesome things\n        //like material design ripple effect\n        //animations and music\n    }\n\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25

    AlertDialog

    //builder pattern\nAlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context);\n\ndialogBuilder.setTitle("Warning");\ndialogBuilder.setMessage("You are forced to be offline. Please try to login again.");\ndialogBuilder.setCancelable(false);\ndialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {\n    @Override\n    public void onClick(DialogInterface dialog, int which) {\n        ActivityCollector.finishAll(); // 销毁所有活动\n        Intent intent = new Intent(context, LoginActivity.class);\n        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n        context.startActivity(intent); // 重新启动LoginActivity\n    }\n});\n\nAlertDialog alertDialog = dialogBuilder.create();\n\n// 需要设置AlertDialog的类型,保证在广播接收器中可以正常弹出\nalertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);\n\nalertDialog.show();\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22

    List View

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(\n    MainActivity.this, android.R.layout.simple_list_item_1, data\n);\nlistView.setAdapter(adapter);\n
    1
    2
    3
    4
    Custom List View Layout
    • Custom class
    • Custom Sub Xml(单项)
    • Custom ArrayAdapter
      • 重写构造函数
      • 重写 getView 方法
        • 重用 convertView 提升性能
        • ViewHolder 提升性能
    \n//内部类,其中字段与自定义class的字段一致\nclass ViewHolder {\n    ImageView fruitImage;\n    TextView fruitName;\n}\npublic FruitAdapter(\n  Context context,\n  int textViewResourceId,\n  List<Fruit> objects) {\n    super(context, textViewResourceId, objects);\n    resourceId = textViewResourceId;\n}\n\n@Override\npublic View getView(int position, View convertView, ViewGroup parent) {\n\n    Fruit fruit = getItem(position); // 获取当前项的Fruit实例\n    View view;\n    ViewHolder viewHolder;\n\n    //大幅提升性能\n    if (convertView == null) {\n        view = LayoutInflater.from(getContext()).inflate(resourceId, null);\n\n        viewHolder = new ViewHolder();\n        viewHolder.fruitImage = (ImageView) view.findViewById(R.id.fruit_image);\n        viewHolder.fruitName = (TextView) view.findViewById(R.id.fruit_name);\n        view.setTag(viewHolder); // 将ViewHolder存储在View中\n\n    } else {\n        view = convertView;\n        viewHolder = (ViewHolder) view.getTag(); // 重新获取ViewHolder\n    }\n\n    ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);\n    TextView fruitName = (TextView) view.findViewById(R.id.fruit_name);\n    fruitImage.setImageResource(fruit.getImageId());\n    fruitName.setText(fruit.getName());\n    return view;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Custom List View Listener
    listView.setOnItemClickListener(new OnItemClickListener() {\n    @Override\n    public void onItemClick(\n      AdapterView<?> parent,\n      View view,\n      int position,\n      long id) {\n        Fruit fruit = fruitList.get(position);\n        Toast.makeText(MainActivity.this, fruit.getName(), Toast.LENGTH_SHORT).show();\n    }\n});\n\nadapter.notifyDataSetChanged();           // 当有新消息时,刷新ListView中的显示\nmsgListView.setSelection(msgList.size()); // 将ListView定位到最后一行\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    Drawable

    修改特定组件的背景颜色

    Resources myColor = getBaseContext().getResources();\n// getBaseContext()获得基础Context\n// getResources()获得资源\nDrawable color_M = myColor.getDrawable(R.color. lightGreen);\n// 由资源 myColor来获得Drawable\n// R.color.lightGreen是颜色值的ID引用\ntext.setBackgroundDrawable(color_M);\n//设置背景\n
    1
    2
    3
    4
    5
    6
    7
    8

    Fragment

    android.app.Fragment

    Basic Fragment

    Activity XML

    <fragment android:id="@+id/right_fragment" <!-- custom fragment class -->\n  android:name="com.example.fragmentTest.RightFragment"\n  android:layout_width="0dp" android:layout_height="match_parent"\n  android:layout_weight="1" /></fragment\n>\n
    1
    2
    3
    4
    5

    Create View in Fragment

    @Override\npublic View onCreateView(\n  LayoutInflater inflater,\n  ViewGroup container,\n  Bundle savedInstanceState) {\n    View view = inflater.inflate(R.layout.left_fragment, container, false);\n    return view;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8

    Add Fragment in Activity

    AnotherRightFragment fragment = new AnotherRightFragment();\nFragmentTransaction transaction = getFragmentManager.beginTransaction();\n\n//容器的 id 和待添加的碎片实例\ntransaction.replace(R.id.right_layout, fragment);\n//模拟返回栈\ntransaction.addToBackStack(null);\ntransaction.commit();\n
    1
    2
    3
    4
    5
    6
    7
    8

    Transfer Information

    In Activity

    getFragmentManager().findFragmentById(R.id.right_fragment);

    In Fragment

    MainActivity activity = (MainActivity) getActivity();

    Runtime Loop

    Basic Override Function

    • onAttach() 当碎片和活动建立关联的时候调用。
    • onCreateView() 为碎片创建视图(加载布局)时调用。
    • onActivityCreated() 确保与碎片相关联的活动一定已经创建完毕的时候调用。
    • onDestroyView() 当与碎片关联的视图被移除的时候调用。
    • onDetach() 当碎片和活动解除关联的时候调用。

    Broadcast

    • Normal Broadcasts : async
    • Ordered Broadcasts : sync

    Register Receiver

    In Activity

    //Custom BroadcastReceiver,Override onReceive methods\n//intentFilter : action\n//前为响应后的行为,后为响应何种广播\nregisterReceiver(networkChangeReceiver, intentFilter);\n\n//in onDestroy\nunregisterReceiver();\n
    1
    2
    3
    4
    5
    6
    7

    In AndroidManifest,xml

    <!-- custom receiver class -->\n<receiver android:name=".MyBroadcastReceiver">\n  <!-- receiver priority -->\n  <intent-filter android:priority="100">\n    <!-- custom broadcast -->\n    <action android:name="com.example.broadcastTest. MY_BROADCAST" />\n  </intent-filter>\n</receiver>\n
    1
    2
    3
    4
    5
    6
    7
    8

    Custom Broadcast

    Normal Broadcast

    intent intent = new Intent("com.example.broadcastTest.MY_BROADCAST");\nsendBroadcast(intent);\n
    1
    2

    Ordered Broadcast

    intent intent = new Intent("com.example.broadcastTest.MY_BROADCAST");\nsendOrderedBroadcast(intent, null);\n
    1
    2

    Local Broadcast

    // 获取实例\nlocalBroadcastManager = LocalBroadcastManager.getInstance(this);\n
    1
    2
    localBroadcastManager.sendBroadcast(intent); // 发送本地广播\n
    1

    Local Receiver

    localBroadcastManager.registerReceiver(CustomReceiver, intentFilter);\nlocalBroadcastManager.unregisterReceiver(CustomReceiver);\n
    1
    2

    Data Store

    Files Store

    /data/data/<packageName>/files/

    Write

    String data = "Data to save";\nFileOutputStream out = null;\nBufferedWriter writer = null;\ntry {\n    out = openFileOutput("data", Context.MODE_PRIVATE);\n    writer = new BufferedWriter(new OutputStreamWriter(out));\n    writer.write(data);\n} catch (IOException e) {\n    e.printStackTrace();\n} finally {\n    try {\n        if (writer != null) {\n            writer.close();\n        }\n    } catch (IOException e) {\n        e.printStackTrace();\n    }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    Read

    FileInputStream in = null;\nBufferedReader reader = null;\nStringBuilder content = new StringBuilder();\ntry {\n    in = openFileInput("data");\n    reader = new BufferedReader(new InputStreamReader(in));\n    String line = "";\n    while ((line = reader.readLine()) != null) {\n        content.append(line);\n    }\n} catch (IOException e) {\n    e.printStackTrace();\n} finally {\n    if (reader != null) {\n        try {\n            reader.close();\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n    }\n}\n\nreturn content.toString();\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

    Shared Preferences

    /data/data/<packageName>/shared_preferences/

    Write

    //get Editor\nSharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();\n//store date\neditor.putString("name", "Tom");\neditor.putInt("age", 28);\neditor.putBoolean("married", false);\n//commit\neditor.commit();\n
    1
    2
    3
    4
    5
    6
    7
    8
    editor.clear();\n
    1

    clear pref file content

    Read

    SharedPreferences pref = getSharedPreferences("data", MODE_PRIVATE);\n//second argument - default value if target key don't exists\nString name = pref.getString("name", "");\nint age = pref.getInt("age", 0);\nboolean married = pref.getBoolean("married", false);\n
    1
    2
    3
    4
    5

    DataBase

    /data/data/<package name>/databases/

    SQLite Open Helper

    @Override\nonCreate()\n@Override\npublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {\n    switch (oldVersion) {\n        case 1:\n            db.execSQL(CREATE_CATEGORY);\n        case 2:\n            db.execSQL("alter table Book add column category_id integer");\n        default:\n    }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    Custom 实现创建、升级数据库的逻辑 构建出 SQLiteOpenHelper 的实例后,再调用getReadableDatabase()getWritableDatabase()方法创建数据库

    establish table
    create table Book (\n    id integer primary key autoIncrement,\n    author text,\n    price real,\n    pages integer,\n    name text\n    )\n
    1
    2
    3
    4
    5
    6
    7

    Basic Operator

    • 创建一个新的数据库并返回一个 SQLiteDatabase 对象
    Context.createDatabase(String name,int version ,int mode,CursorFactory factory);\n
    1
    • 删除数据库
    this.deleteDatabase("myDatabase.db");\n
    1
    • 打开数据库
    SQLiteDatabase my_DataBase =\nthis.openOrCreateDatabase("myDateBase.db",MODE_PRIVATE , null);\nmy_DataBase.close();\n
    1
    2
    3
    • 非查询 SQL 指令
    //创建一个名为"test"并带两个参数的表\nmy_DataBase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY,\nsomeNumber INTEGER);");\n//在数据库中插入一个元组\nmy_DataBase.execSQL("INSERT INTO test (_id,someNumber) values(1,8);");\n\nSQLiteDatabase db = dbHelper.getWritableDatabase();\n\n//INSERT\nContentValues values = new ContentValues();\n// 开始组装第一条数据\nvalues.put("name", "The Da Vinci Code");\nvalues.put("author", "Dan Brown");\nvalues.put("pages", 454);\nvalues.put("price", 16.96);\ndb.insert("Book", null, values); // 插入第一条数据\nvalues.clear();\n// 开始组装第二条数据\nvalues.put("name", "The Lost Symbol");\nvalues.put("author", "Dan Brown");\nvalues.put("pages", 510);\nvalues.put("price", 19.95);\ndb.insert("Book", null, values); // 插入第二条数据\n\n//update\ncontentValues values = new ContentValues();\nvalues.put("price", 10.99);\ndb.update("Book", values, "name = ?", new String[] { "The DaVinci Code"  });\n\n//delete\ndb.delete("Book", "pages > ?", new String[] { "500"  });\n\n//删除表\nmy_DataBase.execSQL("DROP TABLE test");\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    • 查询 SQL 指令-游标 Cursors
      • query()
    方法参数对应 SQL 部分描述
    tablefrom tableName指定查询的表名
    columnsselect column1, column2指定查询的列名
    selectionwhere column = value指定 where 的约束条件
    selectionArgs-为 where 中的占位符提供具体的值
    groupBygroup by column指定需要 group by 的列
    havinghaving column = value对 group by 后的结果进一步约束
    orderByorder by column1, column2指定查询结果的排序方式
    SQLiteDatabase db = dbHelper.getWritableDatabase();\n// 查询Book表中所有的数据\nCursor cursor = db.query("Book", null, null, null, null, null, null);\n// 遍历Cursor对象,取出数据\n//cursor.moveToFirst()\n//cursor.moveToNext()\nString name = cursor.getString(cursor.getColumnIndex("name"));\nString author = cursor.getString(cursor.getColumnIndex("author"));\nint pages = cursor.getInt(cursor.getColumnIndex("pages"));\ndouble price = cursor.getDouble(cursor.getColumnIndex("price"));\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //为了创建一个Cursor(游标),必须执行一个查询,要么通过SQL使用rawQuery()方法\n//或是更精心设计的方法,像query()方法\nCursor cur = my_DataBase.rawQuery("SELECT * FORM test", null);\n\nif(cur!=null) {//游标不为空\n    //返回给定名称的列的基于0开始的index,如果该属性列不存在则返回-1\n    //通过它们的index来检索属性值\n    int numColumn=cur.getColumnIndex("someNumber");\n\n    if(cur.moveToFirst()) {\n        //cur.moveToFirst()让游标指向第一行,如果游标指向第一行,则返回true\n        do {\n        int num=cur.getInt(numColumn);//获得当前行该属性的值\n        /*Cursor提供了不同的方法来回索不同的数据类型\n        例如getInt(int index)/getString(int index)等等*/\n        /*做一些事情*/\n        } while (cur.moveToNext());\n        /*游标移动到下一行,如果游标已经通过了结果集中的最后,\n        即没有行可以移动时,则返回false*/\n        //其他可能移动的是 previous() 和first()方法\n    }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22

    Transaction

    • SQLiteDatabase 的beginTransaction()方法
    • 调用setTransactionSuccessful()表示事务已经执行成功
    • finally 代码块中调用endTransaction()来结束事务

    Content Provider

    Read Other App Content

    Uri uri = Uri.parse("content://com.example.app.provider/table1");\ngetContentResolver().query/insert/delete/update();\n
    1
    2
    • ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
    • ContactsContract.CommonDataKinds.Phone.NUMBER

    Provide App Content

    With ContentProvider:

    public class MyProvider extends ContentProvider {\n    @Override\n    public boolean onCreate() {\n        return false;\n    }\n    @Override\n    public Cursor query(Uri uri, String[] projection, String selection,\n      String[] selectionArgs, String sortOrder) {\n        return null;\n    }\n    @Override\n    public Uri insert(Uri uri, ContentValues values) {\n        return null;\n    }\n    @Override\n    public int update(Uri uri, ContentValues values, String selection,\n      String[] selectionArgs) {\n        return 0;\n    }\n    @Override\n    public int delete(Uri uri, String selection, String[] selectionArgs) {\n        return 0;\n    }\n    @Override\n    public String getType(Uri uri) {\n        return null;\n    }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    UriMatcher.addURI(uri, customNumber)/.match(uri)\n
    1
    • 为传入 URI 指定自定义常量作为代号

    Service

    Handler

    //在主线程重写handleMessage,更新UI\nnew Handler() {\n    public void handleMessage(Message msg) {\n        switch (msg.what) {\n            case UPDATE_TEXT:\n            // 在这里可以进行UI操作\n            text.setText("Nice to meet you");\n            break;\n            default:\n            break;\n        }\n    }\n}\n\n//在后台执行子线程\nnew Thread(new Runnable() {\n    @Override\n    public void run() {\n        Message message = new Message();\n        message.what = UPDATE_TEXT;\n        handler.sendMessage(message); // 将Message对象发送出去\n    }\n}).start();\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

    Async Task

    AsyncTask 中的几个方法才能完成对任务的定制。经常需要去重写的方法 有以下四个:

    1. onPreExecute() 这个方法会在后台任务开始执行之前调用,用于进行一些界面上的初始化操作, 比如显示一个进度条对话框等。
    2. doInBackground(Params...) 这个方法中的所有代码都会在子线程中运行,我们应该在这里去处理所有的耗时任务。 任务一旦完成就可以通过 return 语句来将任务的执行结果返回,如果 AsyncTask 的 第三个泛型参数指定的是 Void,就可以不返回任务执行结果。注意,在这个方法中是不 可以进行 UI 操作的,如果需要更新 UI 元素,比如说反馈当前任务的执行进度, 可以调用 publishProgress(Progress...)方法来完成。
    3. onProgressUpdate(Progress...) 当在后台任务中调用了 publishProgress(Progress...)方法后,这个方法就会很快被调用, 方法中携带的参数就是在后台任务中传递过来的。在这个方法中可以对 UI 进行操作, 利用参数中的数值就可以对界面元素进行相应地更新。
    4. onPostExecute(Result) 当后台任务执行完毕并通过 return 语句进行返回时,这个方法就很快会被调用。 返回的数据会作为参数传递到此方法中,可以利用返回的数据来进行一些 UI 操作, 比如说提醒任务执行的结果,以及关闭掉进度条对话框等。
    class DownloadTask extends AsyncTask<Void, Integer, Boolean> {\n    @Override\n    protected void onPreExecute() {\n        progressDialog.show(); // 显示进度对话框\n    }\n    @Override\n    protected Boolean doInBackground(Void... params) {\n        try {\n            while (true) {\n                int downloadPercent = doDownload(); // 这是一个虚构的方法\n                publishProgress(downloadPercent);\n            if (downloadPercent >= 100) {\n                break;\n                }\n            }\n        } catch (Exception e) {\n            return false;\n        }\n    return true;\n}\n    @Override\n    protected void onProgressUpdate(Integer... values) {\n        // 在这里更新下载进度\n        progressDialog.setMessage("Downloaded " + values[0] + "%");\n    }\n    @Override\n    protected void onPostExecute(Boolean result) {\n        progressDialog.dismiss(); // 关闭进度对话框\n        // 在这里提示下载结果\n        if (result) {\n            Toast.makeText(context, "Download succeeded",\n            Toast.LENGTH_SHORT).show();\n        } else {\n            Toast.makeText(context, " Download failed",\n            Toast.LENGTH_SHORT).show();\n        }\n    }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38

    Basic Service

    //in AndroidManifest.xml <service android:name=".MyService"> </service>\n
    1
    stopSelf()\n
    1
    public class MyService extends Service {\n    @Override\n    public IBinder onBind(Intent intent) {\n        return null;\n    }\n    @Override\n        public void onCreate() {\n        super.onCreate();\n    }\n    @Override\n    public int onStartCommand(Intent intent, int flags, int startId) {\n        return super.onStartCommand(intent, flags, startId);\n    }\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n    }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    IBinder

    • In Custom Service class
    private DownloadBinder mBinder = new DownloadBinder();\n\nclass DownloadBinder extends Binder {\n    public void startDownload() {\n        Log.d("MyService", "startDownload executed");\n    }\n    public int getProgress() {\n        Log.d("MyService", "getProgress executed");\n        return 0;\n    }\n}\n\n@Override\npublic IBinder onBind(Intent intent) {\n    return mBinder;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    • In Activity class
    case R.id.bind_service:\n    Intent bindIntent = new Intent(this, MyService.class);\n    bindService(bindIntent, connection, BIND_AUTO_CREATE); // 绑定服务\n    break;\ncase R.id.unbind_service:\n    unbindService(connection); // 解绑服务\n    break;\ndefault:\n    break;\n\n@Override\npublic void onServiceDisconnected(ComponentName name) {\n    }\n@Override\npublic void onServiceConnected(ComponentName name, IBinder service) {\n    downloadBinder = (MyService.DownloadBinder) service;\n    downloadBinder.startDownload();\n    downloadBinder.getProgress();\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    ForeGround Service

    • In service onCreate
    Notification notification = new Notification(R.drawable.ic_launcher,\n  "Notification comes", System. currentTimeMills());\nIntent notificationIntent = new Intent(this, MainActivity.class);\nPendingIntent pendingIntent = PendingIntent.getActivity(this, 0,\n  notificationIntent, 0);\nnotification.setLatestEventInfo(this, "This is title", "This is content", pendingIntent);\nstartForeground(1, notification);\n
    1
    2
    3
    4
    5
    6
    7

    Intent Service

    public class MyIntentService extends IntentService {\n    public MyIntentService() {\n        super("MyIntentService"); // 调用父类的有参构造函数\n    }\n    @Override\n    protected void onHandleIntent(Intent intent) {\n        // 打印当前线程的id\n        Log.d("MyIntentService", "Thread id is " + Thread.currentThread().getId());\n    }\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n        Log.d("MyIntentService", "onDestroy executed");\n    }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    Alarm Service

    结合 BroadcastReceiver 可以实现定时任务

    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);\nlong triggerAtTime = SystemClock.elapsedRealtime() + 10 * 1000;\nmanager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pendingIntent);\n
    1
    2
    3
    • Service 延时发出广播
    • BroadcastReceiver 接受广播后再次启动 Service
    public int onStartCommand(Intent intent, int flags, int startId) {\n    new Thread(new Runnable() {\n        @Override\n        public void run() {\n            Log.d("LongRunningService", "executed at " + new Date().toString());\n        }\n    }).start();\n\n    AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);\n    int anHour = 60 * 60 * 1000; // 这是一小时的毫秒数\n    long triggerAtTime = SystemClock.elapsedRealtime() + anHour;\n\n    //关键:在服务里发送广播\n    Intent i = new Intent(this, AlarmReceiver.class);\n    PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);\n\n    manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);\n\n    return super.onStartCommand(intent, flags, startId);\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    Media

    Notification

    NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);\n\nNotification notification = new Notification(R.drawable.ic_launcher, "This is\n  ticker text", System.currentTimeMills());\n\nIntent intent = new Intent(this, NotificationActivity.class);\nPendingIntent pi = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);\n\nnotification.setLatestEventInfo(this, "This is content title", "This is\n  content text", pi);\n\nmanager.notify(1, notification);\n//在被启动Activity manager.cancel(1);\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    SMS

    Audio

    Music

    NetWork

    Networked Apps

    1. Network latency(网络延迟)——UI thread separated from data loading thread
    2. Battery drain(电池耗尽)
    3. Intermittent service(中断服务)

    WebView

    <uses-permission android:name="android.permission.INTERNET" />\n
    1

    Three Steps

    webView.getSettings().setJavaScriptEnabled(true);\n\nwebView.setWebViewClient(new WebViewClient() {\n    @Override\n    public boolean shouldOverrideUrlLoading(WebView view, String url) {\n        view.loadUrl(url); // 根据传入的参数再去加载新的网页\n        return true; // 表示当前WebView可以处理打开新网页的请求,不用借助系统浏览器\n    }\n});\n\nwebView.loadUrl("http://www.github.com");\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    HTTP URL Connection

    HTTP Client

    XML

    Pull

    HttpClient httpClient = new DefaultHttpClient();\n\n// 指定访问的服务器地址是电脑本机\nHttpGet httpGet = new HttpGet("http://10.0.2.2/get_data.xml");\nHttpResponse httpResponse = httpClient.execute(httpGet);\n\nif (httpResponse.getStatusLine().getStatusCode() == 200) {\n    // 请求和响应都成功了\n    HttpEntity entity = httpResponse.getEntity();\n    String response = EntityUtils.toString(entity,"utf-8");\n\n    //XML Pull 方式解析\n    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();\n    XmlPullParser xmlPullParser = factory.newPullParser();\n    xmlPullParser.setInput(new StringReader(xmlData));\n    int eventType = xmlPullParser.getEventType();\n\n    String id = "";\n    String name = "";\n    String version = "";\n\n    while (eventType != XmlPullParser.END_DOCUMENT) {\n\n        String nodeName = xmlPullParser.getName();\n\n        switch (eventType) {\n        // 开始解析某个结点\n        case XmlPullParser.START_TAG: {\n            if ("id".equals(nodeName)) {\n                id = xmlPullParser.nextText();\n            } else if ("name".equals(nodeName)) {\n                name = xmlPullParser.nextText();\n            } else if ("version".equals(nodeName)) {\n               version = xmlPullParser.nextText();\n            }\n            break;\n        }\n        // 完成解析某个结点\n        case XmlPullParser.END_TAG: {\n            if ("app".equals(nodeName)) {\n                Log.d("MainActivity", "id is " + id);\n                Log.d("MainActivity", "name is " + name);\n                Log.d("MainActivity", "version is " + version);\n            }\n            break;\n        }\n        default:\n            break;\n        }\n\n        eventType = xmlPullParser.next();\n    } // end of while\n}  //  end of if\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53

    SAX

    Default Handler
    public class ContentHandler extends DefaultHandler {\n    private String nodeName;\n    private StringBuilder id;\n    private StringBuilder name;\n    private StringBuilder version;\n\n    @Override\n    public void startDocument() throws SAXException {\n        id = new StringBuilder();\n        name = new StringBuilder();\n        version = new StringBuilder();\n    }\n    @Override\n    public void startElement(String uri, String localName, String qName,\n      Attributes attributes) throws SAXException {\n        // 记录当前结点名\n        nodeName = localName;\n    }\n    @Override\n    public void characters(\n      char[] ch,\n      int start,\n      int length) throws SAXException {\n        // 根据当前的结点名判断将内容添加到哪一个StringBuilder对象中\n        if ("id".equals(nodeName)) {\n            id.append(ch, start, length);\n        } else if ("name".equals(nodeName)) {\n            name.append(ch, start, length);\n        } else if ("version".equals(nodeName)) {\n            version.append(ch, start, length);\n        }\n    }\n    @Override\n    public void endElement(\n      String uri,\n      String localName,\n      String qName) throws SAXException {\n        if ("app".equals(localName)) {\n            Log.d("ContentHandler", "id is " + id.toString().trim());\n            Log.d("ContentHandler", "name is " + name.toString().trim());\n            Log.d("ContentHandler", "version is " + version.toString().trim());\n            // 最后要将StringBuilder清空掉\n            id.setLength(0);\n            name.setLength(0);\n            version.setLength(0);\n        }\n    }\n    @Override\n    public void endDocument() throws SAXException {\n    }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    HttpClient httpClient = new DefaultHttpClient();\n// 指定访问的服务器地址是电脑本机\nHttpGet httpGet = new HttpGet("http://10.0.2.2:8080/get_data.xml");\nHttpResponse httpResponse = httpClient.execute(httpGet);\n\nif (httpResponse.getStatusLine().getStatusCode() == 200) {\n    // 请求和响应都成功了\n    HttpEntity entity = httpResponse.getEntity();\n    String response = EntityUtils.toString(entity, "utf-8");\n\n    SAXParserFactory factory = SAXParserFactory.newInstance();\n    XMLReader xmlReader = factory.newSAXParser().getXMLReader();\n    ContentHandler handler = new ContentHandler();\n\n    // 将ContentHandler的实例设置到XMLReader中\n    xmlReader.setContentHandler(handler);\n    // 开始执行解析\n    xmlReader.parse(new InputSource(new StringReader(xmlData)));\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    JSON

    JSON Object

    HttpClient httpClient = new DefaultHttpClient();\n// 指定访问的服务器地址是电脑本机\nHttpGet httpGet = new HttpGet("http://10.0.2.2/get_data.json");\nHttpResponse httpResponse = httpClient.execute(httpGet);\n\nif (httpResponse.getStatusLine().getStatusCode() == 200) {\n    // 请求和响应都成功了\n    HttpEntity entity = httpResponse.getEntity();\n    String response = EntityUtils.toString(entity, "utf-8");\n\n    JSONArray jsonArray = new JSONArray(response);\n\n    for (int i = 0; i < jsonArray.length(); i++) {\n        JSONObject jsonObject = jsonArray.getJSONObject(i);\n        String id = jsonObject.getString("id");\n        String name = jsonObject.getString("name");\n        String version = jsonObject.getString("version");\n    }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    GSON

    HttpClient httpClient = new DefaultHttpClient();\n// 指定访问的服务器地址是电脑本机\nHttpGet httpGet = new HttpGet("http://10.0.2.2/get_data.json");\nHttpResponse httpResponse = httpClient.execute(httpGet);\n\nif (httpResponse.getStatusLine().getStatusCode() == 200) {\n    // 请求和响应都成功了\n    HttpEntity entity = httpResponse.getEntity();\n    String response = EntityUtils.toString(entity, "utf-8");\n\n    Gson gson = new Gson();\n    List<App> appList = gson.fromJson(response, new TypeToken<List<App>>() {}.getType());\n\n    for (App app : appList) {\n        Log.d("MainActivity", "id is " + app.getId());\n        Log.d("MainActivity", "name is " + app.getName());\n        Log.d("MainActivity", "version is " + app.getVersion());\n    }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    Network Best Practice

    public interface HttpCallbackListener {\nvoid onFinish(String response);\nvoid onError(Exception e);\n}\n
    1
    2
    3
    4
    public class HttpUtil {\n    public static void sendHttpRequest(final String address, final\n      HttpCallbackListener listener) {\n        new Thread(new Runnable() {\n        @Override\n        public void run() {\n            HttpURLConnection connection = null;\n            try {\n\n            URL url = new URL(address);\n            connection = (HttpURLConnection) url.openConnection();\n            connection.setRequestMethod("GET");\n            connection.setConnectTimeout(8000);\n            connection.setReadTimeout(8000);\n            connection.setDoInput(true);\n            connection.setDoOutput(true);\n\n            InputStream in = connection.getInputStream();\n            BufferedReader reader = new BufferedReader(new InputStreamReader(in));\n            StringBuilder response = new StringBuilder();\n            String line;\n\n            while ((line = reader.readLine()) != null) {\n                response.append(line);\n            }\n\n            if (listener != null) {\n                // 回调 onFinish() 方法\n                // 将 response 传入回调方法\n                listener.onFinish(response.toString());\n                }\n            } catch (Exception e) {\n                if (listener != null) {\n                // 回调 onError() 方法\n                listener.onError(e);\n                }\n            } finally {\n                if (connection != null) {\n                    connection.disconnect();\n                }\n            }\n        }  //  end of run\n        }).start();  //  end of runnable\n    }  //   end of sendHttpRequest\n}  //  end of class\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    //以后每当需要发起一条 HTTP 请求的时候就可以这样写:\nString address = "http://www.github.com";\nString response = HttpUtil.sendHttpRequest(address, new HttpCallbackListener() {\n    @Override\n    public void onFinish(String response) {\n        // 在这里根据返回内容执行具体的逻辑\n    }\n    @Override\n    public void onError(Exception e) {\n        // 在这里对异常情况进行处理\n    }\n});\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    Map

    Location

    public class MainActivity extends Activity {\n\n  public static final int SHOW_LOCATION = 0;\n\n  private TextView positionTextView;\n\n  private LocationManager locationManager;\n\n  private String provider;\n\n  @Override\n  protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n    setContentView(R.layout.activity_main);\n    positionTextView = (TextView) findViewById(R.id.position_text_view);\n    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);\n    // 获取所有可用的位置提供器\n    List<String> providerList = locationManager.getProviders(true);\n    if (providerList.contains(LocationManager.GPS_PROVIDER)) {\n      provider = LocationManager.GPS_PROVIDER;\n    } else if (providerList.contains(LocationManager.NETWORK_PROVIDER)) {\n      provider = LocationManager.NETWORK_PROVIDER;\n    } else {\n      // 当没有可用的位置提供器时,弹出Toast提示用户\n      Toast.makeText(this, "No location provider to use",\n          Toast.LENGTH_SHORT).show();\n      return;\n    }\n    Location location = locationManager.getLastKnownLocation(provider);\n    if (location != null) {\n      // 显示当前设备的位置信息\n      showLocation(location);\n    }\n    locationManager.requestLocationUpdates(provider, 5000, 1,\n        locationListener);\n  }\n\n  protected void onDestroy() {\n    super.onDestroy();\n    if (locationManager != null) {\n      // 关闭程序时将监听器移除\n      locationManager.removeUpdates(locationListener);\n    }\n  }\n\n  LocationListener locationListener = new LocationListener() {\n\n    @Override\n    public void onStatusChanged(String provider, int status, Bundle extras) {\n    }\n\n    @Override\n    public void onProviderEnabled(String provider) {\n    }\n\n    @Override\n    public void onProviderDisabled(String provider) {\n    }\n\n    @Override\n    public void onLocationChanged(Location location) {\n      // 更新当前设备的位置信息\n      showLocation(location);\n    }\n  };\n\n  private void showLocation(final Location location) {\n    new Thread(new Runnable() {\n      @Override\n      public void run() {\n        try {\n          // 组装反向地理编码的接口地址\n          StringBuilder url = new StringBuilder();\n          url.append("http://maps.googleapis.com/maps/api/geocode/json?latlng=");\n          url.append(location.getLatitude()).append(",")\n              .append(location.getLongitude());\n          url.append("&sensor=false");\n          HttpClient httpClient = new DefaultHttpClient();\n          HttpGet httpGet = new HttpGet(url.toString());\n          // 在请求消息头中指定语言,保证服务器会返回中文数据\n          httpGet.addHeader("Accept-Language", "zh-CN");\n          HttpResponse httpResponse = httpClient.execute(httpGet);\n          if (httpResponse.getStatusLine().getStatusCode() == 200) {\n            HttpEntity entity = httpResponse.getEntity();\n            String response = EntityUtils.toString(entity, "utf-8");\n            JSONObject jsonObject = new JSONObject(response);\n            // 获取results节点下的位置信息\n            JSONArray resultArray = jsonObject.getJSONArray("results");\n            if (resultArray.length() > 0) {\n              JSONObject subObject = resultArray.getJSONObject(0);\n              // 取出格式化后的位置信息\n              String address = subObject.getString("formatted_address");\n              Message message = new Message();\n              message.what = SHOW_LOCATION;\n              message.obj = address;\n              handler.sendMessage(message);\n            }\n          }\n        } catch (Exception e) {\n          e.printStackTrace();\n        }\n      }\n    }).start();\n  }\n\n  private Handler handler = new Handler() {\n\n    public void handleMessage(Message msg) {\n      switch (msg.what) {\n      case SHOW_LOCATION:\n        String currentPosition = (String) msg.obj;\n        positionTextView.setText(currentPosition);\n        break;\n      default:\n        break;\n      }\n    }\n\n  };\n\n}\n\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122

    Sensor

    SensorManager sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);\n
    1
    SensorEventListener listener = new SensorEventListener() {\n    @Override\n    public void onAccuracyChanged(Sensor sensor, int accuracy) {\n    }\n    @Override\n    public void onSensorChanged(SensorEvent event) {\n    }\n};\n
    1
    2
    3
    4
    5
    6
    7
    8
    sensorManager.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_NORMAL);\nsensorManager.unregisterListener(listener);\n
    1
    2

    Light Sensor

    Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);\n
    1

    Accelerometer Sensor

    Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);\n
    1

    Orientation Sensor

    Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);


    Best Practice

    Global Context

    <application android:name="com.example.networkTest.MyApplication">\n  ......\n</application>\n
    1
    2
    3
    public class MyApplication extends Application {\n    private static Context context;\n    @Override\n    public void onCreate() {\n        context = getApplicationContext();\n    }\n    public static Context getContext() {\n        return context;\n    }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    用 Intent 传递对象

    Serializable

    public class Person implements Serializable\n
    1

    Parcelable

    public class Person implements Parcelable {\n    private String name;\n    private int age;\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n    @Override\n    public void writeToParcel(Parcel dest, int flags) {\n        dest.writeString(name); // 写出name\n        dest.writeInt(age); // 写出age\n    }\n\n    public static final Parcelable.Creator<Person> CREATOR = new\n      Parcelable.Creator<Person>() {\n        @Override\n        public Person createFromParcel(Parcel source) {\n            Person person = new Person();\n            person.name = source.readString(); // 读取name\n            person.age = source.readInt(); // 读取age\n            return person;\n        }\n        @Override\n        public Person[] newArray(int size) {\n            return new Person[size];\n        }\n    };\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29

    Custom Logger

    public class LogUtil {\n    public static final int VERBOSE = 1;\n    public static final int DEBUG = 2;\n    public static final int INFO = 3;\n    public static final int WARN = 4;\n    public static final int ERROR = 5;\n    public static final int NOTHING = 6;\n    //custom key\n    public static final int LEVEL = VERBOSE;\n\n    public static void v(String tag, String msg) {\n        if (LEVEL <= VERBOSE) {\n            Log.v(tag, msg);\n        }\n    }\n    public static void d(String tag, String msg) {\n        if (LEVEL <= DEBUG) {\n            Log.d(tag, msg);\n        }\n    }\n    public static void i(String tag, String msg) {\n        if (LEVEL <= INFO) {\n            Log.i(tag, msg);\n        }\n    }\n    public static void w(String tag, String msg) {\n        if (LEVEL <= WARN) {\n            Log.w(tag, msg);\n        }\n    }\n    public static void e(String tag, String msg) {\n        if (LEVEL <= ERROR) {\n            Log.e(tag, msg);\n        }\n    }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    ',230);t.render=function(a,p,t,o,c,l){return n(),s("div",null,[e])};export default t;export{p as __pageData}; diff --git a/assets/programming_android_androidBasicNotes.md.4d20a147.lean.js b/assets/programming_android_androidBasicNotes.md.4d20a147.lean.js new file mode 100644 index 00000000000..a3c7e8e0d4e --- /dev/null +++ b/assets/programming_android_androidBasicNotes.md.4d20a147.lean.js @@ -0,0 +1 @@ +import{o as n,c as s,a}from"./app.6dd2a1b7.js";const p='{"title":"Android Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Android Framework","slug":"android-framework"},{"level":3,"title":"Dalvik virtual machine","slug":"dalvik-virtual-machine"},{"level":3,"title":"Basic Building Blocks","slug":"basic-building-blocks"},{"level":2,"title":"Android Studio","slug":"android-studio"},{"level":3,"title":"Plugins","slug":"plugins"},{"level":2,"title":"API Conventions","slug":"api-conventions"},{"level":3,"title":"Manager Service","slug":"manager-service"},{"level":2,"title":"Activity","slug":"activity"},{"level":3,"title":"Base Activity","slug":"base-activity"},{"level":3,"title":"Activity Collector","slug":"activity-collector"},{"level":3,"title":"Start Activity","slug":"start-activity"},{"level":2,"title":"UI Design","slug":"ui-design"},{"level":3,"title":"Layout","slug":"layout"},{"level":3,"title":"Component","slug":"component"},{"level":3,"title":"Drawable","slug":"drawable"},{"level":2,"title":"Fragment","slug":"fragment"},{"level":3,"title":"Basic Fragment","slug":"basic-fragment"},{"level":3,"title":"Transfer Information","slug":"transfer-information"},{"level":3,"title":"Runtime Loop","slug":"runtime-loop"},{"level":2,"title":"Broadcast","slug":"broadcast"},{"level":3,"title":"Register Receiver","slug":"register-receiver"},{"level":3,"title":"Custom Broadcast","slug":"custom-broadcast"},{"level":3,"title":"Local Broadcast","slug":"local-broadcast"},{"level":2,"title":"Data Store","slug":"data-store"},{"level":3,"title":"Files Store","slug":"files-store"},{"level":3,"title":"Shared Preferences","slug":"shared-preferences"},{"level":3,"title":"DataBase","slug":"database"},{"level":2,"title":"Content Provider","slug":"content-provider"},{"level":3,"title":"Read Other App Content","slug":"read-other-app-content"},{"level":3,"title":"Provide App Content","slug":"provide-app-content"},{"level":2,"title":"Service","slug":"service"},{"level":3,"title":"Handler","slug":"handler"},{"level":3,"title":"Async Task","slug":"async-task"},{"level":3,"title":"Basic Service","slug":"basic-service"},{"level":3,"title":"ForeGround Service","slug":"foreground-service"},{"level":3,"title":"Intent Service","slug":"intent-service"},{"level":3,"title":"Alarm Service","slug":"alarm-service"},{"level":2,"title":"Media","slug":"media"},{"level":3,"title":"Notification","slug":"notification"},{"level":3,"title":"SMS","slug":"sms"},{"level":3,"title":"Audio","slug":"audio"},{"level":3,"title":"Music","slug":"music"},{"level":2,"title":"NetWork","slug":"network"},{"level":3,"title":"WebView","slug":"webview"},{"level":3,"title":"HTTP URL Connection","slug":"http-url-connection"},{"level":3,"title":"HTTP Client","slug":"http-client"},{"level":3,"title":"XML","slug":"xml"},{"level":3,"title":"JSON","slug":"json"},{"level":3,"title":"Network Best Practice","slug":"network-best-practice"},{"level":2,"title":"Map","slug":"map"},{"level":3,"title":"Location","slug":"location"},{"level":2,"title":"Sensor","slug":"sensor"},{"level":3,"title":"Light Sensor","slug":"light-sensor"},{"level":3,"title":"Accelerometer Sensor","slug":"accelerometer-sensor"},{"level":3,"title":"Orientation Sensor","slug":"orientation-sensor"},{"level":2,"title":"Best Practice","slug":"best-practice"},{"level":3,"title":"Global Context","slug":"global-context"},{"level":3,"title":"用 Intent 传递对象","slug":"用-intent-传递对象"},{"level":3,"title":"Custom Logger","slug":"custom-logger"}],"relativePath":"programming/android/androidBasicNotes.md","lastUpdated":1627196177000}',t={},e=a('',230);t.render=function(a,p,t,o,c,l){return n(),s("div",null,[e])};export default t;export{p as __pageData}; diff --git a/assets/programming_devops_cleanCodeBasicNotes.md.f8256997.js b/assets/programming_devops_cleanCodeBasicNotes.md.f8256997.js new file mode 100644 index 00000000000..bafc73c9acb --- /dev/null +++ b/assets/programming_devops_cleanCodeBasicNotes.md.f8256997.js @@ -0,0 +1 @@ +import{o as n,c as s,b as a,d as e}from"./app.6dd2a1b7.js";const t='{"title":"Clean Code Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Programming Principles","slug":"programming-principles"},{"level":3,"title":"SOLID principle","slug":"solid-principle"},{"level":2,"title":"Programming Paradigms","slug":"programming-paradigms"},{"level":3,"title":"Taxonomy of Paradigms","slug":"taxonomy-of-paradigms"},{"level":3,"title":"Functional Programming","slug":"functional-programming"},{"level":2,"title":"Code Review","slug":"code-review"},{"level":3,"title":"Code Review Basis","slug":"code-review-basis"},{"level":3,"title":"Security Review","slug":"security-review"},{"level":3,"title":"Documents Review","slug":"documents-review"},{"level":3,"title":"Comments Review","slug":"comments-review"},{"level":3,"title":"Test Review","slug":"test-review"}],"relativePath":"programming/devops/cleanCodeBasicNotes.md","lastUpdated":1627196177000}',c={},l=a("h1",{id:"clean-code-basic-notes"},[a("a",{class:"header-anchor",href:"#clean-code-basic-notes","aria-hidden":"true"},"#"),e(" Clean Code Basic Notes")],-1),o=a("p",null,[a("div",{class:"table-of-contents"},[a("ul",null,[a("li",null,[a("a",{href:"#clean-code-basic-notes"},"Clean Code Basic Notes"),a("ul",null,[a("li",null,[a("a",{href:"#programming-principles"},"Programming Principles")]),a("li",null,[a("a",{href:"#programming-paradigms"},"Programming Paradigms")]),a("li",null,[a("a",{href:"#code-review"},"Code Review")])])])])])],-1),p=a("h2",{id:"programming-principles"},[a("a",{class:"header-anchor",href:"#programming-principles","aria-hidden":"true"},"#"),e(" Programming Principles")],-1),u=a("h3",{id:"solid-principle"},[a("a",{class:"header-anchor",href:"#solid-principle","aria-hidden":"true"},"#"),e(" SOLID principle")],-1),i=a("h4",{id:"single-responsibility-principle"},[a("a",{class:"header-anchor",href:"#single-responsibility-principle","aria-hidden":"true"},"#"),e(" Single Responsibility Principle")],-1),r=a("p",null,"A class should have only one job",-1),k=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Animal"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"constructor"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"name"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"getAnimalName"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"saveAnimal"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"animal"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n\n"),a("span",{class:"token comment"},"// =>"),e("\n\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Animal"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"constructor"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"name"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"getAnimalName"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"AnimalDB"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"getAnimal"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"animal"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"saveAnimal"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"animal"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br")])],-1),m=a("h4",{id:"open-closed-principle"},[a("a",{class:"header-anchor",href:"#open-closed-principle","aria-hidden":"true"},"#"),e(" Open-Closed Principle")],-1),b=a("p",null,"Software entities(Classes, modules, functions) should be open for extension, close for modification.",-1),d=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"const"),e(" animals"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token class-name"},"Array"),a("span",{class:"token generics"},[a("span",{class:"token punctuation"},"<"),a("span",{class:"token class-name"},"Animal"),a("span",{class:"token punctuation"},">")]),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),e("\n "),a("span",{class:"token keyword"},"new"),e(),a("span",{class:"token class-name"},"Animal"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'lion'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"new"),e(),a("span",{class:"token class-name"},"Animal"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'mouse'"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n\nfunction "),a("span",{class:"token class-name"},"AnimalSound"),a("span",{class:"token punctuation"},"("),e("a"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token class-name"},"Array"),a("span",{class:"token generics"},[a("span",{class:"token punctuation"},"<"),a("span",{class:"token class-name"},"Animal"),a("span",{class:"token punctuation"},">")]),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"for"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),e(" i "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(" i "),a("span",{class:"token operator"},"<="),e(" a"),a("span",{class:"token punctuation"},"."),e("length"),a("span",{class:"token punctuation"},";"),e(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"if"),a("span",{class:"token punctuation"},"("),e("a"),a("span",{class:"token punctuation"},"["),e("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),e("name "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token string"},"'lion'"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'roar'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"if"),a("span",{class:"token punctuation"},"("),e("a"),a("span",{class:"token punctuation"},"["),e("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),e("name "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token string"},"'mouse'"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'squeak'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token class-name"},"AnimalSound"),a("span",{class:"token punctuation"},"("),e("animals"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br")])],-1),g=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Animal"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"makeSound"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Lion"),e(),a("span",{class:"token keyword"},"extends"),e(),a("span",{class:"token class-name"},"Animal"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"makeSound"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"return"),e(),a("span",{class:"token string"},"'roar'"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Squirrel"),e(),a("span",{class:"token keyword"},"extends"),e(),a("span",{class:"token class-name"},"Animal"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"makeSound"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"return"),e(),a("span",{class:"token string"},"'squeak'"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Snake"),e(),a("span",{class:"token keyword"},"extends"),e(),a("span",{class:"token class-name"},"Animal"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"makeSound"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"return"),e(),a("span",{class:"token string"},"'hiss'"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token comment"},"//..."),e("\nfunction "),a("span",{class:"token class-name"},"AnimalSound"),a("span",{class:"token punctuation"},"("),e("a"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token class-name"},"Array"),a("span",{class:"token generics"},[a("span",{class:"token punctuation"},"<"),a("span",{class:"token class-name"},"Animal"),a("span",{class:"token punctuation"},">")]),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"for"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),e(" i "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(" i "),a("span",{class:"token operator"},"<="),e(" a"),a("span",{class:"token punctuation"},"."),e("length"),a("span",{class:"token punctuation"},";"),e(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),e("a"),a("span",{class:"token punctuation"},"["),e("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"makeSound"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token class-name"},"AnimalSound"),a("span",{class:"token punctuation"},"("),e("animals"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br")])],-1),w=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Discount"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"giveDiscount"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"if"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),e("customer "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token string"},"'fav'"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"return"),e(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),e("price "),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token number"},"0.2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token keyword"},"if"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),e("customer "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token string"},"'vip'"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"return"),e(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),e("price "),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token number"},"0.4"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br")])],-1),h=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"VIPDiscount"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token class-name"},"Discount"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"getDiscount"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"return"),e(),a("span",{class:"token keyword"},"super"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getDiscount"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"SuperVIPDiscount"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token class-name"},"VIPDiscount"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"getDiscount"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"return"),e(),a("span",{class:"token keyword"},"super"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getDiscount"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),f=a("h4",{id:"liskov-substitution-principle"},[a("a",{class:"header-anchor",href:"#liskov-substitution-principle","aria-hidden":"true"},"#"),e(" Liskov Substitution Principle")],-1),y=a("p",null,"A sub-class must be substitutable for its super-class",-1),v=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[e("function "),a("span",{class:"token class-name"},"AnimalLegCount"),a("span",{class:"token punctuation"},"("),e("a"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token class-name"},"Array"),a("span",{class:"token generics"},[a("span",{class:"token punctuation"},"<"),a("span",{class:"token class-name"},"Animal"),a("span",{class:"token punctuation"},">")]),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"for"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),e(" i "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(" i "),a("span",{class:"token operator"},"<="),e(" a"),a("span",{class:"token punctuation"},"."),e("length"),a("span",{class:"token punctuation"},";"),e(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"if"),a("span",{class:"token punctuation"},"("),e("typeof a"),a("span",{class:"token punctuation"},"["),e("i"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token class-name"},"Lion"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"LionLegCount"),a("span",{class:"token punctuation"},"("),e("a"),a("span",{class:"token punctuation"},"["),e("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"if"),a("span",{class:"token punctuation"},"("),e("typeof a"),a("span",{class:"token punctuation"},"["),e("i"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token class-name"},"Mouse"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"MouseLegCount"),a("span",{class:"token punctuation"},"("),e("a"),a("span",{class:"token punctuation"},"["),e("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"if"),a("span",{class:"token punctuation"},"("),e("typeof a"),a("span",{class:"token punctuation"},"["),e("i"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token class-name"},"Snake"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"SnakeLegCount"),a("span",{class:"token punctuation"},"("),e("a"),a("span",{class:"token punctuation"},"["),e("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token class-name"},"AnimalLegCount"),a("span",{class:"token punctuation"},"("),e("animals"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),S=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Animal"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token class-name"},"LegCount"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n\n"),a("span",{class:"token comment"},"//..."),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Lion"),e(),a("span",{class:"token keyword"},"extends"),e(),a("span",{class:"token class-name"},"Animal"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token class-name"},"LegCount"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token comment"},"//..."),e("\n\nfunction "),a("span",{class:"token class-name"},"AnimalLegCount"),a("span",{class:"token punctuation"},"("),e("a"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token class-name"},"Array"),a("span",{class:"token generics"},[a("span",{class:"token punctuation"},"<"),a("span",{class:"token class-name"},"Animal"),a("span",{class:"token punctuation"},">")]),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"for"),a("span",{class:"token punctuation"},"("),e("let i "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(" i "),a("span",{class:"token operator"},"<="),e(" a"),a("span",{class:"token punctuation"},"."),e("length"),a("span",{class:"token punctuation"},";"),e(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n a"),a("span",{class:"token punctuation"},"["),e("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"LegCount"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token class-name"},"AnimalLegCount"),a("span",{class:"token punctuation"},"("),e("animals"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br")])],-1),C=a("h4",{id:"interface-segregation-principle"},[a("a",{class:"header-anchor",href:"#interface-segregation-principle","aria-hidden":"true"},"#"),e(" Interface Segregation Principle")],-1),A=a("ul",null,[a("li",null,[e("Make "),a("strong",null,"fine grained"),e(" interfaces that are client specific")]),a("li",null,"Clients should not be forced to depend upon interfaces that they do not use")],-1),P=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"interface"),e(),a("span",{class:"token class-name"},"IShape"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"drawCircle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token function"},"drawSquare"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token function"},"drawRectangle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Circle"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"IShape"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"drawCircle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"drawSquare"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"drawRectangle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Square"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"IShape"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"drawCircle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"drawSquare"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"drawRectangle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Rectangle"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"IShape"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"drawCircle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"drawSquare"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"drawRectangle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br")])],-1),q=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"interface"),e(),a("span",{class:"token class-name"},"IShape"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"draw"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"interface"),e(),a("span",{class:"token class-name"},"ICircle"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"drawCircle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"interface"),e(),a("span",{class:"token class-name"},"ISquare"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"drawSquare"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"interface"),e(),a("span",{class:"token class-name"},"IRectangle"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"drawRectangle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"interface"),e(),a("span",{class:"token class-name"},"ITriangle"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"drawTriangle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Circle"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"ICircle"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"drawCircle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Square"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"ISquare"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"drawSquare"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Rectangle"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"IRectangle"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"drawRectangle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Triangle"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"ITriangle"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"drawTriangle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"CustomShape"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"IShape"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"draw"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br")])],-1),R=a("p",null,"OR",-1),I=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Circle"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"IShape"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"draw"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Triangle"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"IShape"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"draw"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Square"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"IShape"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"draw"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Rectangle"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"IShape"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"draw"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br")])],-1),x=a("h4",{id:"dependency-inversion-principle"},[a("a",{class:"header-anchor",href:"#dependency-inversion-principle","aria-hidden":"true"},"#"),e(" Dependency Inversion Principle")],-1),L=a("p",null,[e("Dependency should be on "),a("strong",null,"abstractions"),e(" not concretions:")],-1),D=a("ul",null,[a("li",null,[e("High-level modules should not depend upon low-level modules. Both should depend upon "),a("strong",null,"abstractions")]),a("li",null,"Abstractions should not depend on details. Details should depend upon abstractions")],-1),T=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"XMLHttpService"),e(),a("span",{class:"token keyword"},"extends"),e(),a("span",{class:"token class-name"},"XMLHttpRequestService"),e(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Http"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"constructor"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"private"),e(" xmlHttpService"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token class-name"},"XMLHttpService"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e(),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"get"),a("span",{class:"token punctuation"},"("),e("url"),a("span",{class:"token operator"},":"),e(" string "),a("span",{class:"token punctuation"},","),e(" options"),a("span",{class:"token operator"},":"),e(" any"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),e("xmlHttpService"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"request"),a("span",{class:"token punctuation"},"("),e("url"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},"'GET'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"post"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),e("xmlHttpService"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"request"),a("span",{class:"token punctuation"},"("),e("url"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},"'POST'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),j=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"interface"),e(),a("span",{class:"token class-name"},"Connection"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"request"),a("span",{class:"token punctuation"},"("),e("url"),a("span",{class:"token operator"},":"),e(" string"),a("span",{class:"token punctuation"},","),e(" opts"),a("span",{class:"token operator"},":"),e("any"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n\n"),a("span",{class:"token comment"},"// Abstraction not upon on details (but upon on abstractions)"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Http"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"constructor"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"private"),e(" httpConnection"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token class-name"},"Connection"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e(),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"get"),a("span",{class:"token punctuation"},"("),e("url"),a("span",{class:"token operator"},":"),e(" string "),a("span",{class:"token punctuation"},","),e(" options"),a("span",{class:"token operator"},":"),e(" any"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),e("httpConnection"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"request"),a("span",{class:"token punctuation"},"("),e("url"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},"'GET'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"post"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),e("httpConnection"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"request"),a("span",{class:"token punctuation"},"("),e("url"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},"'POST'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"XMLHttpService"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"Connection"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"const"),e(" xhr "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"new"),e(),a("span",{class:"token class-name"},"XMLHttpRequest"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token function"},"request"),a("span",{class:"token punctuation"},"("),e("url"),a("span",{class:"token operator"},":"),e(" string"),a("span",{class:"token punctuation"},","),e(" opts"),a("span",{class:"token operator"},":"),e("any"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n xhr"),a("span",{class:"token punctuation"},"."),a("span",{class:"token keyword"},"open"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n xhr"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"send"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"NodeHttpService"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"Connection"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"request"),a("span",{class:"token punctuation"},"("),e("url"),a("span",{class:"token operator"},":"),e(" string"),a("span",{class:"token punctuation"},","),e(" opts"),a("span",{class:"token operator"},":"),e("any"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"MockHttpService"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"Connection"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"request"),a("span",{class:"token punctuation"},"("),e("url"),a("span",{class:"token operator"},":"),e(" string"),a("span",{class:"token punctuation"},","),e(" opts"),a("span",{class:"token operator"},":"),e("any"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br")])],-1),H=a("h2",{id:"programming-paradigms"},[a("a",{class:"header-anchor",href:"#programming-paradigms","aria-hidden":"true"},"#"),e(" Programming Paradigms")],-1),N=a("p",null,"Each programming language realizes one or more paradigms. Each paradigm is defined by a set of programming concepts.",-1),M=a("h3",{id:"taxonomy-of-paradigms"},[a("a",{class:"header-anchor",href:"#taxonomy-of-paradigms","aria-hidden":"true"},"#"),e(" Taxonomy of Paradigms")],-1),B=a("p",null,[a("img",{src:"/awesome-notes/assets/ProgrammingParadigms.04c60b43.jpg",alt:"Taxonomy of Programming Paradigms"})],-1),O=a("p",null,"Nondeterminism is important for real-world interaction. Named state is important for modularity.",-1),X=a("h4",{id:"observable-nondeterminism"},[a("a",{class:"header-anchor",href:"#observable-nondeterminism","aria-hidden":"true"},"#"),e(" Observable Nondeterminism")],-1),E=a("p",null,[e("During the execution, this choice is made by a part of the run-time system called the scheduler. The nondeterminism is observable if a user can see "),a("strong",null,"different results"),e(" from executions that start at the "),a("strong",null,"same internal configuration"),e(".")],-1),F=a("ul",null,[a("li",null,"concurrency or race condition (timing effects)"),a("li",null,"shared-state concurrency or message-passing concurrency"),a("li",null,"concurrent programming language e.g Java")],-1),V=a("h4",{id:"named-state"},[a("a",{class:"header-anchor",href:"#named-state","aria-hidden":"true"},"#"),e(" Named State")],-1),G=a("p",null,"State is the ability to remember information (a sequence of values in time). Distinguish three axes of expressiveness, depending on whether the state is:",-1),z=a("ul",null,[a("li",null,"unnamed or named"),a("li",null,"deterministic or nondeterministic"),a("li",null,"sequential or concurrent"),a("li",null,"named, nondeterministic and concurrent paradigm as the most expressiveness of state"),a("li",null,"named state for updatable memory (mutable state) and modularity")],-1),J=a("p",null,"The least expressive combination is functional programming (threaded state: unnamed, deterministic, sequential). Adding concurrency gives declarative concurrent programming (synchronous cells: unnamed, deterministic, concurrent). Adding nondeterministic choice gives concurrent logic programming (stream mergers: unnamed, nondeterministic, concurrent). Adding ports or cells, gives message passing or shared state (named, nondeterministic, concurrent).",-1),U=a("h3",{id:"functional-programming"},[a("a",{class:"header-anchor",href:"#functional-programming","aria-hidden":"true"},"#"),e(" Functional Programming")],-1),K=a("p",null,[e("Based on the concept of first-class function or closure, which makes it equivalent to the λ-calculus which is "),a("code",null,"Turing complete"),e(".")],-1),Q=a("h2",{id:"code-review"},[a("a",{class:"header-anchor",href:"#code-review","aria-hidden":"true"},"#"),e(" Code Review")],-1),W=a("h3",{id:"code-review-basis"},[a("a",{class:"header-anchor",href:"#code-review-basis","aria-hidden":"true"},"#"),e(" Code Review Basis")],-1),Y=a("ul",null,[a("li",null,[a("p",null,"逻辑正确")]),a("li",null,[a("p",null,"简单易懂")]),a("li",null,[a("p",null,"编程规范(linter)")]),a("li",null,[a("p",null,"模块化")]),a("li",null,[a("p",null,"多余或重复 代码/日志/测试")]),a("li",null,[a("p",null,"重复轮子(可被基本库替换)")]),a("li",null,[a("p",null,"无必要的全局变量")]),a("li",null,[a("p",null,"代码误注释")]),a("li",null,[a("p",null,"死循环(边界检查)")])],-1),Z=a("h3",{id:"security-review"},[a("a",{class:"header-anchor",href:"#security-review","aria-hidden":"true"},"#"),e(" Security Review")],-1),$=a("ul",null,[a("li",null,"所有的数据输入是否都进行了检查(检测正确的类型,长度,格式和范围)并且进行了编码?"),a("li",null,"在哪里使用了第三方工具,返回的错误是否被捕获?"),a("li",null,"输出的值是否进行了检查并且编码?"),a("li",null,"无效的参数值是否能够处理?")],-1),_=a("h3",{id:"documents-review"},[a("a",{class:"header-anchor",href:"#documents-review","aria-hidden":"true"},"#"),e(" Documents Review")],-1),nn=a("h3",{id:"comments-review"},[a("a",{class:"header-anchor",href:"#comments-review","aria-hidden":"true"},"#"),e(" Comments Review")],-1),sn=a("ul",null,[a("li",null,"数据结构"),a("li",null,"计量单位"),a("li",null,"描述代码意图"),a("li",null,"函数块"),a("li",null,"非常规行为/边界检查"),a("li",null,"TODO 标记"),a("li",null,"FIXME 标记"),a("li",null,"第三方库文档")],-1),an=a("h3",{id:"test-review"},[a("a",{class:"header-anchor",href:"#test-review","aria-hidden":"true"},"#"),e(" Test Review")],-1),en=a("ul",null,[a("li",null,"代码是否可以测试?比如,不要添加太多的或是隐藏的依赖关系,不能够初始化对象,测试框架可以使用方法等。"),a("li",null,"是否存在测试,它们是否可以被理解?比如,至少达到你满意的代码覆盖(code coverage)。"),a("li",null,"单元测试是否真正的测试了代码是否可以完成预期的功能?"),a("li",null,"是否检查了数组的“越界“错误?"),a("li",null,"是否有可以被已经存在的 API 所替代的测")],-1);c.render=function(a,e,t,c,tn,cn){return n(),s("div",null,[l,o,p,u,i,r,k,m,b,d,g,w,h,f,y,v,S,C,A,P,q,R,I,x,L,D,T,j,H,N,M,B,O,X,E,F,V,G,z,J,U,K,Q,W,Y,Z,$,_,nn,sn,an,en])};export default c;export{t as __pageData}; diff --git a/assets/programming_devops_cleanCodeBasicNotes.md.f8256997.lean.js b/assets/programming_devops_cleanCodeBasicNotes.md.f8256997.lean.js new file mode 100644 index 00000000000..bafc73c9acb --- /dev/null +++ b/assets/programming_devops_cleanCodeBasicNotes.md.f8256997.lean.js @@ -0,0 +1 @@ +import{o as n,c as s,b as a,d as e}from"./app.6dd2a1b7.js";const t='{"title":"Clean Code Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Programming Principles","slug":"programming-principles"},{"level":3,"title":"SOLID principle","slug":"solid-principle"},{"level":2,"title":"Programming Paradigms","slug":"programming-paradigms"},{"level":3,"title":"Taxonomy of Paradigms","slug":"taxonomy-of-paradigms"},{"level":3,"title":"Functional Programming","slug":"functional-programming"},{"level":2,"title":"Code Review","slug":"code-review"},{"level":3,"title":"Code Review Basis","slug":"code-review-basis"},{"level":3,"title":"Security Review","slug":"security-review"},{"level":3,"title":"Documents Review","slug":"documents-review"},{"level":3,"title":"Comments Review","slug":"comments-review"},{"level":3,"title":"Test Review","slug":"test-review"}],"relativePath":"programming/devops/cleanCodeBasicNotes.md","lastUpdated":1627196177000}',c={},l=a("h1",{id:"clean-code-basic-notes"},[a("a",{class:"header-anchor",href:"#clean-code-basic-notes","aria-hidden":"true"},"#"),e(" Clean Code Basic Notes")],-1),o=a("p",null,[a("div",{class:"table-of-contents"},[a("ul",null,[a("li",null,[a("a",{href:"#clean-code-basic-notes"},"Clean Code Basic Notes"),a("ul",null,[a("li",null,[a("a",{href:"#programming-principles"},"Programming Principles")]),a("li",null,[a("a",{href:"#programming-paradigms"},"Programming Paradigms")]),a("li",null,[a("a",{href:"#code-review"},"Code Review")])])])])])],-1),p=a("h2",{id:"programming-principles"},[a("a",{class:"header-anchor",href:"#programming-principles","aria-hidden":"true"},"#"),e(" Programming Principles")],-1),u=a("h3",{id:"solid-principle"},[a("a",{class:"header-anchor",href:"#solid-principle","aria-hidden":"true"},"#"),e(" SOLID principle")],-1),i=a("h4",{id:"single-responsibility-principle"},[a("a",{class:"header-anchor",href:"#single-responsibility-principle","aria-hidden":"true"},"#"),e(" Single Responsibility Principle")],-1),r=a("p",null,"A class should have only one job",-1),k=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Animal"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"constructor"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"name"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"getAnimalName"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"saveAnimal"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"animal"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n\n"),a("span",{class:"token comment"},"// =>"),e("\n\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Animal"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"constructor"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"name"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"getAnimalName"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"AnimalDB"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"getAnimal"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"animal"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"saveAnimal"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"animal"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br")])],-1),m=a("h4",{id:"open-closed-principle"},[a("a",{class:"header-anchor",href:"#open-closed-principle","aria-hidden":"true"},"#"),e(" Open-Closed Principle")],-1),b=a("p",null,"Software entities(Classes, modules, functions) should be open for extension, close for modification.",-1),d=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"const"),e(" animals"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token class-name"},"Array"),a("span",{class:"token generics"},[a("span",{class:"token punctuation"},"<"),a("span",{class:"token class-name"},"Animal"),a("span",{class:"token punctuation"},">")]),e(),a("span",{class:"token operator"},"="),e(),a("span",{class:"token punctuation"},"["),e("\n "),a("span",{class:"token keyword"},"new"),e(),a("span",{class:"token class-name"},"Animal"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'lion'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),e("\n "),a("span",{class:"token keyword"},"new"),e(),a("span",{class:"token class-name"},"Animal"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'mouse'"),a("span",{class:"token punctuation"},")"),e("\n"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),e("\n\nfunction "),a("span",{class:"token class-name"},"AnimalSound"),a("span",{class:"token punctuation"},"("),e("a"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token class-name"},"Array"),a("span",{class:"token generics"},[a("span",{class:"token punctuation"},"<"),a("span",{class:"token class-name"},"Animal"),a("span",{class:"token punctuation"},">")]),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"for"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),e(" i "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(" i "),a("span",{class:"token operator"},"<="),e(" a"),a("span",{class:"token punctuation"},"."),e("length"),a("span",{class:"token punctuation"},";"),e(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"if"),a("span",{class:"token punctuation"},"("),e("a"),a("span",{class:"token punctuation"},"["),e("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),e("name "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token string"},"'lion'"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'roar'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"if"),a("span",{class:"token punctuation"},"("),e("a"),a("span",{class:"token punctuation"},"["),e("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),e("name "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token string"},"'mouse'"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'squeak'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token class-name"},"AnimalSound"),a("span",{class:"token punctuation"},"("),e("animals"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br")])],-1),g=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Animal"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"makeSound"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Lion"),e(),a("span",{class:"token keyword"},"extends"),e(),a("span",{class:"token class-name"},"Animal"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"makeSound"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"return"),e(),a("span",{class:"token string"},"'roar'"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Squirrel"),e(),a("span",{class:"token keyword"},"extends"),e(),a("span",{class:"token class-name"},"Animal"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"makeSound"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"return"),e(),a("span",{class:"token string"},"'squeak'"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Snake"),e(),a("span",{class:"token keyword"},"extends"),e(),a("span",{class:"token class-name"},"Animal"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"makeSound"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"return"),e(),a("span",{class:"token string"},"'hiss'"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token comment"},"//..."),e("\nfunction "),a("span",{class:"token class-name"},"AnimalSound"),a("span",{class:"token punctuation"},"("),e("a"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token class-name"},"Array"),a("span",{class:"token generics"},[a("span",{class:"token punctuation"},"<"),a("span",{class:"token class-name"},"Animal"),a("span",{class:"token punctuation"},">")]),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"for"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),e(" i "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(" i "),a("span",{class:"token operator"},"<="),e(" a"),a("span",{class:"token punctuation"},"."),e("length"),a("span",{class:"token punctuation"},";"),e(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),e("a"),a("span",{class:"token punctuation"},"["),e("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"makeSound"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token class-name"},"AnimalSound"),a("span",{class:"token punctuation"},"("),e("animals"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br")])],-1),w=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Discount"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"giveDiscount"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"if"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),e("customer "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token string"},"'fav'"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"return"),e(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),e("price "),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token number"},"0.2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token keyword"},"if"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),e("customer "),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token string"},"'vip'"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"return"),e(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),e("price "),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token number"},"0.4"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br")])],-1),h=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"VIPDiscount"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token class-name"},"Discount"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"getDiscount"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"return"),e(),a("span",{class:"token keyword"},"super"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getDiscount"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"SuperVIPDiscount"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token class-name"},"VIPDiscount"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"getDiscount"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"return"),e(),a("span",{class:"token keyword"},"super"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getDiscount"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token operator"},"*"),e(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),f=a("h4",{id:"liskov-substitution-principle"},[a("a",{class:"header-anchor",href:"#liskov-substitution-principle","aria-hidden":"true"},"#"),e(" Liskov Substitution Principle")],-1),y=a("p",null,"A sub-class must be substitutable for its super-class",-1),v=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[e("function "),a("span",{class:"token class-name"},"AnimalLegCount"),a("span",{class:"token punctuation"},"("),e("a"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token class-name"},"Array"),a("span",{class:"token generics"},[a("span",{class:"token punctuation"},"<"),a("span",{class:"token class-name"},"Animal"),a("span",{class:"token punctuation"},">")]),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"for"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"int"),e(" i "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(" i "),a("span",{class:"token operator"},"<="),e(" a"),a("span",{class:"token punctuation"},"."),e("length"),a("span",{class:"token punctuation"},";"),e(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"if"),a("span",{class:"token punctuation"},"("),e("typeof a"),a("span",{class:"token punctuation"},"["),e("i"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token class-name"},"Lion"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"LionLegCount"),a("span",{class:"token punctuation"},"("),e("a"),a("span",{class:"token punctuation"},"["),e("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"if"),a("span",{class:"token punctuation"},"("),e("typeof a"),a("span",{class:"token punctuation"},"["),e("i"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token class-name"},"Mouse"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"MouseLegCount"),a("span",{class:"token punctuation"},"("),e("a"),a("span",{class:"token punctuation"},"["),e("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token keyword"},"if"),a("span",{class:"token punctuation"},"("),e("typeof a"),a("span",{class:"token punctuation"},"["),e("i"),a("span",{class:"token punctuation"},"]"),e(),a("span",{class:"token operator"},"=="),e(),a("span",{class:"token class-name"},"Snake"),a("span",{class:"token punctuation"},")"),e("\n "),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"SnakeLegCount"),a("span",{class:"token punctuation"},"("),e("a"),a("span",{class:"token punctuation"},"["),e("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token class-name"},"AnimalLegCount"),a("span",{class:"token punctuation"},"("),e("animals"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),S=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Animal"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token class-name"},"LegCount"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n\n"),a("span",{class:"token comment"},"//..."),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Lion"),e(),a("span",{class:"token keyword"},"extends"),e(),a("span",{class:"token class-name"},"Animal"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token class-name"},"LegCount"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token comment"},"//..."),e("\n\nfunction "),a("span",{class:"token class-name"},"AnimalLegCount"),a("span",{class:"token punctuation"},"("),e("a"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token class-name"},"Array"),a("span",{class:"token generics"},[a("span",{class:"token punctuation"},"<"),a("span",{class:"token class-name"},"Animal"),a("span",{class:"token punctuation"},">")]),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"for"),a("span",{class:"token punctuation"},"("),e("let i "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),e(" i "),a("span",{class:"token operator"},"<="),e(" a"),a("span",{class:"token punctuation"},"."),e("length"),a("span",{class:"token punctuation"},";"),e(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n a"),a("span",{class:"token punctuation"},"["),e("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"LegCount"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token class-name"},"AnimalLegCount"),a("span",{class:"token punctuation"},"("),e("animals"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br")])],-1),C=a("h4",{id:"interface-segregation-principle"},[a("a",{class:"header-anchor",href:"#interface-segregation-principle","aria-hidden":"true"},"#"),e(" Interface Segregation Principle")],-1),A=a("ul",null,[a("li",null,[e("Make "),a("strong",null,"fine grained"),e(" interfaces that are client specific")]),a("li",null,"Clients should not be forced to depend upon interfaces that they do not use")],-1),P=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"interface"),e(),a("span",{class:"token class-name"},"IShape"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"drawCircle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token function"},"drawSquare"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token function"},"drawRectangle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Circle"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"IShape"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"drawCircle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"drawSquare"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"drawRectangle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Square"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"IShape"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"drawCircle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"drawSquare"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"drawRectangle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Rectangle"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"IShape"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"drawCircle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"drawSquare"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"drawRectangle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br")])],-1),q=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"interface"),e(),a("span",{class:"token class-name"},"IShape"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"draw"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"interface"),e(),a("span",{class:"token class-name"},"ICircle"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"drawCircle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"interface"),e(),a("span",{class:"token class-name"},"ISquare"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"drawSquare"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"interface"),e(),a("span",{class:"token class-name"},"IRectangle"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"drawRectangle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"interface"),e(),a("span",{class:"token class-name"},"ITriangle"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"drawTriangle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Circle"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"ICircle"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"drawCircle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Square"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"ISquare"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"drawSquare"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Rectangle"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"IRectangle"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"drawRectangle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Triangle"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"ITriangle"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"drawTriangle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"CustomShape"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"IShape"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"draw"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br")])],-1),R=a("p",null,"OR",-1),I=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Circle"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"IShape"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"draw"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Triangle"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"IShape"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"draw"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Square"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"IShape"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"draw"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Rectangle"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"IShape"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"draw"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br")])],-1),x=a("h4",{id:"dependency-inversion-principle"},[a("a",{class:"header-anchor",href:"#dependency-inversion-principle","aria-hidden":"true"},"#"),e(" Dependency Inversion Principle")],-1),L=a("p",null,[e("Dependency should be on "),a("strong",null,"abstractions"),e(" not concretions:")],-1),D=a("ul",null,[a("li",null,[e("High-level modules should not depend upon low-level modules. Both should depend upon "),a("strong",null,"abstractions")]),a("li",null,"Abstractions should not depend on details. Details should depend upon abstractions")],-1),T=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"XMLHttpService"),e(),a("span",{class:"token keyword"},"extends"),e(),a("span",{class:"token class-name"},"XMLHttpRequestService"),e(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Http"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"constructor"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"private"),e(" xmlHttpService"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token class-name"},"XMLHttpService"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e(),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"get"),a("span",{class:"token punctuation"},"("),e("url"),a("span",{class:"token operator"},":"),e(" string "),a("span",{class:"token punctuation"},","),e(" options"),a("span",{class:"token operator"},":"),e(" any"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),e("xmlHttpService"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"request"),a("span",{class:"token punctuation"},"("),e("url"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},"'GET'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"post"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),e("xmlHttpService"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"request"),a("span",{class:"token punctuation"},"("),e("url"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},"'POST'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),j=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"interface"),e(),a("span",{class:"token class-name"},"Connection"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"request"),a("span",{class:"token punctuation"},"("),e("url"),a("span",{class:"token operator"},":"),e(" string"),a("span",{class:"token punctuation"},","),e(" opts"),a("span",{class:"token operator"},":"),e("any"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n\n"),a("span",{class:"token comment"},"// Abstraction not upon on details (but upon on abstractions)"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"Http"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"constructor"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"private"),e(" httpConnection"),a("span",{class:"token operator"},":"),e(),a("span",{class:"token class-name"},"Connection"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e(),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"get"),a("span",{class:"token punctuation"},"("),e("url"),a("span",{class:"token operator"},":"),e(" string "),a("span",{class:"token punctuation"},","),e(" options"),a("span",{class:"token operator"},":"),e(" any"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),e("httpConnection"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"request"),a("span",{class:"token punctuation"},"("),e("url"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},"'GET'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token function"},"post"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),e("httpConnection"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"request"),a("span",{class:"token punctuation"},"("),e("url"),a("span",{class:"token punctuation"},","),a("span",{class:"token string"},"'POST'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"XMLHttpService"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"Connection"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token keyword"},"const"),e(" xhr "),a("span",{class:"token operator"},"="),e(),a("span",{class:"token keyword"},"new"),e(),a("span",{class:"token class-name"},"XMLHttpRequest"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token function"},"request"),a("span",{class:"token punctuation"},"("),e("url"),a("span",{class:"token operator"},":"),e(" string"),a("span",{class:"token punctuation"},","),e(" opts"),a("span",{class:"token operator"},":"),e("any"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n xhr"),a("span",{class:"token punctuation"},"."),a("span",{class:"token keyword"},"open"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n xhr"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"send"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"NodeHttpService"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"Connection"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"request"),a("span",{class:"token punctuation"},"("),e("url"),a("span",{class:"token operator"},":"),e(" string"),a("span",{class:"token punctuation"},","),e(" opts"),a("span",{class:"token operator"},":"),e("any"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token keyword"},"class"),e(),a("span",{class:"token class-name"},"MockHttpService"),e(),a("span",{class:"token keyword"},"implements"),e(),a("span",{class:"token class-name"},"Connection"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token function"},"request"),a("span",{class:"token punctuation"},"("),e("url"),a("span",{class:"token operator"},":"),e(" string"),a("span",{class:"token punctuation"},","),e(" opts"),a("span",{class:"token operator"},":"),e("any"),a("span",{class:"token punctuation"},")"),e(),a("span",{class:"token punctuation"},"{"),e("\n "),a("span",{class:"token comment"},"//..."),e("\n "),a("span",{class:"token punctuation"},"}"),e("\n"),a("span",{class:"token punctuation"},"}"),e("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br")])],-1),H=a("h2",{id:"programming-paradigms"},[a("a",{class:"header-anchor",href:"#programming-paradigms","aria-hidden":"true"},"#"),e(" Programming Paradigms")],-1),N=a("p",null,"Each programming language realizes one or more paradigms. Each paradigm is defined by a set of programming concepts.",-1),M=a("h3",{id:"taxonomy-of-paradigms"},[a("a",{class:"header-anchor",href:"#taxonomy-of-paradigms","aria-hidden":"true"},"#"),e(" Taxonomy of Paradigms")],-1),B=a("p",null,[a("img",{src:"/awesome-notes/assets/ProgrammingParadigms.04c60b43.jpg",alt:"Taxonomy of Programming Paradigms"})],-1),O=a("p",null,"Nondeterminism is important for real-world interaction. Named state is important for modularity.",-1),X=a("h4",{id:"observable-nondeterminism"},[a("a",{class:"header-anchor",href:"#observable-nondeterminism","aria-hidden":"true"},"#"),e(" Observable Nondeterminism")],-1),E=a("p",null,[e("During the execution, this choice is made by a part of the run-time system called the scheduler. The nondeterminism is observable if a user can see "),a("strong",null,"different results"),e(" from executions that start at the "),a("strong",null,"same internal configuration"),e(".")],-1),F=a("ul",null,[a("li",null,"concurrency or race condition (timing effects)"),a("li",null,"shared-state concurrency or message-passing concurrency"),a("li",null,"concurrent programming language e.g Java")],-1),V=a("h4",{id:"named-state"},[a("a",{class:"header-anchor",href:"#named-state","aria-hidden":"true"},"#"),e(" Named State")],-1),G=a("p",null,"State is the ability to remember information (a sequence of values in time). Distinguish three axes of expressiveness, depending on whether the state is:",-1),z=a("ul",null,[a("li",null,"unnamed or named"),a("li",null,"deterministic or nondeterministic"),a("li",null,"sequential or concurrent"),a("li",null,"named, nondeterministic and concurrent paradigm as the most expressiveness of state"),a("li",null,"named state for updatable memory (mutable state) and modularity")],-1),J=a("p",null,"The least expressive combination is functional programming (threaded state: unnamed, deterministic, sequential). Adding concurrency gives declarative concurrent programming (synchronous cells: unnamed, deterministic, concurrent). Adding nondeterministic choice gives concurrent logic programming (stream mergers: unnamed, nondeterministic, concurrent). Adding ports or cells, gives message passing or shared state (named, nondeterministic, concurrent).",-1),U=a("h3",{id:"functional-programming"},[a("a",{class:"header-anchor",href:"#functional-programming","aria-hidden":"true"},"#"),e(" Functional Programming")],-1),K=a("p",null,[e("Based on the concept of first-class function or closure, which makes it equivalent to the λ-calculus which is "),a("code",null,"Turing complete"),e(".")],-1),Q=a("h2",{id:"code-review"},[a("a",{class:"header-anchor",href:"#code-review","aria-hidden":"true"},"#"),e(" Code Review")],-1),W=a("h3",{id:"code-review-basis"},[a("a",{class:"header-anchor",href:"#code-review-basis","aria-hidden":"true"},"#"),e(" Code Review Basis")],-1),Y=a("ul",null,[a("li",null,[a("p",null,"逻辑正确")]),a("li",null,[a("p",null,"简单易懂")]),a("li",null,[a("p",null,"编程规范(linter)")]),a("li",null,[a("p",null,"模块化")]),a("li",null,[a("p",null,"多余或重复 代码/日志/测试")]),a("li",null,[a("p",null,"重复轮子(可被基本库替换)")]),a("li",null,[a("p",null,"无必要的全局变量")]),a("li",null,[a("p",null,"代码误注释")]),a("li",null,[a("p",null,"死循环(边界检查)")])],-1),Z=a("h3",{id:"security-review"},[a("a",{class:"header-anchor",href:"#security-review","aria-hidden":"true"},"#"),e(" Security Review")],-1),$=a("ul",null,[a("li",null,"所有的数据输入是否都进行了检查(检测正确的类型,长度,格式和范围)并且进行了编码?"),a("li",null,"在哪里使用了第三方工具,返回的错误是否被捕获?"),a("li",null,"输出的值是否进行了检查并且编码?"),a("li",null,"无效的参数值是否能够处理?")],-1),_=a("h3",{id:"documents-review"},[a("a",{class:"header-anchor",href:"#documents-review","aria-hidden":"true"},"#"),e(" Documents Review")],-1),nn=a("h3",{id:"comments-review"},[a("a",{class:"header-anchor",href:"#comments-review","aria-hidden":"true"},"#"),e(" Comments Review")],-1),sn=a("ul",null,[a("li",null,"数据结构"),a("li",null,"计量单位"),a("li",null,"描述代码意图"),a("li",null,"函数块"),a("li",null,"非常规行为/边界检查"),a("li",null,"TODO 标记"),a("li",null,"FIXME 标记"),a("li",null,"第三方库文档")],-1),an=a("h3",{id:"test-review"},[a("a",{class:"header-anchor",href:"#test-review","aria-hidden":"true"},"#"),e(" Test Review")],-1),en=a("ul",null,[a("li",null,"代码是否可以测试?比如,不要添加太多的或是隐藏的依赖关系,不能够初始化对象,测试框架可以使用方法等。"),a("li",null,"是否存在测试,它们是否可以被理解?比如,至少达到你满意的代码覆盖(code coverage)。"),a("li",null,"单元测试是否真正的测试了代码是否可以完成预期的功能?"),a("li",null,"是否检查了数组的“越界“错误?"),a("li",null,"是否有可以被已经存在的 API 所替代的测")],-1);c.render=function(a,e,t,c,tn,cn){return n(),s("div",null,[l,o,p,u,i,r,k,m,b,d,g,w,h,f,y,v,S,C,A,P,q,R,I,x,L,D,T,j,H,N,M,B,O,X,E,F,V,G,z,J,U,K,Q,W,Y,Z,$,_,nn,sn,an,en])};export default c;export{t as __pageData}; diff --git a/assets/programming_devops_designPatternsBasicNotes.md.0d5c71a8.js b/assets/programming_devops_designPatternsBasicNotes.md.0d5c71a8.js new file mode 100644 index 00000000000..32c8b5911ba --- /dev/null +++ b/assets/programming_devops_designPatternsBasicNotes.md.0d5c71a8.js @@ -0,0 +1 @@ +import{o as n,c as s,b as a,d as t}from"./app.6dd2a1b7.js";const e='{"title":"Design Patterns Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Basic Patterns","slug":"basic-patterns"},{"level":3,"title":"SOLID Principles","slug":"solid-principles"},{"level":3,"title":"Literal Pattern","slug":"literal-pattern"},{"level":3,"title":"Closure and IIFE","slug":"closure-and-iife"},{"level":3,"title":"Check Pattern","slug":"check-pattern"},{"level":3,"title":"函数(function)","slug":"函数-function"},{"level":3,"title":"解耦","slug":"解耦"},{"level":3,"title":"Env and Config","slug":"env-and-config"},{"level":3,"title":"Stand Library Idioms","slug":"stand-library-idioms"},{"level":3,"title":"Other","slug":"other"},{"level":2,"title":"Modular Patterns","slug":"modular-patterns"},{"level":3,"title":"Object Literal","slug":"object-literal"},{"level":3,"title":"IIFE Pattern","slug":"iife-pattern"},{"level":3,"title":"UMD Pattern","slug":"umd-pattern"},{"level":2,"title":"Common Design Patterns","slug":"common-design-patterns"},{"level":3,"title":"Classification","slug":"classification"},{"level":3,"title":"Prototype","slug":"prototype"},{"level":3,"title":"Bridge","slug":"bridge"},{"level":3,"title":"Composite","slug":"composite"},{"level":3,"title":"Strategy","slug":"strategy"},{"level":3,"title":"State","slug":"state"},{"level":3,"title":"Iterator","slug":"iterator"},{"level":3,"title":"IOC and DI","slug":"ioc-and-di"},{"level":3,"title":"Class Pattern","slug":"class-pattern"},{"level":3,"title":"Mix-In Pattern","slug":"mix-in-pattern"},{"level":3,"title":"Singleton Pattern","slug":"singleton-pattern"},{"level":3,"title":"Abstract Factory","slug":"abstract-factory"},{"level":3,"title":"Factory Method","slug":"factory-method"},{"level":3,"title":"Adapter Pattern","slug":"adapter-pattern"},{"level":3,"title":"Decorator Pattern","slug":"decorator-pattern"},{"level":3,"title":"Facade Pattern","slug":"facade-pattern"},{"level":3,"title":"Flyweight Pattern","slug":"flyweight-pattern"},{"level":3,"title":"Proxy Pattern","slug":"proxy-pattern"},{"level":3,"title":"Command Pattern","slug":"command-pattern"},{"level":3,"title":"Mediator Pattern","slug":"mediator-pattern"},{"level":3,"title":"Observer Pattern","slug":"observer-pattern"},{"level":3,"title":"Pub-Sub Pattern","slug":"pub-sub-pattern"},{"level":2,"title":"MVC Pattern","slug":"mvc-pattern"},{"level":2,"title":"jQuery Pattern","slug":"jquery-pattern"},{"level":3,"title":"Plugin Pattern","slug":"plugin-pattern"},{"level":2,"title":"Scalability Design","slug":"scalability-design"},{"level":2,"title":"Domain Driven Design","slug":"domain-driven-design"},{"level":3,"title":"Interface Layer","slug":"interface-layer"},{"level":3,"title":"Application Layer","slug":"application-layer"},{"level":3,"title":"Domain Layer","slug":"domain-layer"},{"level":3,"title":"Infrastructure Layer","slug":"infrastructure-layer"},{"level":3,"title":"DDD Layout","slug":"ddd-layout"},{"level":2,"title":"高并发系统设计","slug":"高并发系统设计"},{"level":3,"title":"Concurrent Code Layer","slug":"concurrent-code-layer"},{"level":3,"title":"Concurrent DataBase Layer","slug":"concurrent-database-layer"},{"level":3,"title":"Concurrent Architecture Layer","slug":"concurrent-architecture-layer"},{"level":2,"title":"高可用系统设计","slug":"高可用系统设计"},{"level":3,"title":"Resource Isolation","slug":"resource-isolation"},{"level":3,"title":"Load Balance Design","slug":"load-balance-design"},{"level":3,"title":"Idempotence Design","slug":"idempotence-design"},{"level":3,"title":"CAP Theory","slug":"cap-theory"},{"level":3,"title":"服务熔断","slug":"服务熔断"},{"level":3,"title":"服务限流","slug":"服务限流"},{"level":3,"title":"服务降级","slug":"服务降级"},{"level":2,"title":"Reference","slug":"reference"}],"relativePath":"programming/devops/designPatternsBasicNotes.md","lastUpdated":1627735972000}',o={},c=a("h1",{id:"design-patterns-basic-notes"},[a("a",{class:"header-anchor",href:"#design-patterns-basic-notes","aria-hidden":"true"},"#"),t(" Design Patterns Basic Notes")],-1),p=a("p",null,[a("div",{class:"table-of-contents"},[a("ul",null,[a("li",null,[a("a",{href:"#design-patterns-basic-notes"},"Design Patterns Basic Notes"),a("ul",null,[a("li",null,[a("a",{href:"#basic-patterns"},"Basic Patterns")]),a("li",null,[a("a",{href:"#modular-patterns"},"Modular Patterns")]),a("li",null,[a("a",{href:"#common-design-patterns"},"Common Design Patterns")]),a("li",null,[a("a",{href:"#mvc-pattern"},"MVC Pattern")]),a("li",null,[a("a",{href:"#jquery-pattern"},"jQuery Pattern")]),a("li",null,[a("a",{href:"#scalability-design"},"Scalability Design")]),a("li",null,[a("a",{href:"#domain-driven-design"},"Domain Driven Design")]),a("li",null,[a("a",{href:"#高并发系统设计"},"高并发系统设计")]),a("li",null,[a("a",{href:"#高可用系统设计"},"高可用系统设计")]),a("li",null,[a("a",{href:"#reference"},"Reference")])])])])])],-1),l=a("h2",{id:"basic-patterns"},[a("a",{class:"header-anchor",href:"#basic-patterns","aria-hidden":"true"},"#"),t(" Basic Patterns")],-1),u=a("h3",{id:"solid-principles"},[a("a",{class:"header-anchor",href:"#solid-principles","aria-hidden":"true"},"#"),t(" SOLID Principles")],-1),i=a("ul",null,[a("li",null,"Single Responsibility Principle 单一功能原则"),a("li",null,"Open-closed Principle 开闭原则"),a("li",null,"Liskov Substitution Principle 里氏替换原则"),a("li",null,"Interface Segregation Principle 接口隔离原则"),a("li",null,"Dependency Inversion Principle 依赖反转原则")],-1),r=a("blockquote",null,[a("p",null,"SOLID Principles")],-1),k=a("ul",null,[a("li",null,"单一职责是所有设计原则的基础"),a("li",null,"开闭原则是设计的终极目标"),a("li",null,"里氏替换原则强调的是子类替换父类后程序运行时的正确性, 它用来帮助实现开闭原则"),a("li",null,"接口隔离原则用来帮助实现里氏替换原则, 同时它也体现了单一职责"),a("li",null,"依赖倒置原则是过程式设计与面向对象设计的分水岭, 同时它也被用来指导接口隔离原则")],-1),b=a("h4",{id:"single-responsibility-principle"},[a("a",{class:"header-anchor",href:"#single-responsibility-principle","aria-hidden":"true"},"#"),t(" Single Responsibility Principle")],-1),m=a("p",null,"Too much functionality is in one class and you modify a piece of it, it can be difficult to understand how that will affect other dependent modules.",-1),d=a("h4",{id:"open-closed-principle"},[a("a",{class:"header-anchor",href:"#open-closed-principle","aria-hidden":"true"},"#"),t(" Open-Closed Principle")],-1),y=a("p",null,"Allow users to add new functionalities without changing existing code, open for extension, close for modification.",-1),f=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),t(),a("span",{class:"token class-name"},"Coder"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"constructor"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("fullName"),a("span",{class:"token punctuation"},","),t(" language"),a("span",{class:"token punctuation"},","),t(" hobby"),a("span",{class:"token punctuation"},","),t(" education"),a("span",{class:"token punctuation"},","),t(" workplace"),a("span",{class:"token punctuation"},","),t(" position")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("fullName "),a("span",{class:"token operator"},"="),t(" fullName"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("language "),a("span",{class:"token operator"},"="),t(" language"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("hobby "),a("span",{class:"token operator"},"="),t(" hobby"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("education "),a("span",{class:"token operator"},"="),t(" education"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("workplace "),a("span",{class:"token operator"},"="),t(" workplace"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("position "),a("span",{class:"token operator"},"="),t(" position"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token comment"},"// BAD: filter by any other new property have to change CodeFilter's code."),t("\n"),a("span",{class:"token keyword"},"class"),t(),a("span",{class:"token class-name"},"CoderFilter"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"filterByName"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("coders"),a("span",{class:"token punctuation"},","),t(" fullName")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" coders"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"filter"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"coder"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"=>"),t(" coder"),a("span",{class:"token punctuation"},"."),t("fullName "),a("span",{class:"token operator"},"==="),t(" fullName"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token function"},"filterByLang"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("coders"),a("span",{class:"token punctuation"},","),t(" language")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" coders"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"filter"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"coder"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"=>"),t(" coder"),a("span",{class:"token punctuation"},"."),t("language "),a("span",{class:"token operator"},"==="),t(" language"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token function"},"filterByHobby"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("coders"),a("span",{class:"token punctuation"},","),t(" hobby")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" coders"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"filter"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"coder"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"=>"),t(" coder"),a("span",{class:"token punctuation"},"."),t("hobby "),a("span",{class:"token operator"},"==="),t(" hobby"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token comment"},"// GOOD"),t("\n"),a("span",{class:"token keyword"},"class"),t(),a("span",{class:"token class-name"},"CoderFilter"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"filterByProp"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("array"),a("span",{class:"token punctuation"},","),t(" propName"),a("span",{class:"token punctuation"},","),t(" value")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"=>"),t("\n array"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"filter"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"element"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"=>"),t(" element"),a("span",{class:"token punctuation"},"["),t("propName"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"==="),t(" value"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br")])],-1),h=a("h4",{id:"liskov-substitution-principle"},[a("a",{class:"header-anchor",href:"#liskov-substitution-principle","aria-hidden":"true"},"#"),t(" Liskov Substitution Principle")],-1),w=a("p",null,"Objects of ParentType can be replaced with objects of SubType without altering. Altering shows that SubType should not be subtype of ParentType (break Open Closed Principle), you should re-design ParentType and SubType.",-1),g=a("h4",{id:"interface-segregation-principle"},[a("a",{class:"header-anchor",href:"#interface-segregation-principle","aria-hidden":"true"},"#"),t(" Interface Segregation Principle")],-1),v=a("p",null,"Clients should not be forced to depend upon interfaces that they do not use.",-1),P=a("h4",{id:"dependency-inversion-principle"},[a("a",{class:"header-anchor",href:"#dependency-inversion-principle","aria-hidden":"true"},"#"),t(" Dependency Inversion Principle")],-1),C=a("ul",null,[a("li",null,"High-level modules should not depend on low-level modules. Both should depend on abstractions."),a("li",null,"Abstractions should not depend upon details. Details should depend on abstractions."),a("li",null,[t("Pros: "),a("ul",null,[a("li",null,"Loosely coupled modules."),a("li",null,"Better reusability."),a("li",null,"Better testability.")])])],-1),S=a("h3",{id:"literal-pattern"},[a("a",{class:"header-anchor",href:"#literal-pattern","aria-hidden":"true"},"#"),t(" Literal Pattern")],-1),j=a("ul",null,[a("li",null,"不要使用 new Boolean()/new Number()/new String()"),a("li",null,"避免使用 new Object()/new Array()")],-1),M=a("h3",{id:"closure-and-iife"},[a("a",{class:"header-anchor",href:"#closure-and-iife","aria-hidden":"true"},"#"),t(" Closure and IIFE")],-1),x=a("h3",{id:"check-pattern"},[a("a",{class:"header-anchor",href:"#check-pattern","aria-hidden":"true"},"#"),t(" Check Pattern")],-1),D=a("ul",null,[a("li",null,[a("code",null,"O || {}"),t(),a("code",null,"O || (O = {})")]),a("li",null,[a("code",null,"if (O && O.property)")]),a("li",null,[a("code",null,'if (typeof v === " ")')]),a("li",null,[a("code",null,"toString. apply(var)")])],-1),A=a("h3",{id:"函数-function"},[a("a",{class:"header-anchor",href:"#函数-function","aria-hidden":"true"},"#"),t(" 函数(function)")],-1),I=a("h4",{id:"参数"},[a("a",{class:"header-anchor",href:"#参数","aria-hidden":"true"},"#"),t(" 参数")],-1),N=a("ul",null,[a("li",null,"函数不应依赖于全局变量,实现与执行全局环境的的解耦"),a("li",null,"全局变量应以函数参数/依赖的形式,注入函数内部")],-1),O=a("h3",{id:"解耦"},[a("a",{class:"header-anchor",href:"#解耦","aria-hidden":"true"},"#"),t(" 解耦")],-1),L=a("h4",{id:"事件处理与-ui-逻辑"},[a("a",{class:"header-anchor",href:"#事件处理与-ui-逻辑","aria-hidden":"true"},"#"),t(" 事件处理与 UI 逻辑")],-1),$=a("ul",null,[a("li",null,"事件处理函数与应用逻辑函数分开成单独函数,提高代码重用率"),a("li",null,"应用逻辑函数不依赖于 event 对象,其属性值作为参数传入,易于解耦与测试")],-1),_=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"const"),t(" MyApp "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),t("\n\n "),a("span",{class:"token comment"},"// 事件处理函数"),t("\n "),a("span",{class:"token function-variable function"},"handleClick"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"event"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n\n "),a("span",{class:"token comment"},"/* 将事件的属性作为参数,传递给应用逻辑函数\n * 使得应用逻辑函数不依赖于 event 对象,易于解耦与测试\n */"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"showPopup"),a("span",{class:"token punctuation"},"("),t("event"),a("span",{class:"token punctuation"},"."),t("clientX"),a("span",{class:"token punctuation"},","),t(" event"),a("span",{class:"token punctuation"},"."),t("clientY"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// 应用逻辑函数"),t("\n "),a("span",{class:"token function-variable function"},"showPopup"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("x"),a("span",{class:"token punctuation"},","),t(" y")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"const"),t(" popup "),a("span",{class:"token operator"},"="),t(" document"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getElementById"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'popup'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n popup"),a("span",{class:"token punctuation"},"."),t("style"),a("span",{class:"token punctuation"},"."),t("left "),a("span",{class:"token operator"},"="),t(" x "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token string"},"'px'"),a("span",{class:"token punctuation"},";"),t("\n popup"),a("span",{class:"token punctuation"},"."),t("style"),a("span",{class:"token punctuation"},"."),t("top "),a("span",{class:"token operator"},"="),t(" y "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token string"},"'px'"),a("span",{class:"token punctuation"},";"),t("\n popup"),a("span",{class:"token punctuation"},"."),t("className "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token string"},"'reveal'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br")])],-1),E=a("h3",{id:"env-and-config"},[a("a",{class:"header-anchor",href:"#env-and-config","aria-hidden":"true"},"#"),t(" Env and Config")],-1),B=a("p",null,"配置文件以 .env/JS(Object)/JSON/JSONP/XML/YML 格式单独存放,方便读取",-1),F=a("h3",{id:"stand-library-idioms"},[a("a",{class:"header-anchor",href:"#stand-library-idioms","aria-hidden":"true"},"#"),t(" Stand Library Idioms")],-1),T=a("ul",null,[a("li",null,[t("use "),a("code",null,"Number.isNaN"),t(" not "),a("code",null,"isNaN")]),a("li",null,[t("use "),a("code",null,"Number.isFinite"),t(" not "),a("code",null,"isFinite")])],-1),V=a("h3",{id:"other"},[a("a",{class:"header-anchor",href:"#other","aria-hidden":"true"},"#"),t(" Other")],-1),q=a("p",null,"!!result 转化成 Boolean",-1),R=a("h2",{id:"modular-patterns"},[a("a",{class:"header-anchor",href:"#modular-patterns","aria-hidden":"true"},"#"),t(" Modular Patterns")],-1),U=a("h3",{id:"object-literal"},[a("a",{class:"header-anchor",href:"#object-literal","aria-hidden":"true"},"#"),t(" Object Literal")],-1),H=a("p",null,"通过对象字面量创建命名空间",-1),z=a("div",{class:"language-javascript line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token constant"},"APP"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"namespace"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"namespaceString"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" parts "),a("span",{class:"token operator"},"="),t(" namespaceString"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"split"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'.'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),t("\n parent "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token constant"},"APP"),a("span",{class:"token punctuation"},","),t("\n i"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token comment"},"// strip redundant leading global"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("parts"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'APP'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// remove leading global"),t("\n parts "),a("span",{class:"token operator"},"="),t(" parts"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"slice"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),t("i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(" parts"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"+="),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// create a property if it doesn't exist"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"typeof"),t(" parent"),a("span",{class:"token punctuation"},"["),t("parts"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'undefined'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n parent"),a("span",{class:"token punctuation"},"["),t("parts"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token comment"},"//关键: 向内嵌套"),t("\n parent "),a("span",{class:"token operator"},"="),t(" parent"),a("span",{class:"token punctuation"},"["),t("parts"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token comment"},"// 返回最内层模块"),t("\n "),a("span",{class:"token keyword"},"return"),t(" parent"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br")])],-1),G=a("div",{class:"language-javascript line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// assign returned value to a local var"),t("\n"),a("span",{class:"token keyword"},"var"),t(" module2 "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token constant"},"APP"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"namespace"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'APP.modules.module2'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\nmodule2 "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token constant"},"APP"),a("span",{class:"token punctuation"},"."),t("modules"),a("span",{class:"token punctuation"},"."),t("module2"),a("span",{class:"token punctuation"},";"),t(),a("span",{class:"token comment"},"// true"),t("\n"),a("span",{class:"token comment"},"// skip initial `APP`"),t("\n"),a("span",{class:"token constant"},"APP"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"namespace"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'modules.module51'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token comment"},"// long namespace"),t("\n"),a("span",{class:"token constant"},"APP"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"namespace"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'once.upon.a.time.there.was.this.long.nested.property'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),W=a("h3",{id:"iife-pattern"},[a("a",{class:"header-anchor",href:"#iife-pattern","aria-hidden":"true"},"#"),t(" IIFE Pattern")],-1),Q=a("p",null,"立即函数模式, 通过调用立即函数,返回一个对象,暴露(exposed to public)公共接口(特权/公共方法):",-1),X=a("ul",null,[a("li",null,"闭包: 定义私有变量与特权方法"),a("li",null,"返回对象: 即使通过外部代码改变返回对象的接口,也不会影响原接口")],-1),J=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"var"),t(" obj "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// private member"),t("\n "),a("span",{class:"token keyword"},"var"),t(" name "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token string"},'"tazimi"'),a("span",{class:"token punctuation"},","),t("\n\n "),a("span",{class:"token comment"},"// private method"),t("\n "),a("span",{class:"token comment"},"// excluded in return object"),t("\n\n "),a("span",{class:"token comment"},"// privileged method"),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"getName"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" name"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"setName"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"n"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"typeof"),t(" n "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'string'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n name "),a("span",{class:"token operator"},"="),t(" n"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n\n "),a("span",{class:"token comment"},"// public method"),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"logName"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n console"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),t("name"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// 闭包"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// 公共接口: 特权/公共方法"),t("\n\n "),a("span",{class:"token comment"},"// 特权方法"),t("\n getName"),a("span",{class:"token operator"},":"),t(" getName"),a("span",{class:"token punctuation"},","),t("\n setName"),a("span",{class:"token operator"},":"),t(" setName"),a("span",{class:"token punctuation"},","),t("\n\n "),a("span",{class:"token comment"},"// 公共方法"),t("\n log"),a("span",{class:"token operator"},":"),t(" logName"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br")])],-1),K=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"var"),t(" App "),a("span",{class:"token operator"},"="),t(" App "),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\nApp"),a("span",{class:"token punctuation"},"."),t("utils "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" val "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"getValue"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" val"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"setValue"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"newVal"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n val "),a("span",{class:"token operator"},"="),t(" newVal"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// also introduce a new sub-namespace"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("tools "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"apply"),a("span",{class:"token punctuation"},"("),t("App"),a("span",{class:"token punctuation"},"."),t("utils"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// inject new behavior into the tools namespace"),t("\n"),a("span",{class:"token comment"},"// which we defined via the utilities module"),t("\n\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"diagnose"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token string"},"'diagnosis'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"apply"),a("span",{class:"token punctuation"},"("),t("App"),a("span",{class:"token punctuation"},"."),t("utils"),a("span",{class:"token punctuation"},"."),t("tools"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br")])],-1),Y=a("ul",null,[a("li",null,"jQuery Plugin Pattern: 通过给立即函数传参,注入全局变量/其他依赖")],-1),Z=a("h3",{id:"umd-pattern"},[a("a",{class:"header-anchor",href:"#umd-pattern","aria-hidden":"true"},"#"),t(" UMD Pattern")],-1),nn=a("p",null,"Universal Module Definition:",-1),sn=a("ul",null,[a("li",null,"先判断是否支持 Node.js 的模块(exports),存在则使用 Node.js 模块模式"),a("li",null,"再判断是否支持 AMD(define),存在则使用 AMD 方式加载模块")],-1),an=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("window"),a("span",{class:"token punctuation"},","),t(" factory")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"typeof"),t(" exports "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'object'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n module"),a("span",{class:"token punctuation"},"."),t("exports "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"factory"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"typeof"),t(" define "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'function'"),t(),a("span",{class:"token operator"},"&&"),t(" define"),a("span",{class:"token punctuation"},"."),t("amd"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"define"),a("span",{class:"token punctuation"},"("),t("factory"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n window"),a("span",{class:"token punctuation"},"."),t("eventUtil "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"factory"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"//module ..."),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),tn=a("h2",{id:"common-design-patterns"},[a("a",{class:"header-anchor",href:"#common-design-patterns","aria-hidden":"true"},"#"),t(" Common Design Patterns")],-1),en=a("p",null,[a("img",{src:"/awesome-notes/assets/DesignPatterns.df4b7baf.png",alt:"Common Design Patterns"})],-1),on=a("h3",{id:"classification"},[a("a",{class:"header-anchor",href:"#classification","aria-hidden":"true"},"#"),t(" Classification")],-1),cn=a("h4",{id:"creation-patterns"},[a("a",{class:"header-anchor",href:"#creation-patterns","aria-hidden":"true"},"#"),t(" Creation Patterns")],-1),pn=a("ul",null,[a("li",null,"Factory Method(工厂方法) | 通过将数据和事件接口化来构建若干个子类。"),a("li",null,"Abstract Factory(抽象工厂) | 建立若干族类的一个实例,这个实例不需要具体类的细节信息。(抽象类)"),a("li",null,"Builder(建造者) | 将对象的构建方法和其表现形式分离开来,总是构建相同类型的对象。"),a("li",null,"Prototype(原型) | 一个完全初始化的实例,用于拷贝或者克隆。"),a("li",null,"Singleton(单例) | 一个类只有唯一的一个实例,这个实例在整个程序中有一个全局的访问点。")],-1),ln=a("h4",{id:"structural-patterns"},[a("a",{class:"header-anchor",href:"#structural-patterns","aria-hidden":"true"},"#"),t(" Structural Patterns")],-1),un=a("ul",null,[a("li",null,"Adapter(适配器) : 将不同类的接口进行匹配,调整,这样尽管内部接口不兼容但是不同的类还是可以协同工作的。"),a("li",null,"Bridge(桥接模式) : 将对象的接口从其实现中分离出来,这样对象的实现和接口可以独立的变化。"),a("li",null,"Composite(组合模式) : 通过将简单可组合的对象组合起来,构成一个完整的对象,这个对象的能力将会超过这些组成部分的能力的总和,即会有新的能力产生。"),a("li",null,"Decorator(装饰器) : 动态给对象增加一些可替换的处理流程。"),a("li",null,"Facade(外观模式) : 一个类隐藏了内部子系统的复杂度,只暴露出一些简单的接口。"),a("li",null,"Flyweight(享元模式) : 一个细粒度对象,用于将包含在其它地方的信息 在不同对象之间高效地共享。"),a("li",null,"Proxy(代理模式) : 一个充当占位符的对象用来代表一个真实的对象。")],-1),rn=a("h4",{id:"behavioral-patterns"},[a("a",{class:"header-anchor",href:"#behavioral-patterns","aria-hidden":"true"},"#"),t(" Behavioral Patterns")],-1),kn=a("ul",null,[a("li",null,"Interpreter(解释器) : 将语言元素包含在一个应用中的一种方式,用于匹配目标语言的语法。"),a("li",null,"Template Method(模板方法) : 在一个方法中为某个算法建立一层外壳,将算法的具体步骤交付给子类去做。"),a("li",null,"Chain of Responsibility(响应链) : 一种将请求在一串对象中传递的方式,寻找可以处理这个请求的对象。"),a("li",null,"Command(命令) : 封装命令请求为一个对象,从而使记录日志,队列缓存请求,未处理请求进行错误处理 这些功能称为可能。"),a("li",null,"Iterator(迭代器) : 在不需要直到集合内部工作原理的情况下,顺序访问一个集合里面的元素。"),a("li",null,"Mediator(中介者模式) : 在类之间定义简化的通信方式,用于避免类之间显式的持有彼此的引用。"),a("li",null,"Observer(观察者模式) : 用于将变化通知给多个类的方式,可以保证类之间的一致性。"),a("li",null,"State(状态) : 当对象状态改变时,改变对象的行为。"),a("li",null,"Strategy(策略) : 将算法封装到类中,将选择和实现分离开来。"),a("li",null,"Visitor(访问者) : 为类增加新的操作而不改变类本身。")],-1),bn=a("h3",{id:"prototype"},[a("a",{class:"header-anchor",href:"#prototype","aria-hidden":"true"},"#"),t(" Prototype")],-1),mn=a("p",null,"关键方法 clone()",-1),dn=a("h3",{id:"bridge"},[a("a",{class:"header-anchor",href:"#bridge","aria-hidden":"true"},"#"),t(" Bridge")],-1),yn=a("p",null,"分离抽象和实现/分离对象的两种不同属性",-1),fn=a("p",null,"e.g 从 2 个不同维度上扩展对象",-1),hn=a("h3",{id:"composite"},[a("a",{class:"header-anchor",href:"#composite","aria-hidden":"true"},"#"),t(" Composite")],-1),wn=a("p",null,"树形结构:",-1),gn=a("ul",null,[a("li",null,[t("根结点 "),a("ul",null,[a("li",null,"Component 抽象对象/接口 采用最大宽接口,定义内点和叶点的操作"),a("li",null,"将内点特有的操作集设为缺省操作集(空实现)")])]),a("li",null,[t("内点 "),a("ul",null,[a("li",null,"持有父结点和子节点的引用(可使用 Flyweight 模式实现共享)"),a("li",null,"操作集:内点操作集(可添加/删除组件)")])]),a("li",null,[t("叶点 "),a("ul",null,[a("li",null,"持有父结点引用"),a("li",null,"操作集:叶点操作集(不可添加/删除组件)")])])],-1),vn=a("h3",{id:"strategy"},[a("a",{class:"header-anchor",href:"#strategy","aria-hidden":"true"},"#"),t(" Strategy")],-1),Pn=a("p",null,"改变对象的内核/算法, 一个 Strategy 对象封装一个算法",-1),Cn=a("h3",{id:"state"},[a("a",{class:"header-anchor",href:"#state","aria-hidden":"true"},"#"),t(" State")],-1),Sn=a("p",null,"一个 State 对象封装一个与状态相关的行为",-1),jn=a("h3",{id:"iterator"},[a("a",{class:"header-anchor",href:"#iterator","aria-hidden":"true"},"#"),t(" Iterator")],-1),Mn=a("p",null,"一个 Iterator 对象封装访问和遍历一个聚集对象中的各个构件的方法",-1),xn=a("h3",{id:"ioc-and-di"},[a("a",{class:"header-anchor",href:"#ioc-and-di","aria-hidden":"true"},"#"),t(" IOC and DI")],-1),Dn=a("ul",null,[a("li",null,"IOC (inversion of control) 控制反转模式;控制反转是将组件间的依赖关系从程序内部提到外部来管理"),a("li",null,"DI (dependency injection) 依赖注入模式;依赖注入是指将组件的依赖通过外部以参数或其他形式注入")],-1),An=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),t(),a("span",{class:"token class-name"},"DbMysql"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"public"),t(" function "),a("span",{class:"token function"},"query"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token keyword"},"class"),t(),a("span",{class:"token class-name"},"Controller"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"public"),t(" $db"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"public"),t(" function "),a("span",{class:"token function"},"__construct"),a("span",{class:"token punctuation"},"("),t("$dbMysql"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n $"),a("span",{class:"token keyword"},"this"),a("span",{class:"token operator"},"->"),t("db "),a("span",{class:"token operator"},"="),t(" $dbMysql"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"public"),t(" function "),a("span",{class:"token function"},"action"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),t("\n $"),a("span",{class:"token keyword"},"this"),a("span",{class:"token operator"},"->"),t("db"),a("span",{class:"token operator"},"->"),a("span",{class:"token function"},"query"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n$db "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"DbMysql"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n$c "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Controller"),a("span",{class:"token punctuation"},"("),t("$db"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n$c"),a("span",{class:"token operator"},"->"),a("span",{class:"token function"},"action"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br")])],-1),In=a("p",null,"With IOC container:",-1),Nn=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),t(),a("span",{class:"token class-name"},"DbMysql"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"public"),t(" function "),a("span",{class:"token function"},"__construct"),a("span",{class:"token punctuation"},"("),t("$host"),a("span",{class:"token punctuation"},","),t(" $name"),a("span",{class:"token punctuation"},","),t(" $pwd"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// do something"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"public"),t(" function "),a("span",{class:"token function"},"query"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n echo __METHOD__ "),a("span",{class:"token punctuation"},"."),t(" PHP_EOL"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token keyword"},"class"),t(),a("span",{class:"token class-name"},"DbRedis"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"public"),t(" function "),a("span",{class:"token function"},"__construct"),a("span",{class:"token punctuation"},"("),t("$host"),a("span",{class:"token punctuation"},","),t(" $name"),a("span",{class:"token punctuation"},","),t(" $pwd"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// do something"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"public"),t(" function "),a("span",{class:"token function"},"set"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n echo __METHOD__ "),a("span",{class:"token punctuation"},"."),t(" PHP_EOL"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token keyword"},"class"),t(" controller "),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"public"),t(" $mysql"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"public"),t(" $redis"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"public"),t(" function "),a("span",{class:"token function"},"__construct"),a("span",{class:"token punctuation"},"("),t("$mysql"),a("span",{class:"token punctuation"},","),t(" $redis"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n $"),a("span",{class:"token keyword"},"this"),a("span",{class:"token operator"},"->"),t("mysql "),a("span",{class:"token operator"},"="),t(" $mysql"),a("span",{class:"token punctuation"},";"),t("\n $"),a("span",{class:"token keyword"},"this"),a("span",{class:"token operator"},"->"),t("redis "),a("span",{class:"token operator"},"="),t(" $redis"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"public"),t(" function "),a("span",{class:"token function"},"action"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n $"),a("span",{class:"token keyword"},"this"),a("span",{class:"token operator"},"->"),t("mysql"),a("span",{class:"token operator"},"->"),a("span",{class:"token function"},"query"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n $"),a("span",{class:"token keyword"},"this"),a("span",{class:"token operator"},"->"),t("redis"),a("span",{class:"token operator"},"->"),a("span",{class:"token function"},"set"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n\n"),a("span",{class:"token keyword"},"class"),t(),a("span",{class:"token class-name"},"Container"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"public"),t(" $bindings "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"public"),t(" function "),a("span",{class:"token function"},"bind"),a("span",{class:"token punctuation"},"("),t("$key"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token class-name"},"Closure"),t(" $value"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n $"),a("span",{class:"token keyword"},"this"),a("span",{class:"token operator"},"->"),t("bindings"),a("span",{class:"token punctuation"},"["),t("$key"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" $value"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"public"),t(" function "),a("span",{class:"token function"},"make"),a("span",{class:"token punctuation"},"("),t("$key"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n $"),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token operator"},"="),t(" $"),a("span",{class:"token keyword"},"this"),a("span",{class:"token operator"},"->"),t("bindings"),a("span",{class:"token punctuation"},"["),t("$key"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(" $"),a("span",{class:"token keyword"},"new"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n$app "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Container"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n$app"),a("span",{class:"token operator"},"->"),a("span",{class:"token function"},"bind"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'mysql'"),a("span",{class:"token punctuation"},","),t(" function "),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t(),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"DbMysql"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'host'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'name'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'pwd'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t(),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n$app"),a("span",{class:"token operator"},"->"),a("span",{class:"token function"},"bind"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'redis'"),a("span",{class:"token punctuation"},","),t(" function "),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t(),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"DbRedis"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'host'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'name'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'pwd'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t(),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n$app"),a("span",{class:"token operator"},"->"),a("span",{class:"token function"},"bind"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'controller'"),a("span",{class:"token punctuation"},","),t(" function "),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(" use "),a("span",{class:"token punctuation"},"("),t("$app"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Controller"),a("span",{class:"token punctuation"},"("),t("$app"),a("span",{class:"token operator"},"->"),a("span",{class:"token function"},"make"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'mysql'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),t(" $app"),a("span",{class:"token operator"},"->"),a("span",{class:"token function"},"make"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'redis'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n$controller "),a("span",{class:"token operator"},"="),t(" $app"),a("span",{class:"token operator"},"->"),a("span",{class:"token function"},"make"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'controller'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n$controller"),a("span",{class:"token operator"},"->"),a("span",{class:"token function"},"action"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token comment"},"/** * 输出: * DbMysql::query * DbRedis::set */"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br")])],-1),On=a("p",null,"With dependency injection:",-1),Ln=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// dependency provider"),t("\n"),a("span",{class:"token keyword"},"export"),t(),a("span",{class:"token keyword"},"interface"),t(),a("span",{class:"token class-name"},"IProvider"),a("span",{class:"token operator"},"<"),a("span",{class:"token constant"},"T"),a("span",{class:"token operator"},">"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"provide"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token constant"},"T"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n@"),a("span",{class:"token function"},"injectable"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t("\n"),a("span",{class:"token keyword"},"export"),t(),a("span",{class:"token keyword"},"class"),t(),a("span",{class:"token class-name"},"NameProvider"),t(),a("span",{class:"token keyword"},"implements"),t(),a("span",{class:"token class-name"},"IProvider"),a("span",{class:"token operator"},"<"),t("string"),a("span",{class:"token operator"},">"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"provide"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token string"},'"World"'),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token comment"},"// top module"),t("\n"),a("span",{class:"token keyword"},"import"),t(),a("span",{class:"token operator"},"*"),t(),a("span",{class:"token keyword"},"as"),t(" React "),a("span",{class:"token keyword"},"from"),t(),a("span",{class:"token string"},'"react"'),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"import"),t(),a("span",{class:"token punctuation"},"{"),t(" IProvider "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"from"),t(),a("span",{class:"token string"},'"./providers"'),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token keyword"},"export"),t(),a("span",{class:"token keyword"},"class"),t(),a("span",{class:"token class-name"},"Hello"),t(),a("span",{class:"token keyword"},"extends"),t(),a("span",{class:"token class-name"},[t("React"),a("span",{class:"token punctuation"},"."),t("Component")]),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"private"),t(" readonly nameProvider"),a("span",{class:"token operator"},":"),t(" IProvider"),a("span",{class:"token operator"},"<"),t("string"),a("span",{class:"token operator"},">"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token function"},"render"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token operator"},"<"),t("h1"),a("span",{class:"token operator"},">"),t("Hello "),a("span",{class:"token punctuation"},"{"),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("nameProvider"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"provide"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token operator"},"!"),a("span",{class:"token operator"},"<"),a("span",{class:"token operator"},"/"),t("h1"),a("span",{class:"token operator"},">"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br")])],-1),$n=a("h3",{id:"class-pattern"},[a("a",{class:"header-anchor",href:"#class-pattern","aria-hidden":"true"},"#"),t(" Class Pattern")],-1),_n=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"var"),t(),a("span",{class:"token function-variable function"},"Person"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("firstName"),a("span",{class:"token punctuation"},","),t(" lastName")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("firstName "),a("span",{class:"token operator"},"="),t(" firstName"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("lastName "),a("span",{class:"token operator"},"="),t(" lastName"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("gender "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token string"},"'male'"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},'// Define a subclass constructor for for "Superhero":'),t("\n"),a("span",{class:"token keyword"},"var"),t(),a("span",{class:"token function-variable function"},"Superhero"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("firstName"),a("span",{class:"token punctuation"},","),t(" lastName"),a("span",{class:"token punctuation"},","),t(" powers")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// Invoke the superclass constructor on the new object"),t("\n "),a("span",{class:"token comment"},"// then use .call() to invoke the constructor as a method of"),t("\n "),a("span",{class:"token comment"},"// the object to be initialized."),t("\n "),a("span",{class:"token function"},"Person"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"call"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},","),t(" firstName"),a("span",{class:"token punctuation"},","),t(" lastName"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},'// Finally, store their powers, a new array of traits not found in a normal "Person"'),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("powers "),a("span",{class:"token operator"},"="),t(" powers"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token class-name"},"SuperHero"),a("span",{class:"token punctuation"},"."),t("prototype "),a("span",{class:"token operator"},"="),t(" Object"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"create"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Person"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br")])],-1),En=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"var"),t(" superman "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Superhero"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Clark'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Kent'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},"'flight'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'heat-vision'"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\nconsole"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),t("superman"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Bn=a("h3",{id:"mix-in-pattern"},[a("a",{class:"header-anchor",href:"#mix-in-pattern","aria-hidden":"true"},"#"),t(" Mix-In Pattern")],-1),Fn=a("p",null,"将多个对象的属性混入同一个对象,达到继承/扩展/组合的效果",-1),Tn=a("ul",null,[a("li",null,"不改变原型链")],-1),Vn=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"mix"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" arg"),a("span",{class:"token punctuation"},","),t("\n prop"),a("span",{class:"token punctuation"},","),t("\n child "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),t("arg "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(" arg "),a("span",{class:"token operator"},"<"),t(" arguments"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},";"),t(" arg "),a("span",{class:"token operator"},"+="),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),t("prop "),a("span",{class:"token keyword"},"in"),t(" arguments"),a("span",{class:"token punctuation"},"["),t("arg"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("arguments"),a("span",{class:"token punctuation"},"["),t("arg"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"hasOwnProperty"),a("span",{class:"token punctuation"},"("),t("prop"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n child"),a("span",{class:"token punctuation"},"["),t("prop"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" arguments"),a("span",{class:"token punctuation"},"["),t("arg"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),t("prop"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" child"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br")])],-1),qn=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"var"),t(" cake "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"mix"),a("span",{class:"token punctuation"},"("),t("\n "),a("span",{class:"token punctuation"},"{"),t(" eggs"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),t(" large"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token boolean"},"true"),t(),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token punctuation"},"{"),t(" butter"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),t(" salted"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token boolean"},"true"),t(),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token punctuation"},"{"),t(" flour"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token string"},"'3 cups'"),t(),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token punctuation"},"{"),t(" sugar"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token string"},"'sure!'"),t(),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),Rn=a("ul",null,[a("li",null,"改变原型链")],-1),Un=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// Extend an existing object with a method from another"),t("\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"mix"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("receivingClass"),a("span",{class:"token punctuation"},","),t(" givingClass")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// mix-in provide certain methods"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("arguments"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"var"),t(" i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),t(" len "),a("span",{class:"token operator"},"="),t(" arguments"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(" len"),a("span",{class:"token punctuation"},";"),t(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n receivingClass"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"["),t("arguments"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t("\n givingClass"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"["),t("arguments"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token comment"},"// mix-in provide obj"),t("\n "),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"var"),t(" methodName "),a("span",{class:"token keyword"},"in"),t(" givingClass"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),t("receivingClass"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"["),t("methodName"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n receivingClass"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"["),t("methodName"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t("\n givingClass"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"["),t("methodName"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br")])],-1),Hn=a("h3",{id:"singleton-pattern"},[a("a",{class:"header-anchor",href:"#singleton-pattern","aria-hidden":"true"},"#"),t(" Singleton Pattern")],-1),zn=a("p",null,"原型与构造函数指针运作正常",-1),Gn=a("div",{class:"language-javascript line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Universe"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// 缓存实例"),t("\n "),a("span",{class:"token keyword"},"var"),t(" instance"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// anti-Self-Defined Function Pattern"),t("\n "),a("span",{class:"token comment"},"// 反-自定义函数模式: 先重写,再初始化"),t("\n "),a("span",{class:"token function-variable function"},"Universe"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Universe"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" instance"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// 保存原型,使其一直保持于同一位置"),t("\n "),a("span",{class:"token comment"},"// (this指针指向不重要)"),t("\n "),a("span",{class:"token class-name"},"Universe"),a("span",{class:"token punctuation"},"."),t("prototype "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},";"),t("\n\n instance "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Universe"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token comment"},"// 重定向constructor指针"),t("\n instance"),a("span",{class:"token punctuation"},"."),t("constructor "),a("span",{class:"token operator"},"="),t(" Universe"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token comment"},"// 功能代码"),t("\n instance"),a("span",{class:"token punctuation"},"."),t("start_time "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t("\n instance"),a("span",{class:"token punctuation"},"."),t("bang "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token string"},"'Big'"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" instance"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br")])],-1),Wn=a("h3",{id:"abstract-factory"},[a("a",{class:"header-anchor",href:"#abstract-factory","aria-hidden":"true"},"#"),t(" Abstract Factory")],-1),Qn=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"var"),t(" AbstractVehicleFactory "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// Storage for our vehicle types"),t("\n "),a("span",{class:"token keyword"},"var"),t(" types "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"_getVehicle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("type"),a("span",{class:"token punctuation"},","),t(" customizations")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" Vehicle "),a("span",{class:"token operator"},"="),t(" types"),a("span",{class:"token punctuation"},"["),t("type"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(" Vehicle "),a("span",{class:"token operator"},"?"),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Vehicle"),a("span",{class:"token punctuation"},"("),t("customizations"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"null"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"_registerVehicle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("type"),a("span",{class:"token punctuation"},","),t(" Vehicle")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" prototype "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token class-name"},"Vehicle"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// only register classes that fulfill the vehicle contract"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("prototype"),a("span",{class:"token punctuation"},"."),t("drive "),a("span",{class:"token operator"},"&&"),t(" prototype"),a("span",{class:"token punctuation"},"."),t("breakDown"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n types"),a("span",{class:"token punctuation"},"["),t("type"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" Vehicle"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" AbstractVehicleFactory"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token punctuation"},"{"),t("\n getVehicle"),a("span",{class:"token operator"},":"),t(" _getVehicle"),a("span",{class:"token punctuation"},","),t("\n registerVehicle"),a("span",{class:"token operator"},":"),t(" _registerVehicle"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br")])],-1),Xn=a("h3",{id:"factory-method"},[a("a",{class:"header-anchor",href:"#factory-method","aria-hidden":"true"},"#"),t(" Factory Method")],-1),Jn=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[t("module"),a("span",{class:"token punctuation"},"."),t("exports "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"VehicleFactory"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" publicVehicle "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Object"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// specific factory"),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Car"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"options"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("type "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token string"},"'car'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("doors "),a("span",{class:"token operator"},"="),t(" options"),a("span",{class:"token punctuation"},"."),t("doors "),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("state "),a("span",{class:"token operator"},"="),t(" options"),a("span",{class:"token punctuation"},"."),t("state "),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token string"},"'brand new'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" options"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token string"},"'silver'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("speed "),a("span",{class:"token operator"},"="),t(" options"),a("span",{class:"token punctuation"},"."),t("speed "),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Truck"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"options"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("type "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token string"},"'truck'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("state "),a("span",{class:"token operator"},"="),t(" options"),a("span",{class:"token punctuation"},"."),t("state "),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token string"},"'used'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("wheelSize "),a("span",{class:"token operator"},"="),t(" options"),a("span",{class:"token punctuation"},"."),t("wheelSize "),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token string"},"'large'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" options"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token string"},"'blue'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("speed "),a("span",{class:"token operator"},"="),t(" options"),a("span",{class:"token punctuation"},"."),t("speed "),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// public features of vehicle , added to __proto__"),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"_run"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" args "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"slice"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"call"),a("span",{class:"token punctuation"},"("),t("arguments"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("args"),a("span",{class:"token punctuation"},"."),t("length "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n console"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("type "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token string"},"' - run with: '"),t(),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("speed "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token string"},"'km/s'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"toString"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"apply"),a("span",{class:"token punctuation"},"("),t("args"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'[object Number]'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("speed "),a("span",{class:"token operator"},"="),t(" args"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"_withColor"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" args "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"slice"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"call"),a("span",{class:"token punctuation"},"("),t("arguments"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("args"),a("span",{class:"token punctuation"},"."),t("length "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n console"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),t("\n "),a("span",{class:"token string"},"'The color of this '"),t(),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("type "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token string"},"' product is : '"),t(),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("color\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"toString"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"apply"),a("span",{class:"token punctuation"},"("),t("args"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'[object String]'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" args"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token comment"},"// provide a function to change other public features"),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"_reform"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("funcName"),a("span",{class:"token punctuation"},","),t(" newFunc")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("\n "),a("span",{class:"token keyword"},"typeof"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"["),t("funcName"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'function'"),t(),a("span",{class:"token operator"},"||"),t("\n "),a("span",{class:"token keyword"},"typeof"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"["),t("funcName"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'function'"),t("\n "),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"delete"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"["),t("funcName"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"["),t("funcName"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" newFunc"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token comment"},"// provide a function to add new public features"),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"_addFeature"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("funcName"),a("span",{class:"token punctuation"},","),t(" newFunc")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"typeof"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"["),t("funcName"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'undefined'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"["),t("funcName"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" newFunc"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"["),t("funcName"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" newFunc"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// private features, added to obj"),t("\n\n "),a("span",{class:"token comment"},"// core: create method"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"create"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"options"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" vehicleClass "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token string"},"''"),a("span",{class:"token punctuation"},","),t("\n newVehicle "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("options"),a("span",{class:"token punctuation"},"."),t("type "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'car'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n vehicleClass "),a("span",{class:"token operator"},"="),t(" Car"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n vehicleClass "),a("span",{class:"token operator"},"="),t(" Truck"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// create new vehicle with options, by pre-defined specific constructor"),t("\n newVehicle "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"vehicleClass"),a("span",{class:"token punctuation"},"("),t("options"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token comment"},"// set up prototype"),t("\n newVehicle"),a("span",{class:"token punctuation"},"."),t("__proto__ "),a("span",{class:"token operator"},"="),t(" publicVehicle"),a("span",{class:"token punctuation"},";"),t("\n newVehicle"),a("span",{class:"token punctuation"},"."),t("prototype "),a("span",{class:"token operator"},"="),t(" publicVehicle"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// add public feature"),t("\n newVehicle"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),t("run "),a("span",{class:"token operator"},"="),t(" _run"),a("span",{class:"token punctuation"},";"),t("\n newVehicle"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),t("withColor "),a("span",{class:"token operator"},"="),t(" _withColor"),a("span",{class:"token punctuation"},";"),t("\n newVehicle"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),t("reform "),a("span",{class:"token operator"},"="),t(" _reform"),a("span",{class:"token punctuation"},";"),t("\n newVehicle"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),t("addFeature "),a("span",{class:"token operator"},"="),t(" _addFeature"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// add private(separately) feature"),t("\n\n "),a("span",{class:"token comment"},"// return new obj"),t("\n "),a("span",{class:"token keyword"},"return"),t(" newVehicle"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// define more factory"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token punctuation"},"{"),t("\n vehicleFactory"),a("span",{class:"token operator"},":"),t(" VehicleFactory"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br"),a("span",{class:"line-number"},"58"),a("br"),a("span",{class:"line-number"},"59"),a("br"),a("span",{class:"line-number"},"60"),a("br"),a("span",{class:"line-number"},"61"),a("br"),a("span",{class:"line-number"},"62"),a("br"),a("span",{class:"line-number"},"63"),a("br"),a("span",{class:"line-number"},"64"),a("br"),a("span",{class:"line-number"},"65"),a("br"),a("span",{class:"line-number"},"66"),a("br"),a("span",{class:"line-number"},"67"),a("br"),a("span",{class:"line-number"},"68"),a("br"),a("span",{class:"line-number"},"69"),a("br"),a("span",{class:"line-number"},"70"),a("br"),a("span",{class:"line-number"},"71"),a("br"),a("span",{class:"line-number"},"72"),a("br"),a("span",{class:"line-number"},"73"),a("br"),a("span",{class:"line-number"},"74"),a("br"),a("span",{class:"line-number"},"75"),a("br"),a("span",{class:"line-number"},"76"),a("br"),a("span",{class:"line-number"},"77"),a("br"),a("span",{class:"line-number"},"78"),a("br"),a("span",{class:"line-number"},"79"),a("br"),a("span",{class:"line-number"},"80"),a("br"),a("span",{class:"line-number"},"81"),a("br"),a("span",{class:"line-number"},"82"),a("br"),a("span",{class:"line-number"},"83"),a("br"),a("span",{class:"line-number"},"84"),a("br"),a("span",{class:"line-number"},"85"),a("br"),a("span",{class:"line-number"},"86"),a("br"),a("span",{class:"line-number"},"87"),a("br"),a("span",{class:"line-number"},"88"),a("br"),a("span",{class:"line-number"},"89"),a("br"),a("span",{class:"line-number"},"90"),a("br"),a("span",{class:"line-number"},"91"),a("br"),a("span",{class:"line-number"},"92"),a("br"),a("span",{class:"line-number"},"93"),a("br"),a("span",{class:"line-number"},"94"),a("br"),a("span",{class:"line-number"},"95"),a("br"),a("span",{class:"line-number"},"96"),a("br"),a("span",{class:"line-number"},"97"),a("br")])],-1),Kn=a("h3",{id:"adapter-pattern"},[a("a",{class:"header-anchor",href:"#adapter-pattern","aria-hidden":"true"},"#"),t(" Adapter Pattern")],-1),Yn=a("p",null,"适配器通过内部使用新接口规定的属性/方法, 创建一个外观与旧接口一致 的方法",-1),Zn=a("ul",null,[a("li",null,"old.method();"),a("li",null,"adapter.method(); // 实现此 method 时,使用了新接口规定的属性/方法")],-1),ns=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// old interface"),t("\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Shipping"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"request"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("zipStart"),a("span",{class:"token punctuation"},","),t(" zipEnd"),a("span",{class:"token punctuation"},","),t(" weight")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// ..."),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token string"},"'$49.75'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token comment"},"// new interface"),t("\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"AdvancedShipping"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"login"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"credentials"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"/* ... */"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"setStart"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"start"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"/* ... */"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"setDestination"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"destination"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"/* ... */"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"calculate"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"weight"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token string"},"'$39.50'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token comment"},"// adapter interface"),t("\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"AdapterShipping"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"credentials"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" shipping "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"AdvancedShipping"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n shipping"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"login"),a("span",{class:"token punctuation"},"("),t("credentials"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"request"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("zipStart"),a("span",{class:"token punctuation"},","),t(" zipEnd"),a("span",{class:"token punctuation"},","),t(" weight")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n shipping"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"setStart"),a("span",{class:"token punctuation"},"("),t("zipStart"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n shipping"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"setDestination"),a("span",{class:"token punctuation"},"("),t("zipEnd"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(" shipping"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"calculate"),a("span",{class:"token punctuation"},"("),t("weight"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br")])],-1),ss=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"var"),t(" shipping "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Shipping"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"var"),t(" adapterShipping "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"AdapterShipping"),a("span",{class:"token punctuation"},"("),t("credentials"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// original shipping object and interface"),t("\n"),a("span",{class:"token keyword"},"var"),t(" cost "),a("span",{class:"token operator"},"="),t(" shipping"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"request"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'78701'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'10010'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'2 lbs'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\nlog"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Old cost: '"),t(),a("span",{class:"token operator"},"+"),t(" cost"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token comment"},"// new shipping object with adapted interface"),t("\ncost "),a("span",{class:"token operator"},"="),t(" adapter"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"request"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'78701'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'10010'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'2 lbs'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),as=a("h3",{id:"decorator-pattern"},[a("a",{class:"header-anchor",href:"#decorator-pattern","aria-hidden":"true"},"#"),t(" Decorator Pattern")],-1),ts=a("ul",null,[a("li",null,"重写/重载/扩展对象原有的行为(method),但不改变对象原有属性"),a("li",null,"可以添加新属性,并围绕新属性扩展对象的原行为 e.g 原对象只会说中文,装饰后同时说中文与英文"),a("li",null,"避免了通过继承来为类型添加新的职责的形式可取,通过继承的方式容易造成子类的膨胀"),a("li",null,"保持接口的一致性,动态改变对象的外观/职责"),a("li",null,"ConcreteDecorator 类: private ClassName component;(拥有一个对象引用)")],-1),es=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"const"),t(),a("span",{class:"token function-variable function"},"__decorate"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("decorators"),a("span",{class:"token punctuation"},","),t(" target"),a("span",{class:"token punctuation"},","),t(" key"),a("span",{class:"token punctuation"},","),t(" desc")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"const"),t(" argumentsLength "),a("span",{class:"token operator"},"="),t(" arguments"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"let"),t(" descriptorOrTarget"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"let"),t(" decorator"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("argumentsLength "),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// class decorator"),t("\n descriptorOrTarget "),a("span",{class:"token operator"},"="),t(" target"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("desc "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token keyword"},"null"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// method decorator"),t("\n descriptorOrTarget "),a("span",{class:"token operator"},"="),t(" Object"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getOwnPropertyDescriptor"),a("span",{class:"token punctuation"},"("),t("target"),a("span",{class:"token punctuation"},","),t(" key"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"let"),t(" i "),a("span",{class:"token operator"},"="),t(" decorators"),a("span",{class:"token punctuation"},"."),t("length "),a("span",{class:"token operator"},"-"),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},">="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(" i"),a("span",{class:"token operator"},"--"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),t("decorator "),a("span",{class:"token operator"},"="),t(" decorators"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("argumentsLength "),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// if the decorator function returns a value use it;"),t("\n "),a("span",{class:"token comment"},"// otherwise use the original."),t("\n descriptorOrTarget "),a("span",{class:"token operator"},"="),t("\n "),a("span",{class:"token function"},"decorator"),a("span",{class:"token punctuation"},"("),t("descriptorOrTarget"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"||"),t(" descriptorOrTarget"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// if the decorator function returns a descriptor use it;"),t("\n "),a("span",{class:"token comment"},"// otherwise use the original."),t("\n descriptorOrTarget "),a("span",{class:"token operator"},"="),t("\n "),a("span",{class:"token function"},"decorator"),a("span",{class:"token punctuation"},"("),t("target"),a("span",{class:"token punctuation"},","),t(" key"),a("span",{class:"token punctuation"},","),t(" descriptorOrTarget"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"||"),t(" descriptorOrTarget"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("argumentsLength "),a("span",{class:"token operator"},">"),t(),a("span",{class:"token number"},"3"),t(),a("span",{class:"token operator"},"&&"),t(" descriptorOrTarget"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n Object"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"defineProperty"),a("span",{class:"token punctuation"},"("),t("target"),a("span",{class:"token punctuation"},","),t(" key"),a("span",{class:"token punctuation"},","),t(" descriptorOrTarget"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" descriptorOrTarget"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br")])],-1),os=a("h4",{id:"decorator-implementation"},[a("a",{class:"header-anchor",href:"#decorator-implementation","aria-hidden":"true"},"#"),t(" Decorator Implementation")],-1),cs=a("p",null,"关键在于实现传递方式, 两种方式:",-1),ps=a("ul",null,[a("li",null,"uber 属性获得每次装饰后结果"),a("li",null,"循环叠加每次装饰后结果")],-1),ls=a("div",{class:"language-javascript line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// 构造函数"),t("\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Sale"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"price"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("price "),a("span",{class:"token operator"},"="),t(" price "),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token class-name"},"Sale"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"getPrice"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("price"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// 定义具体装饰器"),t("\n"),a("span",{class:"token comment"},"// 通过uber属性获得上一次装饰后的结果"),t("\nSale"),a("span",{class:"token punctuation"},"."),t("decorators "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\nSale"),a("span",{class:"token punctuation"},"."),t("decorators"),a("span",{class:"token punctuation"},"."),t("fedTax "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"getPrice"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" price "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("uber"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getPrice"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n price "),a("span",{class:"token operator"},"+="),t(),a("span",{class:"token punctuation"},"("),t("price "),a("span",{class:"token operator"},"*"),t(),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"/"),t(),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(" price"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\nSale"),a("span",{class:"token punctuation"},"."),t("decorators"),a("span",{class:"token punctuation"},"."),t("quebec "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"getPrice"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" price "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("uber"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getPrice"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n price "),a("span",{class:"token operator"},"+="),t(),a("span",{class:"token punctuation"},"("),t("price "),a("span",{class:"token operator"},"*"),t(),a("span",{class:"token number"},"7.5"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"/"),t(),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(" price"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\nSale"),a("span",{class:"token punctuation"},"."),t("decorators"),a("span",{class:"token punctuation"},"."),t("money "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"getPrice"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token string"},"'$'"),t(),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("uber"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getPrice"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"toFixed"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\nSale"),a("span",{class:"token punctuation"},"."),t("decorators"),a("span",{class:"token punctuation"},"."),t("cdn "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"getPrice"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token string"},"'CDN$ '"),t(),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("uber"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getPrice"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"toFixed"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token class-name"},"Sale"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"decorate"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"decorator"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(),a("span",{class:"token function-variable function"},"F"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n overrides "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("constructor"),a("span",{class:"token punctuation"},"."),t("decorators"),a("span",{class:"token punctuation"},"["),t("decorator"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),t("\n i"),a("span",{class:"token punctuation"},","),t("\n newObj"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// 临时代理构造函数"),t("\n "),a("span",{class:"token class-name"},"F"),a("span",{class:"token punctuation"},"."),t("prototype "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},";"),t("\n newObj "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"F"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token comment"},"// 传递实现的关键"),t("\n "),a("span",{class:"token comment"},"// 通过uber属性获得上一次装饰后的结果"),t("\n newObj"),a("span",{class:"token punctuation"},"."),t("uber "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token class-name"},"F"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),t("i "),a("span",{class:"token keyword"},"in"),t(" overrides"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("overrides"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"hasOwnProperty"),a("span",{class:"token punctuation"},"("),t("i"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n newObj"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" overrides"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" newObj"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br")])],-1),us=a("h4",{id:"decorators-list"},[a("a",{class:"header-anchor",href:"#decorators-list","aria-hidden":"true"},"#"),t(" Decorators List")],-1),is=a("div",{class:"language-javascript line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// 构造函数"),t("\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Sale"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"price"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("price "),a("span",{class:"token operator"},"="),t(" price "),a("span",{class:"token operator"},">"),t(),a("span",{class:"token number"},"0"),t(),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("decorators_list "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token class-name"},"Sale"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"getPrice"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("price"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// 定义具体装饰器"),t("\nSale"),a("span",{class:"token punctuation"},"."),t("decorators "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\nSale"),a("span",{class:"token punctuation"},"."),t("decorators"),a("span",{class:"token punctuation"},"."),t("fedTax "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"getPrice"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"price"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" price "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token punctuation"},"("),t("price "),a("span",{class:"token operator"},"*"),t(),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"/"),t(),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\nSale"),a("span",{class:"token punctuation"},"."),t("decorators"),a("span",{class:"token punctuation"},"."),t("quebec "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"getPrice"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"price"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" price "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token punctuation"},"("),t("price "),a("span",{class:"token operator"},"*"),t(),a("span",{class:"token number"},"7.5"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"/"),t(),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\nSale"),a("span",{class:"token punctuation"},"."),t("decorators"),a("span",{class:"token punctuation"},"."),t("money "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"getPrice"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"price"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token string"},"'$'"),t(),a("span",{class:"token operator"},"+"),t(" price"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"toFixed"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token class-name"},"Sale"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"decorate"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"decorator"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("decorators_list"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"push"),a("span",{class:"token punctuation"},"("),t("decorator"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token class-name"},"Sale"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"getPrice"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" price "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("price"),a("span",{class:"token punctuation"},","),t("\n i"),a("span",{class:"token punctuation"},","),t("\n max "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("decorators_list"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},","),t("\n name"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),t("i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(" max"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"+="),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n name "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("decorators_list"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token comment"},"// 传递实现的关键"),t("\n "),a("span",{class:"token comment"},"// 通过循环叠加上一次装饰后的结果"),t("\n price "),a("span",{class:"token operator"},"="),t(" Sale"),a("span",{class:"token punctuation"},"."),t("decorators"),a("span",{class:"token punctuation"},"["),t("name"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getPrice"),a("span",{class:"token punctuation"},"("),t("price"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" price"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br")])],-1),rs=a("h4",{id:"实现-2"},[a("a",{class:"header-anchor",href:"#实现-2","aria-hidden":"true"},"#"),t(" 实现 2")],-1),ks=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// The constructor to decorate"),t("\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"MacBook"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"cost"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token number"},"997"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"screenSize"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token number"},"11.6"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token comment"},"// Decorator 1"),t("\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Memory"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"macBook"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" v "),a("span",{class:"token operator"},"="),t(" macBook"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"cost"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n macBook"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"cost"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" v "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token number"},"75"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token comment"},"// Decorator 2"),t("\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Engraving"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"macBook"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" v "),a("span",{class:"token operator"},"="),t(" macBook"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"cost"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n macBook"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"cost"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" v "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token number"},"200"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token comment"},"// Decorator 3"),t("\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Insurance"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"macBook"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" v "),a("span",{class:"token operator"},"="),t(" macBook"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"cost"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n macBook"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"cost"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" v "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token number"},"250"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br")])],-1),bs=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"var"),t(" mb "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MacBook"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token function"},"Memory"),a("span",{class:"token punctuation"},"("),t("mb"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token function"},"Engraving"),a("span",{class:"token punctuation"},"("),t("mb"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token function"},"Insurance"),a("span",{class:"token punctuation"},"("),t("mb"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// Outputs: 1522"),t("\nconsole"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),t("mb"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"cost"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// Outputs: 11.6"),t("\nconsole"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),t("mb"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"screenSize"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br")])],-1),ms=a("h3",{id:"facade-pattern"},[a("a",{class:"header-anchor",href:"#facade-pattern","aria-hidden":"true"},"#"),t(" Facade Pattern")],-1),ds=a("p",null,"将多个复杂的子系统封装+合并,实现一个复杂功能,但只暴露一个简单的接口 - 封装复杂逻辑",-1),ys=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"var"),t(" sabertazimi "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\nsabertazimi"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"addMyEvent"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("el"),a("span",{class:"token punctuation"},","),t(" ev"),a("span",{class:"token punctuation"},","),t(" fn")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("el"),a("span",{class:"token punctuation"},"."),t("addEventListener"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n el"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"addEventListener"),a("span",{class:"token punctuation"},"("),t("ev"),a("span",{class:"token punctuation"},","),t(" fn"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token boolean"},"false"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("el"),a("span",{class:"token punctuation"},"."),t("attachEvent"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n el"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"attachEvent"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'on'"),t(),a("span",{class:"token operator"},"+"),t(" ev"),a("span",{class:"token punctuation"},","),t(" fn"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n el"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},"'on'"),t(),a("span",{class:"token operator"},"+"),t(" ev"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" fn"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),fs=a("h3",{id:"flyweight-pattern"},[a("a",{class:"header-anchor",href:"#flyweight-pattern","aria-hidden":"true"},"#"),t(" Flyweight Pattern")],-1),hs=a("p",null,"减小内存开销:",-1),ws=a("ul",null,[a("li",null,"内在信息 - 对象中的内部方法所需信息/属性, 一个单独的享元可替代大量具有相同内在信息的对象"),a("li",null,"外部状态作为方法参数:使之适应不同的外部状态(context)——对象实例差异处"),a("li",null,"某个类型的对象有大量的实例,对这些实例进行分类,合并相同分类的对象,只创建少量实例(享元)"),a("li",null,"通过享元工厂来管理一组享元,当所需享元已存在时,返回已存在享元;当所需享元不存在时,创建新享元")],-1),gs=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Flyweight"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("make"),a("span",{class:"token punctuation"},","),t(" model"),a("span",{class:"token punctuation"},","),t(" processor")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("make "),a("span",{class:"token operator"},"="),t(" make"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("model "),a("span",{class:"token operator"},"="),t(" model"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("processor "),a("span",{class:"token operator"},"="),t(" processor"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token keyword"},"var"),t(" FlyWeightFactory "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" flyweights "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"get"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("make"),a("span",{class:"token punctuation"},","),t(" model"),a("span",{class:"token punctuation"},","),t(" processor")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// 不存在所需享元,新建新享元"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),t("flyweights"),a("span",{class:"token punctuation"},"["),t("make "),a("span",{class:"token operator"},"+"),t(" model"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n flyweights"),a("span",{class:"token punctuation"},"["),t("make "),a("span",{class:"token operator"},"+"),t(" model"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Flyweight"),a("span",{class:"token punctuation"},"("),t("make"),a("span",{class:"token punctuation"},","),t(" model"),a("span",{class:"token punctuation"},","),t(" processor"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" flyweights"),a("span",{class:"token punctuation"},"["),t("make "),a("span",{class:"token operator"},"+"),t(" model"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n\n "),a("span",{class:"token function-variable function"},"getCount"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" count "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"var"),t(" f "),a("span",{class:"token keyword"},"in"),t(" flyweights"),a("span",{class:"token punctuation"},")"),t(" count"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(" count"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token keyword"},"var"),t(),a("span",{class:"token function-variable function"},"Computer"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("make"),a("span",{class:"token punctuation"},","),t(" model"),a("span",{class:"token punctuation"},","),t(" processor"),a("span",{class:"token punctuation"},","),t(" memory"),a("span",{class:"token punctuation"},","),t(" tag")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("flyweight "),a("span",{class:"token operator"},"="),t(" FlyWeightFactory"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"get"),a("span",{class:"token punctuation"},"("),t("make"),a("span",{class:"token punctuation"},","),t(" model"),a("span",{class:"token punctuation"},","),t(" processor"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("memory "),a("span",{class:"token operator"},"="),t(" memory"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("tag "),a("span",{class:"token operator"},"="),t(" tag"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"getMake"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("flyweight"),a("span",{class:"token punctuation"},"."),t("make"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token comment"},"// ..."),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"ComputerCollection"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" computers "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"var"),t(" count "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"add"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("make"),a("span",{class:"token punctuation"},","),t(" model"),a("span",{class:"token punctuation"},","),t(" processor"),a("span",{class:"token punctuation"},","),t(" memory"),a("span",{class:"token punctuation"},","),t(" tag")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n computers"),a("span",{class:"token punctuation"},"["),t("tag"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Computer"),a("span",{class:"token punctuation"},"("),t("make"),a("span",{class:"token punctuation"},","),t(" model"),a("span",{class:"token punctuation"},","),t(" processor"),a("span",{class:"token punctuation"},","),t(" memory"),a("span",{class:"token punctuation"},","),t(" tag"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n count"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n\n "),a("span",{class:"token function-variable function"},"get"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"tag"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" computers"),a("span",{class:"token punctuation"},"["),t("tag"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n\n "),a("span",{class:"token function-variable function"},"getCount"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" count"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" computers "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"ComputerCollection"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n computers"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Dell'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Studio XPS'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Intel'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'5G'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Y755P'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n computers"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Dell'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Studio XPS'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Intel'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'6G'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'X997T'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n computers"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Dell'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Studio XPS'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Intel'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'2G'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'NT777'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n computers"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Dell'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Studio XPS'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Intel'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'2G'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'0J88A'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n computers"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'HP'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Envy'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Intel'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'4G'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'CNU883701'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n computers"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'HP'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Envy'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Intel'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'2G'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'TXU003283'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n console"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Computers: '"),t(),a("span",{class:"token operator"},"+"),t(" computers"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getCount"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n console"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Flyweights: '"),t(),a("span",{class:"token operator"},"+"),t(" FlyWeightFactory"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getCount"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br"),a("span",{class:"line-number"},"58"),a("br"),a("span",{class:"line-number"},"59"),a("br"),a("span",{class:"line-number"},"60"),a("br"),a("span",{class:"line-number"},"61"),a("br"),a("span",{class:"line-number"},"62"),a("br"),a("span",{class:"line-number"},"63"),a("br"),a("span",{class:"line-number"},"64"),a("br"),a("span",{class:"line-number"},"65"),a("br"),a("span",{class:"line-number"},"66"),a("br"),a("span",{class:"line-number"},"67"),a("br"),a("span",{class:"line-number"},"68"),a("br"),a("span",{class:"line-number"},"69"),a("br"),a("span",{class:"line-number"},"70"),a("br")])],-1),vs=a("h3",{id:"proxy-pattern"},[a("a",{class:"header-anchor",href:"#proxy-pattern","aria-hidden":"true"},"#"),t(" Proxy Pattern")],-1),Ps=a("p",null,"通过一个代理对象,临时存储原对象方法调用产生的一系列结果(新建对象),减少重复对象的产生",-1),Cs=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"GeoCoder"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"getLatLng"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"address"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("address "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'Amsterdam'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token string"},"'52.3700° N, 4.8900° E'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("address "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'London'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token string"},"'51.5171° N, 0.1062° W'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("address "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'Paris'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token string"},"'48.8742° N, 2.3470° E'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("address "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'Berlin'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token string"},"'52.5233° N, 13.4127° E'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token string"},"''"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"GeoProxy"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" geocoder "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"GeoCoder"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"var"),t(" geocache "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"getLatLng"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"address"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),t("geocache"),a("span",{class:"token punctuation"},"["),t("address"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n geocache"),a("span",{class:"token punctuation"},"["),t("address"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" geocoder"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getLatLng"),a("span",{class:"token punctuation"},"("),t("address"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n log"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),t("address "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token string"},"': '"),t(),a("span",{class:"token operator"},"+"),t(" geocache"),a("span",{class:"token punctuation"},"["),t("address"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(" geocache"),a("span",{class:"token punctuation"},"["),t("address"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token function-variable function"},"getCount"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" count "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"var"),t(" code "),a("span",{class:"token keyword"},"in"),t(" geocache"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n count"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"return"),t(" count"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br")])],-1),Ss=a("h3",{id:"command-pattern"},[a("a",{class:"header-anchor",href:"#command-pattern","aria-hidden":"true"},"#"),t(" Command Pattern")],-1),js=a("p",null,"有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁 (多个对象中的某个随机对象),也不知道被请求的操作是什么. 此时希望用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此的耦合关系",-1),Ms=a("ul",null,[a("li",null,"将方法/动作封装成对象, 使得外部通过唯一方法 execute/run 调用内部方法/动作"),a("li",null,"客户创建命令;调用者执行该命令;接收者在命令执行时执行相应操作"),a("li",null,"客户通常被包装为一个对象,但是这不是必然的"),a("li",null,"调用者接过命令并将其保存下来, 它会在某个时候调用该命令对象的 execute 方法"),a("li",null,[t("调用者进行 "),a("code",null,"commandObject.execute"),t(" 这种调用时, 它所调用的方法将转而以 "),a("code",null,"receiver.action()"),t(" 这种形式调用恰当的方法")])],-1),xs=a("p",null,"client and receiver",-1),Ds=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"const"),t(),a("span",{class:"token function-variable function"},"SimpleCommand"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"receiving"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("receiving "),a("span",{class:"token operator"},"="),t(" receiving"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token class-name"},"SimpleCommand"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"execute"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("receiving"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"action"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),As=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[t("module"),a("span",{class:"token punctuation"},"."),t("exports "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" manager "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// command to be encapsulated"),t("\n manager"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"isNull"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"nu"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token function"},"toString"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"apply"),a("span",{class:"token punctuation"},"("),t("nu"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'[object Null]'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n manager"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"isArray"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"arr"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token function"},"toString"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"apply"),a("span",{class:"token punctuation"},"("),t("arr"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'[object Array]'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n manager"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"isString"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"str"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token function"},"toString"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"apply"),a("span",{class:"token punctuation"},"("),t("str"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'[object String]'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// public api"),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"execute"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"command"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token punctuation"},"("),t("\n manager"),a("span",{class:"token punctuation"},"["),t("command"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"&&"),t("\n manager"),a("span",{class:"token punctuation"},"["),t("command"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"apply"),a("span",{class:"token punctuation"},"("),t("manager"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"slice"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"call"),a("span",{class:"token punctuation"},"("),t("arguments"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"run"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"command"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token punctuation"},"("),t("\n manager"),a("span",{class:"token punctuation"},"["),t("command"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"&&"),t("\n manager"),a("span",{class:"token punctuation"},"["),t("command"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"apply"),a("span",{class:"token punctuation"},"("),t("manager"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"slice"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"call"),a("span",{class:"token punctuation"},"("),t("arguments"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token punctuation"},"{"),t("\n execute"),a("span",{class:"token operator"},":"),t(" execute"),a("span",{class:"token punctuation"},","),t("\n run"),a("span",{class:"token operator"},":"),t(" run"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br")])],-1),Is=a("p",null,"command pattern in UI development, bind command to UI components:",-1),Ns=a("ul",null,[a("li",null,"executor: UI components"),a("li",null,"client and receiver: background tasks or other UI components"),a("li",null,"executor -> client: command.execute() -> receiver: receiver.action()")],-1),Os=a("p",null,[t("e.g click "),a("code",null,"button"),t(" -> refresh "),a("code",null,"menu")],-1),Ls=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// receiver"),t("\n"),a("span",{class:"token keyword"},"const"),t(" MenuBar "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"action"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"refresh"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token function"},"refresh"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n console"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'refresh menu pages'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// client: command object"),t("\n"),a("span",{class:"token comment"},"// command: object with `action` implemented"),t("\n"),a("span",{class:"token keyword"},"const"),t(),a("span",{class:"token function-variable function"},"Command"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"receiver"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"=>"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n receiver"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"action"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" RefreshMenuBarCommand "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"Command"),a("span",{class:"token punctuation"},"("),t("MenuBar"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// executor"),t("\nbutton"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"setCommand"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"command"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"=>"),t(),a("span",{class:"token punctuation"},"{"),t("\n button"),a("span",{class:"token punctuation"},"."),t("command "),a("span",{class:"token operator"},"="),t(" command"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\nbutton"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"setCommand"),a("span",{class:"token punctuation"},"("),t("RefreshMenuBarCommand"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\nbutton"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"addEventLister"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'click'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"event"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"=>"),t(),a("span",{class:"token punctuation"},"{"),t("\n button"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"command"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br")])],-1),$s=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"const"),t(),a("span",{class:"token function-variable function"},"MenuCommand"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"action"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("action "),a("span",{class:"token operator"},"="),t(" action"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token class-name"},"MenuCommand"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"execute"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"action"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token keyword"},"const"),t(" fileActions "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"FileActions"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" EditActions "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"EditActions"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" InsertActions "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"InsertActions"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" HelpActions "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"HelpActions"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token keyword"},"const"),t(" appMenuBar "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuBar"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token comment"},"//-----------"),t("\n"),a("span",{class:"token keyword"},"const"),t(" fileMenu "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Menu"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'File'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" openCommand "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuCommand"),a("span",{class:"token punctuation"},"("),t("fileActions"),a("span",{class:"token punctuation"},"."),t("open"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" closeCommand "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuCommand"),a("span",{class:"token punctuation"},"("),t("fileActions"),a("span",{class:"token punctuation"},"."),t("close"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" saveCommand "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuCommand"),a("span",{class:"token punctuation"},"("),t("fileActions"),a("span",{class:"token punctuation"},"."),t("save"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" saveAsCommand "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuCommand"),a("span",{class:"token punctuation"},"("),t("fileActions"),a("span",{class:"token punctuation"},"."),t("saveAs"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\nfileMenu"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuItem"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'open'"),a("span",{class:"token punctuation"},","),t(" openCommand"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\nfileMenu"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuItem"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Close'"),a("span",{class:"token punctuation"},","),t(" closeCommand"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\nfileMenu"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuItem"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Save'"),a("span",{class:"token punctuation"},","),t(" saveCommand"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\nfileMenu"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuItem"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Close'"),a("span",{class:"token punctuation"},","),t(" saveAsCommand"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\nappMenuBar"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),t("fileMenu"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token comment"},"//--------------"),t("\n"),a("span",{class:"token keyword"},"const"),t(" editMenu "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Menu"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Edit'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" cutCommand "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuCommand"),a("span",{class:"token punctuation"},"("),t("EditActions"),a("span",{class:"token punctuation"},"."),t("cut"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" copyCommand "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuCommand"),a("span",{class:"token punctuation"},"("),t("EditActions"),a("span",{class:"token punctuation"},"."),t("copy"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" pasteCommand "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuCommand"),a("span",{class:"token punctuation"},"("),t("EditActions"),a("span",{class:"token punctuation"},"."),t("paste"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" deleteCommand "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuCommand"),a("span",{class:"token punctuation"},"("),t("EditActions"),a("span",{class:"token punctuation"},"."),t("delete"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\neditMenu"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuItem"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Cut'"),a("span",{class:"token punctuation"},","),t(" cutCommand"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\neditMenu"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuItem"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Copy'"),a("span",{class:"token punctuation"},","),t(" copyCommand"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\neditMenu"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuItem"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Paste'"),a("span",{class:"token punctuation"},","),t(" pasteCommand"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\neditMenu"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuItem"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Delete'"),a("span",{class:"token punctuation"},","),t(" deleteCommand"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\nappMenuBar"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),t("editMenu"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"//------------"),t("\n"),a("span",{class:"token keyword"},"const"),t(" insertMenu "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Menu"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Insert'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" textBlockCommand "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuCommand"),a("span",{class:"token punctuation"},"("),t("InsertActions"),a("span",{class:"token punctuation"},"."),t("textBlock"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\ninsertMenu"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuItem"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Text Block'"),a("span",{class:"token punctuation"},","),t(" textBlockCommand"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\nappMenuBar"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),t("insertMenu"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"//------------"),t("\n"),a("span",{class:"token keyword"},"const"),t(" helpMenu "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Menu"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Help'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" showHelpCommand "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuCommand"),a("span",{class:"token punctuation"},"("),t("HelpActions"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"showHelp"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\nhelpMenu"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuItem"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Show Help'"),a("span",{class:"token punctuation"},","),t(" showHelpCommand"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\nappMenuBar"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),t("helpMenu"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\ndocument"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getElementsByTagName"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'body'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"appendChild"),a("span",{class:"token punctuation"},"("),t("appMenuBar"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getElement"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\nappMenuBar"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"show"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br")])],-1),_s=a("p",null,"Command sequences to implement Macro/Batch/Undo command:",-1),Es=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"const"),t(),a("span",{class:"token function-variable function"},"Cursor"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("width"),a("span",{class:"token punctuation"},","),t(" height"),a("span",{class:"token punctuation"},","),t(" parent")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("width "),a("span",{class:"token operator"},"="),t(" width"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("height "),a("span",{class:"token operator"},"="),t(" height"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("commandStack "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("canvas "),a("span",{class:"token operator"},"="),t(" document"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"createElement"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'canvas'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("canvas"),a("span",{class:"token punctuation"},"."),t("width "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("width"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("canvas"),a("span",{class:"token punctuation"},"."),t("height "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("height"),a("span",{class:"token punctuation"},";"),t("\n parent"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"appendChild"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("canvas"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("ctx "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("canvas"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getContext"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'2d'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("ctx"),a("span",{class:"token punctuation"},"."),t("fillStyle "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token string"},"'#CCC000'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"move"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token class-name"},"Cursor"),a("span",{class:"token punctuation"},"."),t("prototype "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"move"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("x"),a("span",{class:"token punctuation"},","),t(" y")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" _this "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("commandStack"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"push"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n _this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"lineTo"),a("span",{class:"token punctuation"},"("),t("x"),a("span",{class:"token punctuation"},","),t(" y"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token function-variable function"},"lineTo"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("x"),a("span",{class:"token punctuation"},","),t(" y")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("position"),a("span",{class:"token punctuation"},"."),t("x "),a("span",{class:"token operator"},"+="),t(" x"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("position"),a("span",{class:"token punctuation"},"."),t("y "),a("span",{class:"token operator"},"+="),t(" y"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("ctx"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"lineTo"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("position"),a("span",{class:"token punctuation"},"."),t("x"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("position"),a("span",{class:"token punctuation"},"."),t("y"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token function-variable function"},"executeCommands"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("position "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),t(" x"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("width "),a("span",{class:"token operator"},"/"),t(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),t(" y"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("height "),a("span",{class:"token operator"},"/"),t(),a("span",{class:"token number"},"2"),t(),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("ctx"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"clearRect"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("width"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("height"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("ctx"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"beginPath"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("ctx"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"moveTo"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("position"),a("span",{class:"token punctuation"},"."),t("x"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("position"),a("span",{class:"token punctuation"},"."),t("y"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"var"),t(" i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("commandStack"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},";"),t(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("commandStack"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("ctx"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"stroke"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token function-variable function"},"undo"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("commandStack"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"pop"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"executeCommands"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br")])],-1),Bs=a("h3",{id:"mediator-pattern"},[a("a",{class:"header-anchor",href:"#mediator-pattern","aria-hidden":"true"},"#"),t(" Mediator Pattern")],-1),Fs=a("p",null,"一个 Mediator 对象封装对象间的协议: 中央集权的控制中心 - 所有观察者共享一个共有的被观察者(所有订阅者订阅同一个节点).",-1),Ts=a("h3",{id:"observer-pattern"},[a("a",{class:"header-anchor",href:"#observer-pattern","aria-hidden":"true"},"#"),t(" Observer Pattern")],-1),Vs=a("ul",null,[a("li",null,"被观察者(Subject)维护一组观察者列表,每当被观察者状态改变时,调用 notify 函数,此函数中调用观察者(Observer)的 update 函数(可自定义)"),a("li",null,[t("decouple subject and observer: each depends on "),a("code",null,"Abstraction"),t(" not "),a("code",null,"Implementation")])],-1),qs=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"ObserverList"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token class-name"},"ObserverList"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"Add"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"obj"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"push"),a("span",{class:"token punctuation"},"("),t("obj"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token class-name"},"ObserverList"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"Empty"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token class-name"},"ObserverList"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"Count"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token class-name"},"ObserverList"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"Get"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"index"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("index "),a("span",{class:"token operator"},">"),t(),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),t(),a("span",{class:"token operator"},"&&"),t(" index "),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList"),a("span",{class:"token punctuation"},"["),t("index"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token class-name"},"ObserverList"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"Insert"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("obj"),a("span",{class:"token punctuation"},","),t(" index")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" pointer "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("index "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"unshift"),a("span",{class:"token punctuation"},"("),t("obj"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n pointer "),a("span",{class:"token operator"},"="),t(" index"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("index "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"push"),a("span",{class:"token punctuation"},"("),t("obj"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n pointer "),a("span",{class:"token operator"},"="),t(" index"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" pointer"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token class-name"},"ObserverList"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"IndexOf"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("obj"),a("span",{class:"token punctuation"},","),t(" startIndex")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" i "),a("span",{class:"token operator"},"="),t(" startIndex"),a("span",{class:"token punctuation"},","),t("\n pointer "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"while"),t(),a("span",{class:"token punctuation"},"("),t("i "),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"==="),t(" obj"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n pointer "),a("span",{class:"token operator"},"="),t(" i"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" pointer"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token class-name"},"ObserverList"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"RemoveAt"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"index"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("index "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"shift"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("index "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList"),a("span",{class:"token punctuation"},"."),t("length "),a("span",{class:"token operator"},"-"),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"pop"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// 被观察者维护一个观察者列表"),t("\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Subject"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observers "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"ObserverList"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token class-name"},"Subject"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"AddObserver"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"observer"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observers"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"Add"),a("span",{class:"token punctuation"},"("),t("observer"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token class-name"},"Subject"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"RemoveObserver"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"observer"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observers"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"RemoveAt"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observers"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"IndexOf"),a("span",{class:"token punctuation"},"("),t("observer"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token class-name"},"Subject"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"Notify"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"context"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" observerCount "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observers"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"Count"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"var"),t(" i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(" observerCount"),a("span",{class:"token punctuation"},";"),t(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observers"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"Get"),a("span",{class:"token punctuation"},"("),t("i"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"Update"),a("span",{class:"token punctuation"},"("),t("context"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// The Observer"),t("\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Observer"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"Update"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// ..."),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token comment"},"// Extend an object with an extension"),t("\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"extend"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("extension"),a("span",{class:"token punctuation"},","),t(" obj")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"var"),t(" key "),a("span",{class:"token keyword"},"in"),t(" extension"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n obj"),a("span",{class:"token punctuation"},"["),t("key"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" extension"),a("span",{class:"token punctuation"},"["),t("key"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br"),a("span",{class:"line-number"},"58"),a("br"),a("span",{class:"line-number"},"59"),a("br"),a("span",{class:"line-number"},"60"),a("br"),a("span",{class:"line-number"},"61"),a("br"),a("span",{class:"line-number"},"62"),a("br"),a("span",{class:"line-number"},"63"),a("br"),a("span",{class:"line-number"},"64"),a("br"),a("span",{class:"line-number"},"65"),a("br"),a("span",{class:"line-number"},"66"),a("br"),a("span",{class:"line-number"},"67"),a("br"),a("span",{class:"line-number"},"68"),a("br"),a("span",{class:"line-number"},"69"),a("br"),a("span",{class:"line-number"},"70"),a("br"),a("span",{class:"line-number"},"71"),a("br"),a("span",{class:"line-number"},"72"),a("br"),a("span",{class:"line-number"},"73"),a("br"),a("span",{class:"line-number"},"74"),a("br"),a("span",{class:"line-number"},"75"),a("br"),a("span",{class:"line-number"},"76"),a("br"),a("span",{class:"line-number"},"77"),a("br"),a("span",{class:"line-number"},"78"),a("br"),a("span",{class:"line-number"},"79"),a("br"),a("span",{class:"line-number"},"80"),a("br"),a("span",{class:"line-number"},"81"),a("br"),a("span",{class:"line-number"},"82"),a("br"),a("span",{class:"line-number"},"83"),a("br"),a("span",{class:"line-number"},"84"),a("br"),a("span",{class:"line-number"},"85"),a("br"),a("span",{class:"line-number"},"86"),a("br"),a("span",{class:"line-number"},"87"),a("br"),a("span",{class:"line-number"},"88"),a("br"),a("span",{class:"line-number"},"89"),a("br"),a("span",{class:"line-number"},"90"),a("br"),a("span",{class:"line-number"},"91"),a("br")])],-1),Rs=a("h3",{id:"pub-sub-pattern"},[a("a",{class:"header-anchor",href:"#pub-sub-pattern","aria-hidden":"true"},"#"),t(" Pub-Sub Pattern")],-1),Us=a("ul",null,[a("li",null,"观察者模式中主体和观察者是互相感知"),a("li",null,"发布-订阅模式是借助第三方来实现调度, 发布者和订阅者之间互不感知")],-1),Hs=a("h4",{id:"implementation"},[a("a",{class:"header-anchor",href:"#implementation","aria-hidden":"true"},"#"),t(" Implementation")],-1),zs=a("ul",null,[a("li",null,"pubSub.js")],-1),Gs=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[t("module"),a("span",{class:"token punctuation"},"."),t("exports "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("window"),a("span",{class:"token punctuation"},","),t(" doc"),a("span",{class:"token punctuation"},","),t(" undef")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" pubSub "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"var"),t(" topics "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n subUid "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("\n\n pubSub"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"publish"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("topic"),a("span",{class:"token punctuation"},","),t(" args")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// undefined check"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),t("topics"),a("span",{class:"token punctuation"},"["),t("topic"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token boolean"},"false"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token function"},"setTimeout"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" subscribers "),a("span",{class:"token operator"},"="),t(" topics"),a("span",{class:"token punctuation"},"["),t("topic"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),t("\n len "),a("span",{class:"token operator"},"="),t(" subscribers "),a("span",{class:"token operator"},"?"),t(" subscribers"),a("span",{class:"token punctuation"},"."),t("length "),a("span",{class:"token operator"},":"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"while"),t(),a("span",{class:"token punctuation"},"("),t("len"),a("span",{class:"token operator"},"--"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n subscribers"),a("span",{class:"token punctuation"},"["),t("len"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"func"),a("span",{class:"token punctuation"},"("),t("topic"),a("span",{class:"token punctuation"},","),t(" args"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token boolean"},"true"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n pubSub"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"subscribe"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("topic"),a("span",{class:"token punctuation"},","),t(" func")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// undefined check"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),t("topics"),a("span",{class:"token punctuation"},"["),t("topic"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n topics"),a("span",{class:"token punctuation"},"["),t("topic"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// add observer to observerList (topics)"),t("\n "),a("span",{class:"token keyword"},"var"),t(" token "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"++"),t("subUid"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"toString"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n topics"),a("span",{class:"token punctuation"},"["),t("topic"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"push"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"{"),t("\n token"),a("span",{class:"token operator"},":"),t(" token"),a("span",{class:"token punctuation"},","),t("\n func"),a("span",{class:"token operator"},":"),t(" func"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(" token"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n pubSub"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"unsubscribe"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"token"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"var"),t(" m "),a("span",{class:"token keyword"},"in"),t(" topics"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("topics"),a("span",{class:"token punctuation"},"["),t("m"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"var"),t(" i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),t(" j "),a("span",{class:"token operator"},"="),t(" topics"),a("span",{class:"token punctuation"},"["),t("m"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(" j"),a("span",{class:"token punctuation"},";"),t(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("topics"),a("span",{class:"token punctuation"},"["),t("m"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),t("token "),a("span",{class:"token operator"},"==="),t(" token"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n topics"),a("span",{class:"token punctuation"},"["),t("m"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"splice"),a("span",{class:"token punctuation"},"("),t("i"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(" token"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token boolean"},"false"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" pubSub"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("document"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"undefined"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br")])],-1),Ws=a("ul",null,[a("li",null,"test.js")],-1),Qs=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"var"),t(" pubsub "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"require"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'./pubSub.js'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// add observer to observerList"),t("\n"),a("span",{class:"token keyword"},"var"),t(" testFirstSub "),a("span",{class:"token operator"},"="),t(" pubsub"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"subscribe"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'login'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("topic"),a("span",{class:"token punctuation"},","),t(" data")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n console"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),t("topic "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token string"},"': '"),t(),a("span",{class:"token operator"},"+"),t(" data"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// subject broadcast/notify, observer update"),t("\npubsub"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"publish"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'login'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'hello world!'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\npubsub"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"publish"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'login'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},"'test'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'a'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'b'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'c'"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\npubsub"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"publish"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'login'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"{"),t(" color"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token string"},"'blue'"),t(),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"{"),t(" text"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token string"},"'hello'"),t(),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token function"},"setTimeout"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n pubsub"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"unsubscribe"),a("span",{class:"token punctuation"},"("),t("testFirstSub"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// permanent subscribe"),t("\npubsub"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"subscribe"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'sum'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("topic"),a("span",{class:"token punctuation"},","),t(" data")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"toString"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"apply"),a("span",{class:"token punctuation"},"("),t("data"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"!=="),t(),a("span",{class:"token string"},"'[object Array]'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n console"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Please input array: * '"),t(),a("span",{class:"token operator"},"+"),t(" data "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token string"},"' * is not array!'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" tmp "),a("span",{class:"token operator"},"="),t(" data"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"filter"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"item"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token function"},"toString"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"apply"),a("span",{class:"token punctuation"},"("),t("item"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'[object Number]'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("tmp"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" sum "),a("span",{class:"token operator"},"="),t(" tmp"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"reduce"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("previous"),a("span",{class:"token punctuation"},","),t(" current")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" previous "),a("span",{class:"token operator"},"+"),t(" current"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n console"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Sum of '"),t(),a("span",{class:"token operator"},"+"),t(" data "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token string"},"' : '"),t(),a("span",{class:"token operator"},"+"),t(" sum"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n console"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),t("\n "),a("span",{class:"token string"},"'Please input number array: * '"),t(),a("span",{class:"token operator"},"+"),t(" data "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token string"},"' * is not number array!'"),t("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\npubsub"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"publish"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'login'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'hello again!'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\npubsub"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"publish"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'sum'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'hello again!'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\npubsub"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"publish"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'sum'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\npubsub"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"publish"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'sum'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},"'a'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'b'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'c'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'d'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'e'"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br")])],-1),Xs=a("ul",null,[a("li",null,"in jQuery")],-1),Js=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// Equivalent to subscribe(topicName, callback)"),t("\n"),a("span",{class:"token function"},"$"),a("span",{class:"token punctuation"},"("),t("document"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"on"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'topicName'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"//..perform some behavior"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// Equivalent to publish(topicName)"),t("\n"),a("span",{class:"token function"},"$"),a("span",{class:"token punctuation"},"("),t("document"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"trigger"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'topicName'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// Equivalent to unsubscribe(topicName)"),t("\n"),a("span",{class:"token function"},"$"),a("span",{class:"token punctuation"},"("),t("document"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"off"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'topicName'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br")])],-1),Ks=a("ul",null,[a("li",null,"MicroEvent.js")],-1),Ys=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/**\n * MicroEvent - to make any js object an event emitter (server or browser)\n *\n * - pure javascript - server compatible, browser compatible\n * - don't rely on the browser doms\n * - super simple - you get it immediately, no mystery, no magic involved\n *\n * - create a MicroEventDebug with goodies to debug\n * - make it safer to use\n */"),t("\n\n"),a("span",{class:"token keyword"},"var"),t(),a("span",{class:"token function-variable function"},"MicroEvent"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token class-name"},"MicroEvent"),a("span",{class:"token punctuation"},"."),t("prototype "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"bind"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("event"),a("span",{class:"token punctuation"},","),t(" fct")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events "),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events"),a("span",{class:"token punctuation"},"["),t("event"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events"),a("span",{class:"token punctuation"},"["),t("event"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events"),a("span",{class:"token punctuation"},"["),t("event"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"push"),a("span",{class:"token punctuation"},"("),t("fct"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token function-variable function"},"unbind"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("event"),a("span",{class:"token punctuation"},","),t(" fct")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events "),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("event "),a("span",{class:"token keyword"},"in"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token boolean"},"false"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token keyword"},"return"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events"),a("span",{class:"token punctuation"},"["),t("event"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"splice"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events"),a("span",{class:"token punctuation"},"["),t("event"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"indexOf"),a("span",{class:"token punctuation"},"("),t("fct"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token function-variable function"},"trigger"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),t("event "),a("span",{class:"token comment"},"/* , args... */"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events "),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("event "),a("span",{class:"token keyword"},"in"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token boolean"},"false"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token keyword"},"return"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"var"),t(" i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events"),a("span",{class:"token punctuation"},"["),t("event"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},";"),t(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events"),a("span",{class:"token punctuation"},"["),t("event"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"apply"),a("span",{class:"token punctuation"},"("),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token class-name"},"Array"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"slice"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"call"),a("span",{class:"token punctuation"},"("),t("arguments"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),t("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"/**\n * mixin will delegate all MicroEvent.js function in the destination object\n *\n * - require('MicroEvent').mixin(Foobar) will make Foobar able to use MicroEvent\n *\n * @param {Object} the object which will support MicroEvent\n */"),t("\nMicroEvent"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"mixin"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"destObject"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" props "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},"'bind'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'unbind'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'trigger'"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"var"),t(" i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(" props"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},";"),t(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"typeof"),t(" destObject "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'function'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n destObject"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"["),t("props"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token class-name"},"MicroEvent"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"["),t("props"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n destObject"),a("span",{class:"token punctuation"},"["),t("props"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token class-name"},"MicroEvent"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"["),t("props"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"return"),t(" destObject"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// export in common js"),t("\n"),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"typeof"),t(" module "),a("span",{class:"token operator"},"!=="),t(),a("span",{class:"token string"},"'undefined'"),t(),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token string"},"'exports'"),t(),a("span",{class:"token keyword"},"in"),t(" module"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n module"),a("span",{class:"token punctuation"},"."),t("exports "),a("span",{class:"token operator"},"="),t(" MicroEvent"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br"),a("span",{class:"line-number"},"58"),a("br")])],-1),Zs=a("h4",{id:"sample"},[a("a",{class:"header-anchor",href:"#sample","aria-hidden":"true"},"#"),t(" Sample")],-1),na=a("h5",{id:"ajax-callback"},[a("a",{class:"header-anchor",href:"#ajax-callback","aria-hidden":"true"},"#"),t(" Ajax Callback")],-1),sa=a("ul",null,[a("li",null,"当请求返回,并且实际的数据可用的时候,会生成一个通知"),a("li",null,"如何使用这些事件(或者返回的数据),都是由订阅者自己决定的"),a("li",null,"可以有多个不同的订阅者,以不同的方式使用返回的数据"),a("li",null,"Ajax 层: 唯一的责任 - 请求和返回数据,接着将数据发送给所有想要使用数据的地方")],-1),aa=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"$"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n\n "),a("span",{class:"token comment"},'// Pre-compile template and "cache" it using closure'),t("\n "),a("span",{class:"token keyword"},"var"),t(" resultTemplate "),a("span",{class:"token operator"},"="),t(" _"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"template"),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"$"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token string"},'"#resultTemplate"'),t(),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"html"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// Subscribe to the new search tags topic"),t("\n $"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"subscribe"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token string"},'"/search/tags"'),t(),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"function"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token parameter"},"tags"),t(),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"$"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token string"},'"#searchResults"'),t(),a("span",{class:"token punctuation"},")"),t("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"html"),a("span",{class:"token punctuation"},"("),t('"\n\n\n Searched '),a("span",{class:"token keyword"},"for"),a("span",{class:"token operator"},":"),a("span",{class:"token string"},'" + tags + "'),t('\n\n"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// Subscribe to the new results topic"),t("\n $"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"subscribe"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token string"},'"/search/resultSet"'),t(),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"function"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token parameter"},"results"),t(),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),t("\n\n "),a("span",{class:"token function"},"$"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token string"},'"#searchResults"'),t(),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"append"),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"resultTemplate"),a("span",{class:"token punctuation"},"("),t(" results "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// Submit a search query and publish tags on the /search/tags topic"),t("\n "),a("span",{class:"token function"},"$"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token string"},'"#flickrSearch"'),t(),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"submit"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token keyword"},"function"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token parameter"},"e"),t(),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n\n e"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"preventDefault"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"var"),t(" tags "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"$"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"find"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token string"},'"#query"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"val"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token operator"},"!"),t("tags "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n $"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"publish"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token string"},'"/search/tags"'),t(),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"["),t(" $"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"trim"),a("span",{class:"token punctuation"},"("),t("tags"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n\n "),a("span",{class:"token comment"},"// Subscribe to new tags being published and perform"),t("\n "),a("span",{class:"token comment"},"// a search query using them. Once data has returned"),t("\n "),a("span",{class:"token comment"},"// publish this data for the rest of the application"),t("\n "),a("span",{class:"token comment"},"// to consume"),t("\n\n $"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"subscribe"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"/search/tags"'),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"function"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token parameter"},"tags"),t(),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// Ajax Request"),t("\n $"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getJSON"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token string"},'"http://api.flickr.com/services/feeds/"'),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"{"),t("\n tags"),a("span",{class:"token operator"},":"),t(" tags"),a("span",{class:"token punctuation"},","),t("\n tagMode"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token string"},'"any"'),a("span",{class:"token punctuation"},","),t("\n format"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token string"},'"json"'),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n\n "),a("span",{class:"token keyword"},"function"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token parameter"},"data"),t(),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),t("\n\n "),a("span",{class:"token keyword"},"if"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token operator"},"!"),t("data"),a("span",{class:"token punctuation"},"."),t("items"),a("span",{class:"token punctuation"},"."),t("length "),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n $"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"publish"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token string"},'"/search/resultSet"'),t(),a("span",{class:"token punctuation"},","),t(" data"),a("span",{class:"token punctuation"},"."),t("items "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br"),a("span",{class:"line-number"},"58"),a("br"),a("span",{class:"line-number"},"59"),a("br"),a("span",{class:"line-number"},"60"),a("br"),a("span",{class:"line-number"},"61"),a("br"),a("span",{class:"line-number"},"62"),a("br")])],-1),ta=a("h2",{id:"mvc-pattern"},[a("a",{class:"header-anchor",href:"#mvc-pattern","aria-hidden":"true"},"#"),t(" MVC Pattern")],-1),ea=a("p",null,"在 MVC 中,视图位于我们架构的顶部,其背后是控制器. 模型在控制器后面,而因此我们的视图了解得到我们的控制器,而控制器了解得到模型. 这里,我们的视图有对模型的直接访问. 然而将整个模型完全暴露给视图可能会有安全和性能损失, 这取决于我们应用程序的复杂性. MVVM 则尝试去避免这些问题.",-1),oa=a("p",null,"在 MVP 中,控制器的角色被代理器所取代,代理器和视图处于同样的地位, 视图和模型的事件都被它侦听着并且接受它的调解. 不同于 MVVM,没有一个将视图绑定到视图模型的机制,因此我们转而依赖于每一个视图都实现一个允许代理器同视图去交互的接口.",-1),ca=a("p",null,"MVVM 进一步允许我们创建一个模型的特定视图子集,包含了状态和逻辑信息, 避免了将模型完全暴露给视图的必要。 不同于 MVP 的代理器,视图模型并不需要去引用一个视图。 视图可以绑定到视图模型的属性上面,视图模型则去将包含在模型中的数据暴露给视图。 像我们所提到过的,对视图的抽象意味着其背后的代码需要较少的逻辑。",-1),pa=a("h2",{id:"jquery-pattern"},[a("a",{class:"header-anchor",href:"#jquery-pattern","aria-hidden":"true"},"#"),t(" jQuery Pattern")],-1),la=a("h3",{id:"plugin-pattern"},[a("a",{class:"header-anchor",href:"#plugin-pattern","aria-hidden":"true"},"#"),t(" Plugin Pattern")],-1),ua=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"$"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n $"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"extend"),a("span",{class:"token punctuation"},"("),t("$"),a("span",{class:"token punctuation"},"."),t("fn"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"myPlugin"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// your plugin logic"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"("),t("jQuery"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),ia=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// the semi-colon before the function invocation is a safety"),t("\n"),a("span",{class:"token comment"},"// net against concatenated scripts and/or other plugins"),t("\n"),a("span",{class:"token comment"},"// that are not closed properly."),t("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("$"),a("span",{class:"token punctuation"},","),t(" window"),a("span",{class:"token punctuation"},","),t(" document"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"undefined")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// undefined is used here as the undefined global"),t("\n "),a("span",{class:"token comment"},"// variable in ECMAScript 3 and is mutable (i.e. it can"),t("\n "),a("span",{class:"token comment"},"// be changed by someone else). undefined isn't really"),t("\n "),a("span",{class:"token comment"},"// being passed in so we can ensure that its value is"),t("\n "),a("span",{class:"token comment"},"// truly undefined. In ES5, undefined can no longer be"),t("\n "),a("span",{class:"token comment"},"// modified."),t("\n\n "),a("span",{class:"token comment"},"// window and document are passed through as local"),t("\n "),a("span",{class:"token comment"},"// variables rather than as globals, because this (slightly)"),t("\n "),a("span",{class:"token comment"},"// quickens the resolution process and can be more"),t("\n "),a("span",{class:"token comment"},"// efficiently minified (especially when both are"),t("\n "),a("span",{class:"token comment"},"// regularly referenced in our plugin)."),t("\n\n "),a("span",{class:"token comment"},"// Create the defaults once"),t("\n "),a("span",{class:"token keyword"},"var"),t(" pluginName "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token string"},"'defaultPluginName'"),a("span",{class:"token punctuation"},","),t("\n defaults "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),t("\n propertyName"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token string"},"'value'"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// The actual plugin constructor"),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Plugin"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("element"),a("span",{class:"token punctuation"},","),t(" options")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("element "),a("span",{class:"token operator"},"="),t(" element"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// jQuery has an extend method that merges the"),t("\n "),a("span",{class:"token comment"},"// contents of two or more objects, storing the"),t("\n "),a("span",{class:"token comment"},"// result in the first object. The first object"),t("\n "),a("span",{class:"token comment"},"// is generally empty because we don't want to alter"),t("\n "),a("span",{class:"token comment"},"// the default options for future instances of the plugin"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("options "),a("span",{class:"token operator"},"="),t(" $"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"extend"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t(" defaults"),a("span",{class:"token punctuation"},","),t(" options"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_defaults "),a("span",{class:"token operator"},"="),t(" defaults"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_name "),a("span",{class:"token operator"},"="),t(" pluginName"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"init"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token class-name"},"Plugin"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"init"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// Place initialization logic here"),t("\n "),a("span",{class:"token comment"},"// We already have access to the DOM element and"),t("\n "),a("span",{class:"token comment"},"// the options via the instance, e.g. this.element"),t("\n "),a("span",{class:"token comment"},"// and this.options"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// A really lightweight plugin wrapper around the constructor,"),t("\n "),a("span",{class:"token comment"},"// preventing against multiple instantiations"),t("\n $"),a("span",{class:"token punctuation"},"."),t("fn"),a("span",{class:"token punctuation"},"["),t("pluginName"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"options"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"each"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),t("$"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"data"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'plugin_'"),t(),a("span",{class:"token operator"},"+"),t(" pluginName"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n $"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"data"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'plugin_'"),t(),a("span",{class:"token operator"},"+"),t(" pluginName"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Plugin"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},","),t(" options"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"("),t("jQuery"),a("span",{class:"token punctuation"},","),t(" window"),a("span",{class:"token punctuation"},","),t(" document"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br")])],-1),ra=a("h2",{id:"scalability-design"},[a("a",{class:"header-anchor",href:"#scalability-design","aria-hidden":"true"},"#"),t(" Scalability Design")],-1),ka=a("ul",null,[a("li",null,"Prefer composites over mixins."),a("li",null,"Always clone objects between components."),a("li",null,"Use namespaced state store modules."),a("li",null,"Write robust tests."),a("li",null,"Interact with REST API via services/SDK."),a("li",null,[t("Wrap third-party libraries other using them directly: "),a("ul",null,[a("li",null,"Abstract: changing dependencies without changing interface."),a("li",null,"Extendability: More obvious route to extending functionality.")])])],-1),ba=a("h2",{id:"domain-driven-design"},[a("a",{class:"header-anchor",href:"#domain-driven-design","aria-hidden":"true"},"#"),t(" Domain Driven Design")],-1),ma=a("h3",{id:"interface-layer"},[a("a",{class:"header-anchor",href:"#interface-layer","aria-hidden":"true"},"#"),t(" Interface Layer")],-1),da=a("p",null,"主要负责与外部系统进行交互与通信:",-1),ya=a("ul",null,[a("li",null,"做参数的基本处理, 比如入参校验, 回参 DTO 转换 (拆包, 组包)"),a("li",null,"Dubbo Services"),a("li",null,"RESTful API")],-1),fa=a("h3",{id:"application-layer"},[a("a",{class:"header-anchor",href:"#application-layer","aria-hidden":"true"},"#"),t(" Application Layer")],-1),ha=a("p",null,"Application Service 层只是很薄的一层, 它内部并不实现任何逻辑, 只是负责协调和转发 (流程编排), 委派业务动作给更下层的领域层.",-1),wa=a("h3",{id:"domain-layer"},[a("a",{class:"header-anchor",href:"#domain-layer","aria-hidden":"true"},"#"),t(" Domain Layer")],-1),ga=a("p",null,"Domain 层是领域模型系统的核心, 负责维护面向对象的领域模型, 几乎全部的业务逻辑都会在这一层实现. 内部主要包含 Entity, ValueObject, Domain Event, Repository.",-1),va=a("h3",{id:"infrastructure-layer"},[a("a",{class:"header-anchor",href:"#infrastructure-layer","aria-hidden":"true"},"#"),t(" Infrastructure Layer")],-1),Pa=a("p",null,"主要为 Interface, Application 和 Domain 三层提供支撑:",-1),Ca=a("ul",null,[a("li",null,"封装基础资源服务, 通过依赖注入方式解耦."),a("li",null,"Third-party tools, Message Queue, File, Cache, Database, Search etc."),a("li",null,"实现仓储接口 DB, 通常真正读写 DB.")],-1),Sa=a("h3",{id:"ddd-layout"},[a("a",{class:"header-anchor",href:"#ddd-layout","aria-hidden":"true"},"#"),t(" DDD Layout")],-1),ja=a("ul",null,[a("li",null,[a("a",{href:"https://github.com/lupguo/ddd-layout",target:"_blank",rel:"noopener noreferrer"},"DDD Layout in Golang")])],-1),Ma=a("h2",{id:"高并发系统设计"},[a("a",{class:"header-anchor",href:"#高并发系统设计","aria-hidden":"true"},"#"),t(" 高并发系统设计")],-1),xa=a("h3",{id:"concurrent-code-layer"},[a("a",{class:"header-anchor",href:"#concurrent-code-layer","aria-hidden":"true"},"#"),t(" Concurrent Code Layer")],-1),Da=a("ul",null,[a("li",null,"Mutex Performance"),a("li",null,"Database Caches"),a("li",null,"Update Merge"),a("li",null,"BloomFilter"),a("li",null,"Asynchronous"),a("li",null,"Multi-Thread")],-1),Aa=a("h3",{id:"concurrent-database-layer"},[a("a",{class:"header-anchor",href:"#concurrent-database-layer","aria-hidden":"true"},"#"),t(" Concurrent DataBase Layer")],-1),Ia=a("ul",null,[a("li",null,"DataBase Type: RDBMS -> NoSQL -> NewSQL"),a("li",null,"Table Structure Design"),a("li",null,"Index Design"),a("li",null,"Split Table"),a("li",null,"Read and Write Separation"),a("li",null,"Data Slice and Data Partition"),a("li",null,"Hot Data Cache")],-1),Na=a("h3",{id:"concurrent-architecture-layer"},[a("a",{class:"header-anchor",href:"#concurrent-architecture-layer","aria-hidden":"true"},"#"),t(" Concurrent Architecture Layer")],-1),Oa=a("ul",null,[a("li",null,"Microservices"),a("li",null,"Scale Friendly"),a("li",null,"FailFast"),a("li",null,"Data PreFetch"),a("li",null,"Multi-Level Caches")],-1),La=a("h2",{id:"高可用系统设计"},[a("a",{class:"header-anchor",href:"#高可用系统设计","aria-hidden":"true"},"#"),t(" 高可用系统设计")],-1),$a=a("h3",{id:"resource-isolation"},[a("a",{class:"header-anchor",href:"#resource-isolation","aria-hidden":"true"},"#"),t(" Resource Isolation")],-1),_a=a("h3",{id:"load-balance-design"},[a("a",{class:"header-anchor",href:"#load-balance-design","aria-hidden":"true"},"#"),t(" Load Balance Design")],-1),Ea=a("ul",null,[a("li",null,"Hardware Load Balance"),a("li",null,"Software Load Balance"),a("li",null,"Load Balance Algorithms: Random, RoundRobin, WeightRoundRobin, ConsistentHash"),a("li",null,"Error Machines Auto Detection"),a("li",null,"Error Services Auto Retirement"),a("li",null,"Services Retry Automation"),a("li",null,"Recovery Services Auto Detection")],-1),Ba=a("h3",{id:"idempotence-design"},[a("a",{class:"header-anchor",href:"#idempotence-design","aria-hidden":"true"},"#"),t(" Idempotence Design")],-1),Fa=a("p",null,"在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同.",-1),Ta=a("h4",{id:"write-idempotence-design"},[a("a",{class:"header-anchor",href:"#write-idempotence-design","aria-hidden":"true"},"#"),t(" Write Idempotence Design")],-1),Va=a("ul",null,[a("li",null,"Mutex"),a("li",null,"Key Index"),a("li",null,"Token"),a("li",null,"Data Version"),a("li",null,"State Machine")],-1),qa=a("h3",{id:"cap-theory"},[a("a",{class:"header-anchor",href:"#cap-theory","aria-hidden":"true"},"#"),t(" CAP Theory")],-1),Ra=a("p",null,"A distributed system to simultaneously provide more than two out of the following three guarantees:",-1),Ua=a("ul",null,[a("li",null,"Consistency: Every read receives the most recent write or an error."),a("li",null,"Availability: Every request receives a (non-error) response, without the guarantee that it contains the most recent write."),a("li",null,"Partition tolerance: The system continues to operate despite an arbitrary number of messages being dropped (or delayed) by the network between nodes.")],-1),Ha=a("h3",{id:"服务熔断"},[a("a",{class:"header-anchor",href:"#服务熔断","aria-hidden":"true"},"#"),t(" 服务熔断")],-1),za=a("h3",{id:"服务限流"},[a("a",{class:"header-anchor",href:"#服务限流","aria-hidden":"true"},"#"),t(" 服务限流")],-1),Ga=a("h4",{id:"服务限流算法"},[a("a",{class:"header-anchor",href:"#服务限流算法","aria-hidden":"true"},"#"),t(" 服务限流算法")],-1),Wa=a("p",null,"一定程度上可以参考计算机网络拥塞控制算法:",-1),Qa=a("ul",null,[a("li",null,"计数器固定窗口限流: 单位时间内达到阈值后开始限流, 单位时间后重新计数. 窗口临界处流量过大, 导致服务不可用."),a("li",null,"滑动窗口限流: 在固定窗口限流基础上, 将窗口向右滑动."),a("li",null,"漏斗限流: 未满前可进入, 满则拒绝. 可以平滑流量, 无法解决突发流量."),a("li",null,"令牌桶限流: 在漏斗限流基础上, 以恒定速率产生令牌. 拥有令牌可进入, 无则拒绝. 可以平滑流量, 可以容忍突发流量.")],-1),Xa=a("h4",{id:"服务限流策略"},[a("a",{class:"header-anchor",href:"#服务限流策略","aria-hidden":"true"},"#"),t(" 服务限流策略")],-1),Ja=a("ul",null,[a("li",null,"服务拒绝"),a("li",null,"延时处理"),a("li",null,"请求分级"),a("li",null,"监控预警"),a("li",null,"动态限流"),a("li",null,"动态扩容")],-1),Ka=a("h4",{id:"服务限流位置"},[a("a",{class:"header-anchor",href:"#服务限流位置","aria-hidden":"true"},"#"),t(" 服务限流位置")],-1),Ya=a("ul",null,[a("li",null,"接入层限流: 通过 Nginx/API Router 对 DNS/IP 限流."),a("li",null,"应用限流: 每个服务拥有自己的集群限流服务."),a("li",null,"基础服务限流: 对消息队列/数据库限流.")],-1),Za=a("h3",{id:"服务降级"},[a("a",{class:"header-anchor",href:"#服务降级","aria-hidden":"true"},"#"),t(" 服务降级")],-1),nt=a("h2",{id:"reference"},[a("a",{class:"header-anchor",href:"#reference","aria-hidden":"true"},"#"),t(" Reference")],-1),st=a("ul",null,[a("li",null,[a("a",{href:"http://www.dofactory.com/javascript/design-patterns",target:"_blank",rel:"noopener noreferrer"},"JavaScript Design Patterns")])],-1);o.render=function(a,t,e,o,at,tt){return n(),s("div",null,[c,p,l,u,i,r,k,b,m,d,y,f,h,w,g,v,P,C,S,j,M,x,D,A,I,N,O,L,$,_,E,B,F,T,V,q,R,U,H,z,G,W,Q,X,J,K,Y,Z,nn,sn,an,tn,en,on,cn,pn,ln,un,rn,kn,bn,mn,dn,yn,fn,hn,wn,gn,vn,Pn,Cn,Sn,jn,Mn,xn,Dn,An,In,Nn,On,Ln,$n,_n,En,Bn,Fn,Tn,Vn,qn,Rn,Un,Hn,zn,Gn,Wn,Qn,Xn,Jn,Kn,Yn,Zn,ns,ss,as,ts,es,os,cs,ps,ls,us,is,rs,ks,bs,ms,ds,ys,fs,hs,ws,gs,vs,Ps,Cs,Ss,js,Ms,xs,Ds,As,Is,Ns,Os,Ls,$s,_s,Es,Bs,Fs,Ts,Vs,qs,Rs,Us,Hs,zs,Gs,Ws,Qs,Xs,Js,Ks,Ys,Zs,na,sa,aa,ta,ea,oa,ca,pa,la,ua,ia,ra,ka,ba,ma,da,ya,fa,ha,wa,ga,va,Pa,Ca,Sa,ja,Ma,xa,Da,Aa,Ia,Na,Oa,La,$a,_a,Ea,Ba,Fa,Ta,Va,qa,Ra,Ua,Ha,za,Ga,Wa,Qa,Xa,Ja,Ka,Ya,Za,nt,st])};export default o;export{e as __pageData}; diff --git a/assets/programming_devops_designPatternsBasicNotes.md.0d5c71a8.lean.js b/assets/programming_devops_designPatternsBasicNotes.md.0d5c71a8.lean.js new file mode 100644 index 00000000000..32c8b5911ba --- /dev/null +++ b/assets/programming_devops_designPatternsBasicNotes.md.0d5c71a8.lean.js @@ -0,0 +1 @@ +import{o as n,c as s,b as a,d as t}from"./app.6dd2a1b7.js";const e='{"title":"Design Patterns Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Basic Patterns","slug":"basic-patterns"},{"level":3,"title":"SOLID Principles","slug":"solid-principles"},{"level":3,"title":"Literal Pattern","slug":"literal-pattern"},{"level":3,"title":"Closure and IIFE","slug":"closure-and-iife"},{"level":3,"title":"Check Pattern","slug":"check-pattern"},{"level":3,"title":"函数(function)","slug":"函数-function"},{"level":3,"title":"解耦","slug":"解耦"},{"level":3,"title":"Env and Config","slug":"env-and-config"},{"level":3,"title":"Stand Library Idioms","slug":"stand-library-idioms"},{"level":3,"title":"Other","slug":"other"},{"level":2,"title":"Modular Patterns","slug":"modular-patterns"},{"level":3,"title":"Object Literal","slug":"object-literal"},{"level":3,"title":"IIFE Pattern","slug":"iife-pattern"},{"level":3,"title":"UMD Pattern","slug":"umd-pattern"},{"level":2,"title":"Common Design Patterns","slug":"common-design-patterns"},{"level":3,"title":"Classification","slug":"classification"},{"level":3,"title":"Prototype","slug":"prototype"},{"level":3,"title":"Bridge","slug":"bridge"},{"level":3,"title":"Composite","slug":"composite"},{"level":3,"title":"Strategy","slug":"strategy"},{"level":3,"title":"State","slug":"state"},{"level":3,"title":"Iterator","slug":"iterator"},{"level":3,"title":"IOC and DI","slug":"ioc-and-di"},{"level":3,"title":"Class Pattern","slug":"class-pattern"},{"level":3,"title":"Mix-In Pattern","slug":"mix-in-pattern"},{"level":3,"title":"Singleton Pattern","slug":"singleton-pattern"},{"level":3,"title":"Abstract Factory","slug":"abstract-factory"},{"level":3,"title":"Factory Method","slug":"factory-method"},{"level":3,"title":"Adapter Pattern","slug":"adapter-pattern"},{"level":3,"title":"Decorator Pattern","slug":"decorator-pattern"},{"level":3,"title":"Facade Pattern","slug":"facade-pattern"},{"level":3,"title":"Flyweight Pattern","slug":"flyweight-pattern"},{"level":3,"title":"Proxy Pattern","slug":"proxy-pattern"},{"level":3,"title":"Command Pattern","slug":"command-pattern"},{"level":3,"title":"Mediator Pattern","slug":"mediator-pattern"},{"level":3,"title":"Observer Pattern","slug":"observer-pattern"},{"level":3,"title":"Pub-Sub Pattern","slug":"pub-sub-pattern"},{"level":2,"title":"MVC Pattern","slug":"mvc-pattern"},{"level":2,"title":"jQuery Pattern","slug":"jquery-pattern"},{"level":3,"title":"Plugin Pattern","slug":"plugin-pattern"},{"level":2,"title":"Scalability Design","slug":"scalability-design"},{"level":2,"title":"Domain Driven Design","slug":"domain-driven-design"},{"level":3,"title":"Interface Layer","slug":"interface-layer"},{"level":3,"title":"Application Layer","slug":"application-layer"},{"level":3,"title":"Domain Layer","slug":"domain-layer"},{"level":3,"title":"Infrastructure Layer","slug":"infrastructure-layer"},{"level":3,"title":"DDD Layout","slug":"ddd-layout"},{"level":2,"title":"高并发系统设计","slug":"高并发系统设计"},{"level":3,"title":"Concurrent Code Layer","slug":"concurrent-code-layer"},{"level":3,"title":"Concurrent DataBase Layer","slug":"concurrent-database-layer"},{"level":3,"title":"Concurrent Architecture Layer","slug":"concurrent-architecture-layer"},{"level":2,"title":"高可用系统设计","slug":"高可用系统设计"},{"level":3,"title":"Resource Isolation","slug":"resource-isolation"},{"level":3,"title":"Load Balance Design","slug":"load-balance-design"},{"level":3,"title":"Idempotence Design","slug":"idempotence-design"},{"level":3,"title":"CAP Theory","slug":"cap-theory"},{"level":3,"title":"服务熔断","slug":"服务熔断"},{"level":3,"title":"服务限流","slug":"服务限流"},{"level":3,"title":"服务降级","slug":"服务降级"},{"level":2,"title":"Reference","slug":"reference"}],"relativePath":"programming/devops/designPatternsBasicNotes.md","lastUpdated":1627735972000}',o={},c=a("h1",{id:"design-patterns-basic-notes"},[a("a",{class:"header-anchor",href:"#design-patterns-basic-notes","aria-hidden":"true"},"#"),t(" Design Patterns Basic Notes")],-1),p=a("p",null,[a("div",{class:"table-of-contents"},[a("ul",null,[a("li",null,[a("a",{href:"#design-patterns-basic-notes"},"Design Patterns Basic Notes"),a("ul",null,[a("li",null,[a("a",{href:"#basic-patterns"},"Basic Patterns")]),a("li",null,[a("a",{href:"#modular-patterns"},"Modular Patterns")]),a("li",null,[a("a",{href:"#common-design-patterns"},"Common Design Patterns")]),a("li",null,[a("a",{href:"#mvc-pattern"},"MVC Pattern")]),a("li",null,[a("a",{href:"#jquery-pattern"},"jQuery Pattern")]),a("li",null,[a("a",{href:"#scalability-design"},"Scalability Design")]),a("li",null,[a("a",{href:"#domain-driven-design"},"Domain Driven Design")]),a("li",null,[a("a",{href:"#高并发系统设计"},"高并发系统设计")]),a("li",null,[a("a",{href:"#高可用系统设计"},"高可用系统设计")]),a("li",null,[a("a",{href:"#reference"},"Reference")])])])])])],-1),l=a("h2",{id:"basic-patterns"},[a("a",{class:"header-anchor",href:"#basic-patterns","aria-hidden":"true"},"#"),t(" Basic Patterns")],-1),u=a("h3",{id:"solid-principles"},[a("a",{class:"header-anchor",href:"#solid-principles","aria-hidden":"true"},"#"),t(" SOLID Principles")],-1),i=a("ul",null,[a("li",null,"Single Responsibility Principle 单一功能原则"),a("li",null,"Open-closed Principle 开闭原则"),a("li",null,"Liskov Substitution Principle 里氏替换原则"),a("li",null,"Interface Segregation Principle 接口隔离原则"),a("li",null,"Dependency Inversion Principle 依赖反转原则")],-1),r=a("blockquote",null,[a("p",null,"SOLID Principles")],-1),k=a("ul",null,[a("li",null,"单一职责是所有设计原则的基础"),a("li",null,"开闭原则是设计的终极目标"),a("li",null,"里氏替换原则强调的是子类替换父类后程序运行时的正确性, 它用来帮助实现开闭原则"),a("li",null,"接口隔离原则用来帮助实现里氏替换原则, 同时它也体现了单一职责"),a("li",null,"依赖倒置原则是过程式设计与面向对象设计的分水岭, 同时它也被用来指导接口隔离原则")],-1),b=a("h4",{id:"single-responsibility-principle"},[a("a",{class:"header-anchor",href:"#single-responsibility-principle","aria-hidden":"true"},"#"),t(" Single Responsibility Principle")],-1),m=a("p",null,"Too much functionality is in one class and you modify a piece of it, it can be difficult to understand how that will affect other dependent modules.",-1),d=a("h4",{id:"open-closed-principle"},[a("a",{class:"header-anchor",href:"#open-closed-principle","aria-hidden":"true"},"#"),t(" Open-Closed Principle")],-1),y=a("p",null,"Allow users to add new functionalities without changing existing code, open for extension, close for modification.",-1),f=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),t(),a("span",{class:"token class-name"},"Coder"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"constructor"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("fullName"),a("span",{class:"token punctuation"},","),t(" language"),a("span",{class:"token punctuation"},","),t(" hobby"),a("span",{class:"token punctuation"},","),t(" education"),a("span",{class:"token punctuation"},","),t(" workplace"),a("span",{class:"token punctuation"},","),t(" position")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("fullName "),a("span",{class:"token operator"},"="),t(" fullName"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("language "),a("span",{class:"token operator"},"="),t(" language"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("hobby "),a("span",{class:"token operator"},"="),t(" hobby"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("education "),a("span",{class:"token operator"},"="),t(" education"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("workplace "),a("span",{class:"token operator"},"="),t(" workplace"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("position "),a("span",{class:"token operator"},"="),t(" position"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token comment"},"// BAD: filter by any other new property have to change CodeFilter's code."),t("\n"),a("span",{class:"token keyword"},"class"),t(),a("span",{class:"token class-name"},"CoderFilter"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"filterByName"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("coders"),a("span",{class:"token punctuation"},","),t(" fullName")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" coders"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"filter"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"coder"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"=>"),t(" coder"),a("span",{class:"token punctuation"},"."),t("fullName "),a("span",{class:"token operator"},"==="),t(" fullName"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token function"},"filterByLang"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("coders"),a("span",{class:"token punctuation"},","),t(" language")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" coders"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"filter"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"coder"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"=>"),t(" coder"),a("span",{class:"token punctuation"},"."),t("language "),a("span",{class:"token operator"},"==="),t(" language"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token function"},"filterByHobby"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("coders"),a("span",{class:"token punctuation"},","),t(" hobby")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" coders"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"filter"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"coder"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"=>"),t(" coder"),a("span",{class:"token punctuation"},"."),t("hobby "),a("span",{class:"token operator"},"==="),t(" hobby"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token comment"},"// GOOD"),t("\n"),a("span",{class:"token keyword"},"class"),t(),a("span",{class:"token class-name"},"CoderFilter"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"filterByProp"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("array"),a("span",{class:"token punctuation"},","),t(" propName"),a("span",{class:"token punctuation"},","),t(" value")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"=>"),t("\n array"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"filter"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"element"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"=>"),t(" element"),a("span",{class:"token punctuation"},"["),t("propName"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"==="),t(" value"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br")])],-1),h=a("h4",{id:"liskov-substitution-principle"},[a("a",{class:"header-anchor",href:"#liskov-substitution-principle","aria-hidden":"true"},"#"),t(" Liskov Substitution Principle")],-1),w=a("p",null,"Objects of ParentType can be replaced with objects of SubType without altering. Altering shows that SubType should not be subtype of ParentType (break Open Closed Principle), you should re-design ParentType and SubType.",-1),g=a("h4",{id:"interface-segregation-principle"},[a("a",{class:"header-anchor",href:"#interface-segregation-principle","aria-hidden":"true"},"#"),t(" Interface Segregation Principle")],-1),v=a("p",null,"Clients should not be forced to depend upon interfaces that they do not use.",-1),P=a("h4",{id:"dependency-inversion-principle"},[a("a",{class:"header-anchor",href:"#dependency-inversion-principle","aria-hidden":"true"},"#"),t(" Dependency Inversion Principle")],-1),C=a("ul",null,[a("li",null,"High-level modules should not depend on low-level modules. Both should depend on abstractions."),a("li",null,"Abstractions should not depend upon details. Details should depend on abstractions."),a("li",null,[t("Pros: "),a("ul",null,[a("li",null,"Loosely coupled modules."),a("li",null,"Better reusability."),a("li",null,"Better testability.")])])],-1),S=a("h3",{id:"literal-pattern"},[a("a",{class:"header-anchor",href:"#literal-pattern","aria-hidden":"true"},"#"),t(" Literal Pattern")],-1),j=a("ul",null,[a("li",null,"不要使用 new Boolean()/new Number()/new String()"),a("li",null,"避免使用 new Object()/new Array()")],-1),M=a("h3",{id:"closure-and-iife"},[a("a",{class:"header-anchor",href:"#closure-and-iife","aria-hidden":"true"},"#"),t(" Closure and IIFE")],-1),x=a("h3",{id:"check-pattern"},[a("a",{class:"header-anchor",href:"#check-pattern","aria-hidden":"true"},"#"),t(" Check Pattern")],-1),D=a("ul",null,[a("li",null,[a("code",null,"O || {}"),t(),a("code",null,"O || (O = {})")]),a("li",null,[a("code",null,"if (O && O.property)")]),a("li",null,[a("code",null,'if (typeof v === " ")')]),a("li",null,[a("code",null,"toString. apply(var)")])],-1),A=a("h3",{id:"函数-function"},[a("a",{class:"header-anchor",href:"#函数-function","aria-hidden":"true"},"#"),t(" 函数(function)")],-1),I=a("h4",{id:"参数"},[a("a",{class:"header-anchor",href:"#参数","aria-hidden":"true"},"#"),t(" 参数")],-1),N=a("ul",null,[a("li",null,"函数不应依赖于全局变量,实现与执行全局环境的的解耦"),a("li",null,"全局变量应以函数参数/依赖的形式,注入函数内部")],-1),O=a("h3",{id:"解耦"},[a("a",{class:"header-anchor",href:"#解耦","aria-hidden":"true"},"#"),t(" 解耦")],-1),L=a("h4",{id:"事件处理与-ui-逻辑"},[a("a",{class:"header-anchor",href:"#事件处理与-ui-逻辑","aria-hidden":"true"},"#"),t(" 事件处理与 UI 逻辑")],-1),$=a("ul",null,[a("li",null,"事件处理函数与应用逻辑函数分开成单独函数,提高代码重用率"),a("li",null,"应用逻辑函数不依赖于 event 对象,其属性值作为参数传入,易于解耦与测试")],-1),_=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"const"),t(" MyApp "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),t("\n\n "),a("span",{class:"token comment"},"// 事件处理函数"),t("\n "),a("span",{class:"token function-variable function"},"handleClick"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"event"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n\n "),a("span",{class:"token comment"},"/* 将事件的属性作为参数,传递给应用逻辑函数\n * 使得应用逻辑函数不依赖于 event 对象,易于解耦与测试\n */"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"showPopup"),a("span",{class:"token punctuation"},"("),t("event"),a("span",{class:"token punctuation"},"."),t("clientX"),a("span",{class:"token punctuation"},","),t(" event"),a("span",{class:"token punctuation"},"."),t("clientY"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// 应用逻辑函数"),t("\n "),a("span",{class:"token function-variable function"},"showPopup"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("x"),a("span",{class:"token punctuation"},","),t(" y")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"const"),t(" popup "),a("span",{class:"token operator"},"="),t(" document"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getElementById"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'popup'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n popup"),a("span",{class:"token punctuation"},"."),t("style"),a("span",{class:"token punctuation"},"."),t("left "),a("span",{class:"token operator"},"="),t(" x "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token string"},"'px'"),a("span",{class:"token punctuation"},";"),t("\n popup"),a("span",{class:"token punctuation"},"."),t("style"),a("span",{class:"token punctuation"},"."),t("top "),a("span",{class:"token operator"},"="),t(" y "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token string"},"'px'"),a("span",{class:"token punctuation"},";"),t("\n popup"),a("span",{class:"token punctuation"},"."),t("className "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token string"},"'reveal'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br")])],-1),E=a("h3",{id:"env-and-config"},[a("a",{class:"header-anchor",href:"#env-and-config","aria-hidden":"true"},"#"),t(" Env and Config")],-1),B=a("p",null,"配置文件以 .env/JS(Object)/JSON/JSONP/XML/YML 格式单独存放,方便读取",-1),F=a("h3",{id:"stand-library-idioms"},[a("a",{class:"header-anchor",href:"#stand-library-idioms","aria-hidden":"true"},"#"),t(" Stand Library Idioms")],-1),T=a("ul",null,[a("li",null,[t("use "),a("code",null,"Number.isNaN"),t(" not "),a("code",null,"isNaN")]),a("li",null,[t("use "),a("code",null,"Number.isFinite"),t(" not "),a("code",null,"isFinite")])],-1),V=a("h3",{id:"other"},[a("a",{class:"header-anchor",href:"#other","aria-hidden":"true"},"#"),t(" Other")],-1),q=a("p",null,"!!result 转化成 Boolean",-1),R=a("h2",{id:"modular-patterns"},[a("a",{class:"header-anchor",href:"#modular-patterns","aria-hidden":"true"},"#"),t(" Modular Patterns")],-1),U=a("h3",{id:"object-literal"},[a("a",{class:"header-anchor",href:"#object-literal","aria-hidden":"true"},"#"),t(" Object Literal")],-1),H=a("p",null,"通过对象字面量创建命名空间",-1),z=a("div",{class:"language-javascript line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token constant"},"APP"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"namespace"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"namespaceString"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" parts "),a("span",{class:"token operator"},"="),t(" namespaceString"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"split"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'.'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),t("\n parent "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token constant"},"APP"),a("span",{class:"token punctuation"},","),t("\n i"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token comment"},"// strip redundant leading global"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("parts"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'APP'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// remove leading global"),t("\n parts "),a("span",{class:"token operator"},"="),t(" parts"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"slice"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),t("i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(" parts"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"+="),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// create a property if it doesn't exist"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"typeof"),t(" parent"),a("span",{class:"token punctuation"},"["),t("parts"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'undefined'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n parent"),a("span",{class:"token punctuation"},"["),t("parts"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token comment"},"//关键: 向内嵌套"),t("\n parent "),a("span",{class:"token operator"},"="),t(" parent"),a("span",{class:"token punctuation"},"["),t("parts"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token comment"},"// 返回最内层模块"),t("\n "),a("span",{class:"token keyword"},"return"),t(" parent"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br")])],-1),G=a("div",{class:"language-javascript line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// assign returned value to a local var"),t("\n"),a("span",{class:"token keyword"},"var"),t(" module2 "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token constant"},"APP"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"namespace"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'APP.modules.module2'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\nmodule2 "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token constant"},"APP"),a("span",{class:"token punctuation"},"."),t("modules"),a("span",{class:"token punctuation"},"."),t("module2"),a("span",{class:"token punctuation"},";"),t(),a("span",{class:"token comment"},"// true"),t("\n"),a("span",{class:"token comment"},"// skip initial `APP`"),t("\n"),a("span",{class:"token constant"},"APP"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"namespace"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'modules.module51'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token comment"},"// long namespace"),t("\n"),a("span",{class:"token constant"},"APP"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"namespace"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'once.upon.a.time.there.was.this.long.nested.property'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),W=a("h3",{id:"iife-pattern"},[a("a",{class:"header-anchor",href:"#iife-pattern","aria-hidden":"true"},"#"),t(" IIFE Pattern")],-1),Q=a("p",null,"立即函数模式, 通过调用立即函数,返回一个对象,暴露(exposed to public)公共接口(特权/公共方法):",-1),X=a("ul",null,[a("li",null,"闭包: 定义私有变量与特权方法"),a("li",null,"返回对象: 即使通过外部代码改变返回对象的接口,也不会影响原接口")],-1),J=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"var"),t(" obj "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// private member"),t("\n "),a("span",{class:"token keyword"},"var"),t(" name "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token string"},'"tazimi"'),a("span",{class:"token punctuation"},","),t("\n\n "),a("span",{class:"token comment"},"// private method"),t("\n "),a("span",{class:"token comment"},"// excluded in return object"),t("\n\n "),a("span",{class:"token comment"},"// privileged method"),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"getName"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" name"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"setName"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"n"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"typeof"),t(" n "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'string'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n name "),a("span",{class:"token operator"},"="),t(" n"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n\n "),a("span",{class:"token comment"},"// public method"),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"logName"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n console"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),t("name"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// 闭包"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// 公共接口: 特权/公共方法"),t("\n\n "),a("span",{class:"token comment"},"// 特权方法"),t("\n getName"),a("span",{class:"token operator"},":"),t(" getName"),a("span",{class:"token punctuation"},","),t("\n setName"),a("span",{class:"token operator"},":"),t(" setName"),a("span",{class:"token punctuation"},","),t("\n\n "),a("span",{class:"token comment"},"// 公共方法"),t("\n log"),a("span",{class:"token operator"},":"),t(" logName"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br")])],-1),K=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"var"),t(" App "),a("span",{class:"token operator"},"="),t(" App "),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\nApp"),a("span",{class:"token punctuation"},"."),t("utils "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" val "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"getValue"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" val"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"setValue"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"newVal"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n val "),a("span",{class:"token operator"},"="),t(" newVal"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// also introduce a new sub-namespace"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("tools "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"apply"),a("span",{class:"token punctuation"},"("),t("App"),a("span",{class:"token punctuation"},"."),t("utils"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// inject new behavior into the tools namespace"),t("\n"),a("span",{class:"token comment"},"// which we defined via the utilities module"),t("\n\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"diagnose"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token string"},"'diagnosis'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"apply"),a("span",{class:"token punctuation"},"("),t("App"),a("span",{class:"token punctuation"},"."),t("utils"),a("span",{class:"token punctuation"},"."),t("tools"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br")])],-1),Y=a("ul",null,[a("li",null,"jQuery Plugin Pattern: 通过给立即函数传参,注入全局变量/其他依赖")],-1),Z=a("h3",{id:"umd-pattern"},[a("a",{class:"header-anchor",href:"#umd-pattern","aria-hidden":"true"},"#"),t(" UMD Pattern")],-1),nn=a("p",null,"Universal Module Definition:",-1),sn=a("ul",null,[a("li",null,"先判断是否支持 Node.js 的模块(exports),存在则使用 Node.js 模块模式"),a("li",null,"再判断是否支持 AMD(define),存在则使用 AMD 方式加载模块")],-1),an=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("window"),a("span",{class:"token punctuation"},","),t(" factory")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"typeof"),t(" exports "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'object'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n module"),a("span",{class:"token punctuation"},"."),t("exports "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"factory"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"typeof"),t(" define "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'function'"),t(),a("span",{class:"token operator"},"&&"),t(" define"),a("span",{class:"token punctuation"},"."),t("amd"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"define"),a("span",{class:"token punctuation"},"("),t("factory"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n window"),a("span",{class:"token punctuation"},"."),t("eventUtil "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"factory"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"//module ..."),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),tn=a("h2",{id:"common-design-patterns"},[a("a",{class:"header-anchor",href:"#common-design-patterns","aria-hidden":"true"},"#"),t(" Common Design Patterns")],-1),en=a("p",null,[a("img",{src:"/awesome-notes/assets/DesignPatterns.df4b7baf.png",alt:"Common Design Patterns"})],-1),on=a("h3",{id:"classification"},[a("a",{class:"header-anchor",href:"#classification","aria-hidden":"true"},"#"),t(" Classification")],-1),cn=a("h4",{id:"creation-patterns"},[a("a",{class:"header-anchor",href:"#creation-patterns","aria-hidden":"true"},"#"),t(" Creation Patterns")],-1),pn=a("ul",null,[a("li",null,"Factory Method(工厂方法) | 通过将数据和事件接口化来构建若干个子类。"),a("li",null,"Abstract Factory(抽象工厂) | 建立若干族类的一个实例,这个实例不需要具体类的细节信息。(抽象类)"),a("li",null,"Builder(建造者) | 将对象的构建方法和其表现形式分离开来,总是构建相同类型的对象。"),a("li",null,"Prototype(原型) | 一个完全初始化的实例,用于拷贝或者克隆。"),a("li",null,"Singleton(单例) | 一个类只有唯一的一个实例,这个实例在整个程序中有一个全局的访问点。")],-1),ln=a("h4",{id:"structural-patterns"},[a("a",{class:"header-anchor",href:"#structural-patterns","aria-hidden":"true"},"#"),t(" Structural Patterns")],-1),un=a("ul",null,[a("li",null,"Adapter(适配器) : 将不同类的接口进行匹配,调整,这样尽管内部接口不兼容但是不同的类还是可以协同工作的。"),a("li",null,"Bridge(桥接模式) : 将对象的接口从其实现中分离出来,这样对象的实现和接口可以独立的变化。"),a("li",null,"Composite(组合模式) : 通过将简单可组合的对象组合起来,构成一个完整的对象,这个对象的能力将会超过这些组成部分的能力的总和,即会有新的能力产生。"),a("li",null,"Decorator(装饰器) : 动态给对象增加一些可替换的处理流程。"),a("li",null,"Facade(外观模式) : 一个类隐藏了内部子系统的复杂度,只暴露出一些简单的接口。"),a("li",null,"Flyweight(享元模式) : 一个细粒度对象,用于将包含在其它地方的信息 在不同对象之间高效地共享。"),a("li",null,"Proxy(代理模式) : 一个充当占位符的对象用来代表一个真实的对象。")],-1),rn=a("h4",{id:"behavioral-patterns"},[a("a",{class:"header-anchor",href:"#behavioral-patterns","aria-hidden":"true"},"#"),t(" Behavioral Patterns")],-1),kn=a("ul",null,[a("li",null,"Interpreter(解释器) : 将语言元素包含在一个应用中的一种方式,用于匹配目标语言的语法。"),a("li",null,"Template Method(模板方法) : 在一个方法中为某个算法建立一层外壳,将算法的具体步骤交付给子类去做。"),a("li",null,"Chain of Responsibility(响应链) : 一种将请求在一串对象中传递的方式,寻找可以处理这个请求的对象。"),a("li",null,"Command(命令) : 封装命令请求为一个对象,从而使记录日志,队列缓存请求,未处理请求进行错误处理 这些功能称为可能。"),a("li",null,"Iterator(迭代器) : 在不需要直到集合内部工作原理的情况下,顺序访问一个集合里面的元素。"),a("li",null,"Mediator(中介者模式) : 在类之间定义简化的通信方式,用于避免类之间显式的持有彼此的引用。"),a("li",null,"Observer(观察者模式) : 用于将变化通知给多个类的方式,可以保证类之间的一致性。"),a("li",null,"State(状态) : 当对象状态改变时,改变对象的行为。"),a("li",null,"Strategy(策略) : 将算法封装到类中,将选择和实现分离开来。"),a("li",null,"Visitor(访问者) : 为类增加新的操作而不改变类本身。")],-1),bn=a("h3",{id:"prototype"},[a("a",{class:"header-anchor",href:"#prototype","aria-hidden":"true"},"#"),t(" Prototype")],-1),mn=a("p",null,"关键方法 clone()",-1),dn=a("h3",{id:"bridge"},[a("a",{class:"header-anchor",href:"#bridge","aria-hidden":"true"},"#"),t(" Bridge")],-1),yn=a("p",null,"分离抽象和实现/分离对象的两种不同属性",-1),fn=a("p",null,"e.g 从 2 个不同维度上扩展对象",-1),hn=a("h3",{id:"composite"},[a("a",{class:"header-anchor",href:"#composite","aria-hidden":"true"},"#"),t(" Composite")],-1),wn=a("p",null,"树形结构:",-1),gn=a("ul",null,[a("li",null,[t("根结点 "),a("ul",null,[a("li",null,"Component 抽象对象/接口 采用最大宽接口,定义内点和叶点的操作"),a("li",null,"将内点特有的操作集设为缺省操作集(空实现)")])]),a("li",null,[t("内点 "),a("ul",null,[a("li",null,"持有父结点和子节点的引用(可使用 Flyweight 模式实现共享)"),a("li",null,"操作集:内点操作集(可添加/删除组件)")])]),a("li",null,[t("叶点 "),a("ul",null,[a("li",null,"持有父结点引用"),a("li",null,"操作集:叶点操作集(不可添加/删除组件)")])])],-1),vn=a("h3",{id:"strategy"},[a("a",{class:"header-anchor",href:"#strategy","aria-hidden":"true"},"#"),t(" Strategy")],-1),Pn=a("p",null,"改变对象的内核/算法, 一个 Strategy 对象封装一个算法",-1),Cn=a("h3",{id:"state"},[a("a",{class:"header-anchor",href:"#state","aria-hidden":"true"},"#"),t(" State")],-1),Sn=a("p",null,"一个 State 对象封装一个与状态相关的行为",-1),jn=a("h3",{id:"iterator"},[a("a",{class:"header-anchor",href:"#iterator","aria-hidden":"true"},"#"),t(" Iterator")],-1),Mn=a("p",null,"一个 Iterator 对象封装访问和遍历一个聚集对象中的各个构件的方法",-1),xn=a("h3",{id:"ioc-and-di"},[a("a",{class:"header-anchor",href:"#ioc-and-di","aria-hidden":"true"},"#"),t(" IOC and DI")],-1),Dn=a("ul",null,[a("li",null,"IOC (inversion of control) 控制反转模式;控制反转是将组件间的依赖关系从程序内部提到外部来管理"),a("li",null,"DI (dependency injection) 依赖注入模式;依赖注入是指将组件的依赖通过外部以参数或其他形式注入")],-1),An=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),t(),a("span",{class:"token class-name"},"DbMysql"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"public"),t(" function "),a("span",{class:"token function"},"query"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token keyword"},"class"),t(),a("span",{class:"token class-name"},"Controller"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"public"),t(" $db"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"public"),t(" function "),a("span",{class:"token function"},"__construct"),a("span",{class:"token punctuation"},"("),t("$dbMysql"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n $"),a("span",{class:"token keyword"},"this"),a("span",{class:"token operator"},"->"),t("db "),a("span",{class:"token operator"},"="),t(" $dbMysql"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"public"),t(" function "),a("span",{class:"token function"},"action"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),t("\n $"),a("span",{class:"token keyword"},"this"),a("span",{class:"token operator"},"->"),t("db"),a("span",{class:"token operator"},"->"),a("span",{class:"token function"},"query"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n$db "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"DbMysql"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n$c "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Controller"),a("span",{class:"token punctuation"},"("),t("$db"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n$c"),a("span",{class:"token operator"},"->"),a("span",{class:"token function"},"action"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br")])],-1),In=a("p",null,"With IOC container:",-1),Nn=a("div",{class:"language-java line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"class"),t(),a("span",{class:"token class-name"},"DbMysql"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"public"),t(" function "),a("span",{class:"token function"},"__construct"),a("span",{class:"token punctuation"},"("),t("$host"),a("span",{class:"token punctuation"},","),t(" $name"),a("span",{class:"token punctuation"},","),t(" $pwd"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// do something"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"public"),t(" function "),a("span",{class:"token function"},"query"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n echo __METHOD__ "),a("span",{class:"token punctuation"},"."),t(" PHP_EOL"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token keyword"},"class"),t(),a("span",{class:"token class-name"},"DbRedis"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"public"),t(" function "),a("span",{class:"token function"},"__construct"),a("span",{class:"token punctuation"},"("),t("$host"),a("span",{class:"token punctuation"},","),t(" $name"),a("span",{class:"token punctuation"},","),t(" $pwd"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// do something"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"public"),t(" function "),a("span",{class:"token function"},"set"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n echo __METHOD__ "),a("span",{class:"token punctuation"},"."),t(" PHP_EOL"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token keyword"},"class"),t(" controller "),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"public"),t(" $mysql"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"public"),t(" $redis"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"public"),t(" function "),a("span",{class:"token function"},"__construct"),a("span",{class:"token punctuation"},"("),t("$mysql"),a("span",{class:"token punctuation"},","),t(" $redis"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n $"),a("span",{class:"token keyword"},"this"),a("span",{class:"token operator"},"->"),t("mysql "),a("span",{class:"token operator"},"="),t(" $mysql"),a("span",{class:"token punctuation"},";"),t("\n $"),a("span",{class:"token keyword"},"this"),a("span",{class:"token operator"},"->"),t("redis "),a("span",{class:"token operator"},"="),t(" $redis"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"public"),t(" function "),a("span",{class:"token function"},"action"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n $"),a("span",{class:"token keyword"},"this"),a("span",{class:"token operator"},"->"),t("mysql"),a("span",{class:"token operator"},"->"),a("span",{class:"token function"},"query"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n $"),a("span",{class:"token keyword"},"this"),a("span",{class:"token operator"},"->"),t("redis"),a("span",{class:"token operator"},"->"),a("span",{class:"token function"},"set"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n\n"),a("span",{class:"token keyword"},"class"),t(),a("span",{class:"token class-name"},"Container"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"public"),t(" $bindings "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"public"),t(" function "),a("span",{class:"token function"},"bind"),a("span",{class:"token punctuation"},"("),t("$key"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token class-name"},"Closure"),t(" $value"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n $"),a("span",{class:"token keyword"},"this"),a("span",{class:"token operator"},"->"),t("bindings"),a("span",{class:"token punctuation"},"["),t("$key"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" $value"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"public"),t(" function "),a("span",{class:"token function"},"make"),a("span",{class:"token punctuation"},"("),t("$key"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n $"),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token operator"},"="),t(" $"),a("span",{class:"token keyword"},"this"),a("span",{class:"token operator"},"->"),t("bindings"),a("span",{class:"token punctuation"},"["),t("$key"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(" $"),a("span",{class:"token keyword"},"new"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n$app "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Container"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n$app"),a("span",{class:"token operator"},"->"),a("span",{class:"token function"},"bind"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'mysql'"),a("span",{class:"token punctuation"},","),t(" function "),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t(),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"DbMysql"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'host'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'name'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'pwd'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t(),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n$app"),a("span",{class:"token operator"},"->"),a("span",{class:"token function"},"bind"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'redis'"),a("span",{class:"token punctuation"},","),t(" function "),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t(),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"DbRedis"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'host'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'name'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'pwd'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t(),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n$app"),a("span",{class:"token operator"},"->"),a("span",{class:"token function"},"bind"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'controller'"),a("span",{class:"token punctuation"},","),t(" function "),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(" use "),a("span",{class:"token punctuation"},"("),t("$app"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Controller"),a("span",{class:"token punctuation"},"("),t("$app"),a("span",{class:"token operator"},"->"),a("span",{class:"token function"},"make"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'mysql'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),t(" $app"),a("span",{class:"token operator"},"->"),a("span",{class:"token function"},"make"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'redis'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n$controller "),a("span",{class:"token operator"},"="),t(" $app"),a("span",{class:"token operator"},"->"),a("span",{class:"token function"},"make"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'controller'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n$controller"),a("span",{class:"token operator"},"->"),a("span",{class:"token function"},"action"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token comment"},"/** * 输出: * DbMysql::query * DbRedis::set */"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br")])],-1),On=a("p",null,"With dependency injection:",-1),Ln=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// dependency provider"),t("\n"),a("span",{class:"token keyword"},"export"),t(),a("span",{class:"token keyword"},"interface"),t(),a("span",{class:"token class-name"},"IProvider"),a("span",{class:"token operator"},"<"),a("span",{class:"token constant"},"T"),a("span",{class:"token operator"},">"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"provide"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token constant"},"T"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n@"),a("span",{class:"token function"},"injectable"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t("\n"),a("span",{class:"token keyword"},"export"),t(),a("span",{class:"token keyword"},"class"),t(),a("span",{class:"token class-name"},"NameProvider"),t(),a("span",{class:"token keyword"},"implements"),t(),a("span",{class:"token class-name"},"IProvider"),a("span",{class:"token operator"},"<"),t("string"),a("span",{class:"token operator"},">"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"provide"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token string"},'"World"'),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token comment"},"// top module"),t("\n"),a("span",{class:"token keyword"},"import"),t(),a("span",{class:"token operator"},"*"),t(),a("span",{class:"token keyword"},"as"),t(" React "),a("span",{class:"token keyword"},"from"),t(),a("span",{class:"token string"},'"react"'),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"import"),t(),a("span",{class:"token punctuation"},"{"),t(" IProvider "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"from"),t(),a("span",{class:"token string"},'"./providers"'),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token keyword"},"export"),t(),a("span",{class:"token keyword"},"class"),t(),a("span",{class:"token class-name"},"Hello"),t(),a("span",{class:"token keyword"},"extends"),t(),a("span",{class:"token class-name"},[t("React"),a("span",{class:"token punctuation"},"."),t("Component")]),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"private"),t(" readonly nameProvider"),a("span",{class:"token operator"},":"),t(" IProvider"),a("span",{class:"token operator"},"<"),t("string"),a("span",{class:"token operator"},">"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token function"},"render"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token operator"},"<"),t("h1"),a("span",{class:"token operator"},">"),t("Hello "),a("span",{class:"token punctuation"},"{"),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("nameProvider"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"provide"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token operator"},"!"),a("span",{class:"token operator"},"<"),a("span",{class:"token operator"},"/"),t("h1"),a("span",{class:"token operator"},">"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br")])],-1),$n=a("h3",{id:"class-pattern"},[a("a",{class:"header-anchor",href:"#class-pattern","aria-hidden":"true"},"#"),t(" Class Pattern")],-1),_n=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"var"),t(),a("span",{class:"token function-variable function"},"Person"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("firstName"),a("span",{class:"token punctuation"},","),t(" lastName")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("firstName "),a("span",{class:"token operator"},"="),t(" firstName"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("lastName "),a("span",{class:"token operator"},"="),t(" lastName"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("gender "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token string"},"'male'"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},'// Define a subclass constructor for for "Superhero":'),t("\n"),a("span",{class:"token keyword"},"var"),t(),a("span",{class:"token function-variable function"},"Superhero"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("firstName"),a("span",{class:"token punctuation"},","),t(" lastName"),a("span",{class:"token punctuation"},","),t(" powers")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// Invoke the superclass constructor on the new object"),t("\n "),a("span",{class:"token comment"},"// then use .call() to invoke the constructor as a method of"),t("\n "),a("span",{class:"token comment"},"// the object to be initialized."),t("\n "),a("span",{class:"token function"},"Person"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"call"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},","),t(" firstName"),a("span",{class:"token punctuation"},","),t(" lastName"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},'// Finally, store their powers, a new array of traits not found in a normal "Person"'),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("powers "),a("span",{class:"token operator"},"="),t(" powers"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token class-name"},"SuperHero"),a("span",{class:"token punctuation"},"."),t("prototype "),a("span",{class:"token operator"},"="),t(" Object"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"create"),a("span",{class:"token punctuation"},"("),a("span",{class:"token class-name"},"Person"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br")])],-1),En=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"var"),t(" superman "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Superhero"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Clark'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Kent'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},"'flight'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'heat-vision'"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\nconsole"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),t("superman"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br")])],-1),Bn=a("h3",{id:"mix-in-pattern"},[a("a",{class:"header-anchor",href:"#mix-in-pattern","aria-hidden":"true"},"#"),t(" Mix-In Pattern")],-1),Fn=a("p",null,"将多个对象的属性混入同一个对象,达到继承/扩展/组合的效果",-1),Tn=a("ul",null,[a("li",null,"不改变原型链")],-1),Vn=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"mix"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" arg"),a("span",{class:"token punctuation"},","),t("\n prop"),a("span",{class:"token punctuation"},","),t("\n child "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),t("arg "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(" arg "),a("span",{class:"token operator"},"<"),t(" arguments"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},";"),t(" arg "),a("span",{class:"token operator"},"+="),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),t("prop "),a("span",{class:"token keyword"},"in"),t(" arguments"),a("span",{class:"token punctuation"},"["),t("arg"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("arguments"),a("span",{class:"token punctuation"},"["),t("arg"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"hasOwnProperty"),a("span",{class:"token punctuation"},"("),t("prop"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n child"),a("span",{class:"token punctuation"},"["),t("prop"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" arguments"),a("span",{class:"token punctuation"},"["),t("arg"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),t("prop"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" child"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br")])],-1),qn=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"var"),t(" cake "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"mix"),a("span",{class:"token punctuation"},"("),t("\n "),a("span",{class:"token punctuation"},"{"),t(" eggs"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),t(" large"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token boolean"},"true"),t(),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token punctuation"},"{"),t(" butter"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),t(" salted"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token boolean"},"true"),t(),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token punctuation"},"{"),t(" flour"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token string"},"'3 cups'"),t(),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token punctuation"},"{"),t(" sugar"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token string"},"'sure!'"),t(),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br")])],-1),Rn=a("ul",null,[a("li",null,"改变原型链")],-1),Un=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// Extend an existing object with a method from another"),t("\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"mix"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("receivingClass"),a("span",{class:"token punctuation"},","),t(" givingClass")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// mix-in provide certain methods"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("arguments"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"var"),t(" i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),t(" len "),a("span",{class:"token operator"},"="),t(" arguments"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(" len"),a("span",{class:"token punctuation"},";"),t(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n receivingClass"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"["),t("arguments"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t("\n givingClass"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"["),t("arguments"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token comment"},"// mix-in provide obj"),t("\n "),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"var"),t(" methodName "),a("span",{class:"token keyword"},"in"),t(" givingClass"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),t("receivingClass"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"["),t("methodName"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n receivingClass"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"["),t("methodName"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t("\n givingClass"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"["),t("methodName"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br")])],-1),Hn=a("h3",{id:"singleton-pattern"},[a("a",{class:"header-anchor",href:"#singleton-pattern","aria-hidden":"true"},"#"),t(" Singleton Pattern")],-1),zn=a("p",null,"原型与构造函数指针运作正常",-1),Gn=a("div",{class:"language-javascript line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Universe"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// 缓存实例"),t("\n "),a("span",{class:"token keyword"},"var"),t(" instance"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// anti-Self-Defined Function Pattern"),t("\n "),a("span",{class:"token comment"},"// 反-自定义函数模式: 先重写,再初始化"),t("\n "),a("span",{class:"token function-variable function"},"Universe"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Universe"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" instance"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// 保存原型,使其一直保持于同一位置"),t("\n "),a("span",{class:"token comment"},"// (this指针指向不重要)"),t("\n "),a("span",{class:"token class-name"},"Universe"),a("span",{class:"token punctuation"},"."),t("prototype "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},";"),t("\n\n instance "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Universe"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token comment"},"// 重定向constructor指针"),t("\n instance"),a("span",{class:"token punctuation"},"."),t("constructor "),a("span",{class:"token operator"},"="),t(" Universe"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token comment"},"// 功能代码"),t("\n instance"),a("span",{class:"token punctuation"},"."),t("start_time "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t("\n instance"),a("span",{class:"token punctuation"},"."),t("bang "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token string"},"'Big'"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" instance"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br")])],-1),Wn=a("h3",{id:"abstract-factory"},[a("a",{class:"header-anchor",href:"#abstract-factory","aria-hidden":"true"},"#"),t(" Abstract Factory")],-1),Qn=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"var"),t(" AbstractVehicleFactory "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// Storage for our vehicle types"),t("\n "),a("span",{class:"token keyword"},"var"),t(" types "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"_getVehicle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("type"),a("span",{class:"token punctuation"},","),t(" customizations")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" Vehicle "),a("span",{class:"token operator"},"="),t(" types"),a("span",{class:"token punctuation"},"["),t("type"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(" Vehicle "),a("span",{class:"token operator"},"?"),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Vehicle"),a("span",{class:"token punctuation"},"("),t("customizations"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"null"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"_registerVehicle"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("type"),a("span",{class:"token punctuation"},","),t(" Vehicle")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" prototype "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token class-name"},"Vehicle"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// only register classes that fulfill the vehicle contract"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("prototype"),a("span",{class:"token punctuation"},"."),t("drive "),a("span",{class:"token operator"},"&&"),t(" prototype"),a("span",{class:"token punctuation"},"."),t("breakDown"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n types"),a("span",{class:"token punctuation"},"["),t("type"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" Vehicle"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" AbstractVehicleFactory"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token punctuation"},"{"),t("\n getVehicle"),a("span",{class:"token operator"},":"),t(" _getVehicle"),a("span",{class:"token punctuation"},","),t("\n registerVehicle"),a("span",{class:"token operator"},":"),t(" _registerVehicle"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br")])],-1),Xn=a("h3",{id:"factory-method"},[a("a",{class:"header-anchor",href:"#factory-method","aria-hidden":"true"},"#"),t(" Factory Method")],-1),Jn=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[t("module"),a("span",{class:"token punctuation"},"."),t("exports "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"VehicleFactory"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" publicVehicle "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Object"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// specific factory"),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Car"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"options"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("type "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token string"},"'car'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("doors "),a("span",{class:"token operator"},"="),t(" options"),a("span",{class:"token punctuation"},"."),t("doors "),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("state "),a("span",{class:"token operator"},"="),t(" options"),a("span",{class:"token punctuation"},"."),t("state "),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token string"},"'brand new'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" options"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token string"},"'silver'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("speed "),a("span",{class:"token operator"},"="),t(" options"),a("span",{class:"token punctuation"},"."),t("speed "),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token number"},"10"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Truck"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"options"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("type "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token string"},"'truck'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("state "),a("span",{class:"token operator"},"="),t(" options"),a("span",{class:"token punctuation"},"."),t("state "),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token string"},"'used'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("wheelSize "),a("span",{class:"token operator"},"="),t(" options"),a("span",{class:"token punctuation"},"."),t("wheelSize "),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token string"},"'large'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" options"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token string"},"'blue'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("speed "),a("span",{class:"token operator"},"="),t(" options"),a("span",{class:"token punctuation"},"."),t("speed "),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token number"},"8"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// public features of vehicle , added to __proto__"),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"_run"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" args "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"slice"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"call"),a("span",{class:"token punctuation"},"("),t("arguments"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("args"),a("span",{class:"token punctuation"},"."),t("length "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n console"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("type "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token string"},"' - run with: '"),t(),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("speed "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token string"},"'km/s'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"toString"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"apply"),a("span",{class:"token punctuation"},"("),t("args"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'[object Number]'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("speed "),a("span",{class:"token operator"},"="),t(" args"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"_withColor"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" args "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"slice"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"call"),a("span",{class:"token punctuation"},"("),t("arguments"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("args"),a("span",{class:"token punctuation"},"."),t("length "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n console"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),t("\n "),a("span",{class:"token string"},"'The color of this '"),t(),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("type "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token string"},"' product is : '"),t(),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("color\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"toString"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"apply"),a("span",{class:"token punctuation"},"("),t("args"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'[object String]'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("color "),a("span",{class:"token operator"},"="),t(" args"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token comment"},"// provide a function to change other public features"),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"_reform"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("funcName"),a("span",{class:"token punctuation"},","),t(" newFunc")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("\n "),a("span",{class:"token keyword"},"typeof"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"["),t("funcName"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'function'"),t(),a("span",{class:"token operator"},"||"),t("\n "),a("span",{class:"token keyword"},"typeof"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"["),t("funcName"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'function'"),t("\n "),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"delete"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"["),t("funcName"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"["),t("funcName"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" newFunc"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token comment"},"// provide a function to add new public features"),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"_addFeature"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("funcName"),a("span",{class:"token punctuation"},","),t(" newFunc")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"typeof"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"["),t("funcName"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'undefined'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"["),t("funcName"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" newFunc"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"["),t("funcName"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" newFunc"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// private features, added to obj"),t("\n\n "),a("span",{class:"token comment"},"// core: create method"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"create"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"options"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" vehicleClass "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token string"},"''"),a("span",{class:"token punctuation"},","),t("\n newVehicle "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("options"),a("span",{class:"token punctuation"},"."),t("type "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'car'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n vehicleClass "),a("span",{class:"token operator"},"="),t(" Car"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n vehicleClass "),a("span",{class:"token operator"},"="),t(" Truck"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// create new vehicle with options, by pre-defined specific constructor"),t("\n newVehicle "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"vehicleClass"),a("span",{class:"token punctuation"},"("),t("options"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token comment"},"// set up prototype"),t("\n newVehicle"),a("span",{class:"token punctuation"},"."),t("__proto__ "),a("span",{class:"token operator"},"="),t(" publicVehicle"),a("span",{class:"token punctuation"},";"),t("\n newVehicle"),a("span",{class:"token punctuation"},"."),t("prototype "),a("span",{class:"token operator"},"="),t(" publicVehicle"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// add public feature"),t("\n newVehicle"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),t("run "),a("span",{class:"token operator"},"="),t(" _run"),a("span",{class:"token punctuation"},";"),t("\n newVehicle"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),t("withColor "),a("span",{class:"token operator"},"="),t(" _withColor"),a("span",{class:"token punctuation"},";"),t("\n newVehicle"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),t("reform "),a("span",{class:"token operator"},"="),t(" _reform"),a("span",{class:"token punctuation"},";"),t("\n newVehicle"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),t("addFeature "),a("span",{class:"token operator"},"="),t(" _addFeature"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// add private(separately) feature"),t("\n\n "),a("span",{class:"token comment"},"// return new obj"),t("\n "),a("span",{class:"token keyword"},"return"),t(" newVehicle"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// define more factory"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token punctuation"},"{"),t("\n vehicleFactory"),a("span",{class:"token operator"},":"),t(" VehicleFactory"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br"),a("span",{class:"line-number"},"58"),a("br"),a("span",{class:"line-number"},"59"),a("br"),a("span",{class:"line-number"},"60"),a("br"),a("span",{class:"line-number"},"61"),a("br"),a("span",{class:"line-number"},"62"),a("br"),a("span",{class:"line-number"},"63"),a("br"),a("span",{class:"line-number"},"64"),a("br"),a("span",{class:"line-number"},"65"),a("br"),a("span",{class:"line-number"},"66"),a("br"),a("span",{class:"line-number"},"67"),a("br"),a("span",{class:"line-number"},"68"),a("br"),a("span",{class:"line-number"},"69"),a("br"),a("span",{class:"line-number"},"70"),a("br"),a("span",{class:"line-number"},"71"),a("br"),a("span",{class:"line-number"},"72"),a("br"),a("span",{class:"line-number"},"73"),a("br"),a("span",{class:"line-number"},"74"),a("br"),a("span",{class:"line-number"},"75"),a("br"),a("span",{class:"line-number"},"76"),a("br"),a("span",{class:"line-number"},"77"),a("br"),a("span",{class:"line-number"},"78"),a("br"),a("span",{class:"line-number"},"79"),a("br"),a("span",{class:"line-number"},"80"),a("br"),a("span",{class:"line-number"},"81"),a("br"),a("span",{class:"line-number"},"82"),a("br"),a("span",{class:"line-number"},"83"),a("br"),a("span",{class:"line-number"},"84"),a("br"),a("span",{class:"line-number"},"85"),a("br"),a("span",{class:"line-number"},"86"),a("br"),a("span",{class:"line-number"},"87"),a("br"),a("span",{class:"line-number"},"88"),a("br"),a("span",{class:"line-number"},"89"),a("br"),a("span",{class:"line-number"},"90"),a("br"),a("span",{class:"line-number"},"91"),a("br"),a("span",{class:"line-number"},"92"),a("br"),a("span",{class:"line-number"},"93"),a("br"),a("span",{class:"line-number"},"94"),a("br"),a("span",{class:"line-number"},"95"),a("br"),a("span",{class:"line-number"},"96"),a("br"),a("span",{class:"line-number"},"97"),a("br")])],-1),Kn=a("h3",{id:"adapter-pattern"},[a("a",{class:"header-anchor",href:"#adapter-pattern","aria-hidden":"true"},"#"),t(" Adapter Pattern")],-1),Yn=a("p",null,"适配器通过内部使用新接口规定的属性/方法, 创建一个外观与旧接口一致 的方法",-1),Zn=a("ul",null,[a("li",null,"old.method();"),a("li",null,"adapter.method(); // 实现此 method 时,使用了新接口规定的属性/方法")],-1),ns=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// old interface"),t("\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Shipping"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"request"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("zipStart"),a("span",{class:"token punctuation"},","),t(" zipEnd"),a("span",{class:"token punctuation"},","),t(" weight")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// ..."),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token string"},"'$49.75'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token comment"},"// new interface"),t("\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"AdvancedShipping"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"login"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"credentials"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"/* ... */"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"setStart"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"start"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"/* ... */"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"setDestination"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"destination"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"/* ... */"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"calculate"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"weight"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token string"},"'$39.50'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token comment"},"// adapter interface"),t("\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"AdapterShipping"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"credentials"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" shipping "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"AdvancedShipping"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n shipping"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"login"),a("span",{class:"token punctuation"},"("),t("credentials"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"request"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("zipStart"),a("span",{class:"token punctuation"},","),t(" zipEnd"),a("span",{class:"token punctuation"},","),t(" weight")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n shipping"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"setStart"),a("span",{class:"token punctuation"},"("),t("zipStart"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n shipping"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"setDestination"),a("span",{class:"token punctuation"},"("),t("zipEnd"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(" shipping"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"calculate"),a("span",{class:"token punctuation"},"("),t("weight"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br")])],-1),ss=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"var"),t(" shipping "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Shipping"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"var"),t(" adapterShipping "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"AdapterShipping"),a("span",{class:"token punctuation"},"("),t("credentials"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// original shipping object and interface"),t("\n"),a("span",{class:"token keyword"},"var"),t(" cost "),a("span",{class:"token operator"},"="),t(" shipping"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"request"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'78701'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'10010'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'2 lbs'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\nlog"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Old cost: '"),t(),a("span",{class:"token operator"},"+"),t(" cost"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token comment"},"// new shipping object with adapted interface"),t("\ncost "),a("span",{class:"token operator"},"="),t(" adapter"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"request"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'78701'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'10010'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'2 lbs'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br")])],-1),as=a("h3",{id:"decorator-pattern"},[a("a",{class:"header-anchor",href:"#decorator-pattern","aria-hidden":"true"},"#"),t(" Decorator Pattern")],-1),ts=a("ul",null,[a("li",null,"重写/重载/扩展对象原有的行为(method),但不改变对象原有属性"),a("li",null,"可以添加新属性,并围绕新属性扩展对象的原行为 e.g 原对象只会说中文,装饰后同时说中文与英文"),a("li",null,"避免了通过继承来为类型添加新的职责的形式可取,通过继承的方式容易造成子类的膨胀"),a("li",null,"保持接口的一致性,动态改变对象的外观/职责"),a("li",null,"ConcreteDecorator 类: private ClassName component;(拥有一个对象引用)")],-1),es=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"const"),t(),a("span",{class:"token function-variable function"},"__decorate"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("decorators"),a("span",{class:"token punctuation"},","),t(" target"),a("span",{class:"token punctuation"},","),t(" key"),a("span",{class:"token punctuation"},","),t(" desc")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"const"),t(" argumentsLength "),a("span",{class:"token operator"},"="),t(" arguments"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"let"),t(" descriptorOrTarget"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"let"),t(" decorator"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("argumentsLength "),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// class decorator"),t("\n descriptorOrTarget "),a("span",{class:"token operator"},"="),t(" target"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("desc "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token keyword"},"null"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// method decorator"),t("\n descriptorOrTarget "),a("span",{class:"token operator"},"="),t(" Object"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getOwnPropertyDescriptor"),a("span",{class:"token punctuation"},"("),t("target"),a("span",{class:"token punctuation"},","),t(" key"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"let"),t(" i "),a("span",{class:"token operator"},"="),t(" decorators"),a("span",{class:"token punctuation"},"."),t("length "),a("span",{class:"token operator"},"-"),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},">="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(" i"),a("span",{class:"token operator"},"--"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"("),t("decorator "),a("span",{class:"token operator"},"="),t(" decorators"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("argumentsLength "),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// if the decorator function returns a value use it;"),t("\n "),a("span",{class:"token comment"},"// otherwise use the original."),t("\n descriptorOrTarget "),a("span",{class:"token operator"},"="),t("\n "),a("span",{class:"token function"},"decorator"),a("span",{class:"token punctuation"},"("),t("descriptorOrTarget"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"||"),t(" descriptorOrTarget"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// if the decorator function returns a descriptor use it;"),t("\n "),a("span",{class:"token comment"},"// otherwise use the original."),t("\n descriptorOrTarget "),a("span",{class:"token operator"},"="),t("\n "),a("span",{class:"token function"},"decorator"),a("span",{class:"token punctuation"},"("),t("target"),a("span",{class:"token punctuation"},","),t(" key"),a("span",{class:"token punctuation"},","),t(" descriptorOrTarget"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"||"),t(" descriptorOrTarget"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("argumentsLength "),a("span",{class:"token operator"},">"),t(),a("span",{class:"token number"},"3"),t(),a("span",{class:"token operator"},"&&"),t(" descriptorOrTarget"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n Object"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"defineProperty"),a("span",{class:"token punctuation"},"("),t("target"),a("span",{class:"token punctuation"},","),t(" key"),a("span",{class:"token punctuation"},","),t(" descriptorOrTarget"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" descriptorOrTarget"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br")])],-1),os=a("h4",{id:"decorator-implementation"},[a("a",{class:"header-anchor",href:"#decorator-implementation","aria-hidden":"true"},"#"),t(" Decorator Implementation")],-1),cs=a("p",null,"关键在于实现传递方式, 两种方式:",-1),ps=a("ul",null,[a("li",null,"uber 属性获得每次装饰后结果"),a("li",null,"循环叠加每次装饰后结果")],-1),ls=a("div",{class:"language-javascript line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// 构造函数"),t("\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Sale"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"price"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("price "),a("span",{class:"token operator"},"="),t(" price "),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token class-name"},"Sale"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"getPrice"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("price"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// 定义具体装饰器"),t("\n"),a("span",{class:"token comment"},"// 通过uber属性获得上一次装饰后的结果"),t("\nSale"),a("span",{class:"token punctuation"},"."),t("decorators "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\nSale"),a("span",{class:"token punctuation"},"."),t("decorators"),a("span",{class:"token punctuation"},"."),t("fedTax "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"getPrice"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" price "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("uber"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getPrice"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n price "),a("span",{class:"token operator"},"+="),t(),a("span",{class:"token punctuation"},"("),t("price "),a("span",{class:"token operator"},"*"),t(),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"/"),t(),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(" price"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\nSale"),a("span",{class:"token punctuation"},"."),t("decorators"),a("span",{class:"token punctuation"},"."),t("quebec "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"getPrice"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" price "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("uber"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getPrice"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n price "),a("span",{class:"token operator"},"+="),t(),a("span",{class:"token punctuation"},"("),t("price "),a("span",{class:"token operator"},"*"),t(),a("span",{class:"token number"},"7.5"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"/"),t(),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(" price"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\nSale"),a("span",{class:"token punctuation"},"."),t("decorators"),a("span",{class:"token punctuation"},"."),t("money "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"getPrice"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token string"},"'$'"),t(),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("uber"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getPrice"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"toFixed"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\nSale"),a("span",{class:"token punctuation"},"."),t("decorators"),a("span",{class:"token punctuation"},"."),t("cdn "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"getPrice"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token string"},"'CDN$ '"),t(),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("uber"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getPrice"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"toFixed"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token class-name"},"Sale"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"decorate"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"decorator"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(),a("span",{class:"token function-variable function"},"F"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n overrides "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("constructor"),a("span",{class:"token punctuation"},"."),t("decorators"),a("span",{class:"token punctuation"},"["),t("decorator"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),t("\n i"),a("span",{class:"token punctuation"},","),t("\n newObj"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// 临时代理构造函数"),t("\n "),a("span",{class:"token class-name"},"F"),a("span",{class:"token punctuation"},"."),t("prototype "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},";"),t("\n newObj "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"F"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token comment"},"// 传递实现的关键"),t("\n "),a("span",{class:"token comment"},"// 通过uber属性获得上一次装饰后的结果"),t("\n newObj"),a("span",{class:"token punctuation"},"."),t("uber "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token class-name"},"F"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),t("i "),a("span",{class:"token keyword"},"in"),t(" overrides"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("overrides"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"hasOwnProperty"),a("span",{class:"token punctuation"},"("),t("i"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n newObj"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" overrides"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" newObj"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br")])],-1),us=a("h4",{id:"decorators-list"},[a("a",{class:"header-anchor",href:"#decorators-list","aria-hidden":"true"},"#"),t(" Decorators List")],-1),is=a("div",{class:"language-javascript line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// 构造函数"),t("\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Sale"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"price"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("price "),a("span",{class:"token operator"},"="),t(" price "),a("span",{class:"token operator"},">"),t(),a("span",{class:"token number"},"0"),t(),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("decorators_list "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token class-name"},"Sale"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"getPrice"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("price"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// 定义具体装饰器"),t("\nSale"),a("span",{class:"token punctuation"},"."),t("decorators "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\nSale"),a("span",{class:"token punctuation"},"."),t("decorators"),a("span",{class:"token punctuation"},"."),t("fedTax "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"getPrice"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"price"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" price "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token punctuation"},"("),t("price "),a("span",{class:"token operator"},"*"),t(),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"/"),t(),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\nSale"),a("span",{class:"token punctuation"},"."),t("decorators"),a("span",{class:"token punctuation"},"."),t("quebec "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"getPrice"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"price"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" price "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token punctuation"},"("),t("price "),a("span",{class:"token operator"},"*"),t(),a("span",{class:"token number"},"7.5"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"/"),t(),a("span",{class:"token number"},"100"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\nSale"),a("span",{class:"token punctuation"},"."),t("decorators"),a("span",{class:"token punctuation"},"."),t("money "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"getPrice"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"price"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token string"},"'$'"),t(),a("span",{class:"token operator"},"+"),t(" price"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"toFixed"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token class-name"},"Sale"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"decorate"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"decorator"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("decorators_list"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"push"),a("span",{class:"token punctuation"},"("),t("decorator"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token class-name"},"Sale"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"getPrice"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" price "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("price"),a("span",{class:"token punctuation"},","),t("\n i"),a("span",{class:"token punctuation"},","),t("\n max "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("decorators_list"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},","),t("\n name"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),t("i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(" max"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"+="),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n name "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("decorators_list"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token comment"},"// 传递实现的关键"),t("\n "),a("span",{class:"token comment"},"// 通过循环叠加上一次装饰后的结果"),t("\n price "),a("span",{class:"token operator"},"="),t(" Sale"),a("span",{class:"token punctuation"},"."),t("decorators"),a("span",{class:"token punctuation"},"["),t("name"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getPrice"),a("span",{class:"token punctuation"},"("),t("price"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" price"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br")])],-1),rs=a("h4",{id:"实现-2"},[a("a",{class:"header-anchor",href:"#实现-2","aria-hidden":"true"},"#"),t(" 实现 2")],-1),ks=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// The constructor to decorate"),t("\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"MacBook"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"cost"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token number"},"997"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"screenSize"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token number"},"11.6"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token comment"},"// Decorator 1"),t("\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Memory"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"macBook"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" v "),a("span",{class:"token operator"},"="),t(" macBook"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"cost"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n macBook"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"cost"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" v "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token number"},"75"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token comment"},"// Decorator 2"),t("\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Engraving"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"macBook"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" v "),a("span",{class:"token operator"},"="),t(" macBook"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"cost"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n macBook"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"cost"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" v "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token number"},"200"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token comment"},"// Decorator 3"),t("\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Insurance"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"macBook"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" v "),a("span",{class:"token operator"},"="),t(" macBook"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"cost"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n macBook"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"cost"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" v "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token number"},"250"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br")])],-1),bs=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"var"),t(" mb "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MacBook"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token function"},"Memory"),a("span",{class:"token punctuation"},"("),t("mb"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token function"},"Engraving"),a("span",{class:"token punctuation"},"("),t("mb"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token function"},"Insurance"),a("span",{class:"token punctuation"},"("),t("mb"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// Outputs: 1522"),t("\nconsole"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),t("mb"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"cost"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// Outputs: 11.6"),t("\nconsole"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),t("mb"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"screenSize"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br")])],-1),ms=a("h3",{id:"facade-pattern"},[a("a",{class:"header-anchor",href:"#facade-pattern","aria-hidden":"true"},"#"),t(" Facade Pattern")],-1),ds=a("p",null,"将多个复杂的子系统封装+合并,实现一个复杂功能,但只暴露一个简单的接口 - 封装复杂逻辑",-1),ys=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"var"),t(" sabertazimi "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\nsabertazimi"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"addMyEvent"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("el"),a("span",{class:"token punctuation"},","),t(" ev"),a("span",{class:"token punctuation"},","),t(" fn")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("el"),a("span",{class:"token punctuation"},"."),t("addEventListener"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n el"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"addEventListener"),a("span",{class:"token punctuation"},"("),t("ev"),a("span",{class:"token punctuation"},","),t(" fn"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token boolean"},"false"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("el"),a("span",{class:"token punctuation"},"."),t("attachEvent"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n el"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"attachEvent"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'on'"),t(),a("span",{class:"token operator"},"+"),t(" ev"),a("span",{class:"token punctuation"},","),t(" fn"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n el"),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},"'on'"),t(),a("span",{class:"token operator"},"+"),t(" ev"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" fn"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br")])],-1),fs=a("h3",{id:"flyweight-pattern"},[a("a",{class:"header-anchor",href:"#flyweight-pattern","aria-hidden":"true"},"#"),t(" Flyweight Pattern")],-1),hs=a("p",null,"减小内存开销:",-1),ws=a("ul",null,[a("li",null,"内在信息 - 对象中的内部方法所需信息/属性, 一个单独的享元可替代大量具有相同内在信息的对象"),a("li",null,"外部状态作为方法参数:使之适应不同的外部状态(context)——对象实例差异处"),a("li",null,"某个类型的对象有大量的实例,对这些实例进行分类,合并相同分类的对象,只创建少量实例(享元)"),a("li",null,"通过享元工厂来管理一组享元,当所需享元已存在时,返回已存在享元;当所需享元不存在时,创建新享元")],-1),gs=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Flyweight"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("make"),a("span",{class:"token punctuation"},","),t(" model"),a("span",{class:"token punctuation"},","),t(" processor")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("make "),a("span",{class:"token operator"},"="),t(" make"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("model "),a("span",{class:"token operator"},"="),t(" model"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("processor "),a("span",{class:"token operator"},"="),t(" processor"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token keyword"},"var"),t(" FlyWeightFactory "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" flyweights "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"get"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("make"),a("span",{class:"token punctuation"},","),t(" model"),a("span",{class:"token punctuation"},","),t(" processor")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// 不存在所需享元,新建新享元"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),t("flyweights"),a("span",{class:"token punctuation"},"["),t("make "),a("span",{class:"token operator"},"+"),t(" model"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n flyweights"),a("span",{class:"token punctuation"},"["),t("make "),a("span",{class:"token operator"},"+"),t(" model"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Flyweight"),a("span",{class:"token punctuation"},"("),t("make"),a("span",{class:"token punctuation"},","),t(" model"),a("span",{class:"token punctuation"},","),t(" processor"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" flyweights"),a("span",{class:"token punctuation"},"["),t("make "),a("span",{class:"token operator"},"+"),t(" model"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n\n "),a("span",{class:"token function-variable function"},"getCount"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" count "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"var"),t(" f "),a("span",{class:"token keyword"},"in"),t(" flyweights"),a("span",{class:"token punctuation"},")"),t(" count"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(" count"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token keyword"},"var"),t(),a("span",{class:"token function-variable function"},"Computer"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("make"),a("span",{class:"token punctuation"},","),t(" model"),a("span",{class:"token punctuation"},","),t(" processor"),a("span",{class:"token punctuation"},","),t(" memory"),a("span",{class:"token punctuation"},","),t(" tag")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("flyweight "),a("span",{class:"token operator"},"="),t(" FlyWeightFactory"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"get"),a("span",{class:"token punctuation"},"("),t("make"),a("span",{class:"token punctuation"},","),t(" model"),a("span",{class:"token punctuation"},","),t(" processor"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("memory "),a("span",{class:"token operator"},"="),t(" memory"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("tag "),a("span",{class:"token operator"},"="),t(" tag"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"getMake"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("flyweight"),a("span",{class:"token punctuation"},"."),t("make"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token comment"},"// ..."),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"ComputerCollection"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" computers "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"var"),t(" count "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"add"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("make"),a("span",{class:"token punctuation"},","),t(" model"),a("span",{class:"token punctuation"},","),t(" processor"),a("span",{class:"token punctuation"},","),t(" memory"),a("span",{class:"token punctuation"},","),t(" tag")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n computers"),a("span",{class:"token punctuation"},"["),t("tag"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Computer"),a("span",{class:"token punctuation"},"("),t("make"),a("span",{class:"token punctuation"},","),t(" model"),a("span",{class:"token punctuation"},","),t(" processor"),a("span",{class:"token punctuation"},","),t(" memory"),a("span",{class:"token punctuation"},","),t(" tag"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n count"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n\n "),a("span",{class:"token function-variable function"},"get"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"tag"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" computers"),a("span",{class:"token punctuation"},"["),t("tag"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n\n "),a("span",{class:"token function-variable function"},"getCount"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" count"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" computers "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"ComputerCollection"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n computers"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Dell'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Studio XPS'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Intel'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'5G'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Y755P'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n computers"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Dell'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Studio XPS'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Intel'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'6G'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'X997T'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n computers"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Dell'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Studio XPS'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Intel'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'2G'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'NT777'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n computers"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Dell'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Studio XPS'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Intel'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'2G'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'0J88A'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n computers"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'HP'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Envy'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Intel'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'4G'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'CNU883701'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n computers"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'HP'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Envy'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'Intel'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'2G'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'TXU003283'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n console"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Computers: '"),t(),a("span",{class:"token operator"},"+"),t(" computers"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getCount"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n console"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Flyweights: '"),t(),a("span",{class:"token operator"},"+"),t(" FlyWeightFactory"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getCount"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br"),a("span",{class:"line-number"},"58"),a("br"),a("span",{class:"line-number"},"59"),a("br"),a("span",{class:"line-number"},"60"),a("br"),a("span",{class:"line-number"},"61"),a("br"),a("span",{class:"line-number"},"62"),a("br"),a("span",{class:"line-number"},"63"),a("br"),a("span",{class:"line-number"},"64"),a("br"),a("span",{class:"line-number"},"65"),a("br"),a("span",{class:"line-number"},"66"),a("br"),a("span",{class:"line-number"},"67"),a("br"),a("span",{class:"line-number"},"68"),a("br"),a("span",{class:"line-number"},"69"),a("br"),a("span",{class:"line-number"},"70"),a("br")])],-1),vs=a("h3",{id:"proxy-pattern"},[a("a",{class:"header-anchor",href:"#proxy-pattern","aria-hidden":"true"},"#"),t(" Proxy Pattern")],-1),Ps=a("p",null,"通过一个代理对象,临时存储原对象方法调用产生的一系列结果(新建对象),减少重复对象的产生",-1),Cs=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"GeoCoder"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"getLatLng"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"address"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("address "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'Amsterdam'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token string"},"'52.3700° N, 4.8900° E'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("address "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'London'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token string"},"'51.5171° N, 0.1062° W'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("address "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'Paris'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token string"},"'48.8742° N, 2.3470° E'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("address "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'Berlin'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token string"},"'52.5233° N, 13.4127° E'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token string"},"''"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"GeoProxy"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" geocoder "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"GeoCoder"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"var"),t(" geocache "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"getLatLng"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"address"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),t("geocache"),a("span",{class:"token punctuation"},"["),t("address"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n geocache"),a("span",{class:"token punctuation"},"["),t("address"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" geocoder"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getLatLng"),a("span",{class:"token punctuation"},"("),t("address"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n log"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),t("address "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token string"},"': '"),t(),a("span",{class:"token operator"},"+"),t(" geocache"),a("span",{class:"token punctuation"},"["),t("address"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(" geocache"),a("span",{class:"token punctuation"},"["),t("address"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token function-variable function"},"getCount"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" count "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"var"),t(" code "),a("span",{class:"token keyword"},"in"),t(" geocache"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n count"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"return"),t(" count"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br")])],-1),Ss=a("h3",{id:"command-pattern"},[a("a",{class:"header-anchor",href:"#command-pattern","aria-hidden":"true"},"#"),t(" Command Pattern")],-1),js=a("p",null,"有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁 (多个对象中的某个随机对象),也不知道被请求的操作是什么. 此时希望用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此的耦合关系",-1),Ms=a("ul",null,[a("li",null,"将方法/动作封装成对象, 使得外部通过唯一方法 execute/run 调用内部方法/动作"),a("li",null,"客户创建命令;调用者执行该命令;接收者在命令执行时执行相应操作"),a("li",null,"客户通常被包装为一个对象,但是这不是必然的"),a("li",null,"调用者接过命令并将其保存下来, 它会在某个时候调用该命令对象的 execute 方法"),a("li",null,[t("调用者进行 "),a("code",null,"commandObject.execute"),t(" 这种调用时, 它所调用的方法将转而以 "),a("code",null,"receiver.action()"),t(" 这种形式调用恰当的方法")])],-1),xs=a("p",null,"client and receiver",-1),Ds=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"const"),t(),a("span",{class:"token function-variable function"},"SimpleCommand"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"receiving"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("receiving "),a("span",{class:"token operator"},"="),t(" receiving"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token class-name"},"SimpleCommand"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"execute"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("receiving"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"action"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),As=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[t("module"),a("span",{class:"token punctuation"},"."),t("exports "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" manager "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// command to be encapsulated"),t("\n manager"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"isNull"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"nu"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token function"},"toString"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"apply"),a("span",{class:"token punctuation"},"("),t("nu"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'[object Null]'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n manager"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"isArray"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"arr"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token function"},"toString"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"apply"),a("span",{class:"token punctuation"},"("),t("arr"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'[object Array]'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n manager"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"isString"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"str"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token function"},"toString"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"apply"),a("span",{class:"token punctuation"},"("),t("str"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'[object String]'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// public api"),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"execute"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"command"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token punctuation"},"("),t("\n manager"),a("span",{class:"token punctuation"},"["),t("command"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"&&"),t("\n manager"),a("span",{class:"token punctuation"},"["),t("command"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"apply"),a("span",{class:"token punctuation"},"("),t("manager"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"slice"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"call"),a("span",{class:"token punctuation"},"("),t("arguments"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"run"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"command"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token punctuation"},"("),t("\n manager"),a("span",{class:"token punctuation"},"["),t("command"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"&&"),t("\n manager"),a("span",{class:"token punctuation"},"["),t("command"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"apply"),a("span",{class:"token punctuation"},"("),t("manager"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"slice"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"call"),a("span",{class:"token punctuation"},"("),t("arguments"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token punctuation"},"{"),t("\n execute"),a("span",{class:"token operator"},":"),t(" execute"),a("span",{class:"token punctuation"},","),t("\n run"),a("span",{class:"token operator"},":"),t(" run"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br")])],-1),Is=a("p",null,"command pattern in UI development, bind command to UI components:",-1),Ns=a("ul",null,[a("li",null,"executor: UI components"),a("li",null,"client and receiver: background tasks or other UI components"),a("li",null,"executor -> client: command.execute() -> receiver: receiver.action()")],-1),Os=a("p",null,[t("e.g click "),a("code",null,"button"),t(" -> refresh "),a("code",null,"menu")],-1),Ls=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// receiver"),t("\n"),a("span",{class:"token keyword"},"const"),t(" MenuBar "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"action"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"refresh"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token function"},"refresh"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n console"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'refresh menu pages'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// client: command object"),t("\n"),a("span",{class:"token comment"},"// command: object with `action` implemented"),t("\n"),a("span",{class:"token keyword"},"const"),t(),a("span",{class:"token function-variable function"},"Command"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"receiver"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"=>"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n receiver"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"action"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" RefreshMenuBarCommand "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"Command"),a("span",{class:"token punctuation"},"("),t("MenuBar"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// executor"),t("\nbutton"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"setCommand"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"command"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"=>"),t(),a("span",{class:"token punctuation"},"{"),t("\n button"),a("span",{class:"token punctuation"},"."),t("command "),a("span",{class:"token operator"},"="),t(" command"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\nbutton"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"setCommand"),a("span",{class:"token punctuation"},"("),t("RefreshMenuBarCommand"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\nbutton"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"addEventLister"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'click'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"event"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"=>"),t(),a("span",{class:"token punctuation"},"{"),t("\n button"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"command"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br")])],-1),$s=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"const"),t(),a("span",{class:"token function-variable function"},"MenuCommand"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"action"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("action "),a("span",{class:"token operator"},"="),t(" action"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token class-name"},"MenuCommand"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"execute"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"action"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token keyword"},"const"),t(" fileActions "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"FileActions"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" EditActions "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"EditActions"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" InsertActions "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"InsertActions"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" HelpActions "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"HelpActions"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token keyword"},"const"),t(" appMenuBar "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuBar"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token comment"},"//-----------"),t("\n"),a("span",{class:"token keyword"},"const"),t(" fileMenu "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Menu"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'File'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" openCommand "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuCommand"),a("span",{class:"token punctuation"},"("),t("fileActions"),a("span",{class:"token punctuation"},"."),t("open"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" closeCommand "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuCommand"),a("span",{class:"token punctuation"},"("),t("fileActions"),a("span",{class:"token punctuation"},"."),t("close"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" saveCommand "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuCommand"),a("span",{class:"token punctuation"},"("),t("fileActions"),a("span",{class:"token punctuation"},"."),t("save"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" saveAsCommand "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuCommand"),a("span",{class:"token punctuation"},"("),t("fileActions"),a("span",{class:"token punctuation"},"."),t("saveAs"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\nfileMenu"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuItem"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'open'"),a("span",{class:"token punctuation"},","),t(" openCommand"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\nfileMenu"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuItem"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Close'"),a("span",{class:"token punctuation"},","),t(" closeCommand"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\nfileMenu"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuItem"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Save'"),a("span",{class:"token punctuation"},","),t(" saveCommand"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\nfileMenu"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuItem"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Close'"),a("span",{class:"token punctuation"},","),t(" saveAsCommand"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\nappMenuBar"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),t("fileMenu"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token comment"},"//--------------"),t("\n"),a("span",{class:"token keyword"},"const"),t(" editMenu "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Menu"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Edit'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" cutCommand "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuCommand"),a("span",{class:"token punctuation"},"("),t("EditActions"),a("span",{class:"token punctuation"},"."),t("cut"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" copyCommand "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuCommand"),a("span",{class:"token punctuation"},"("),t("EditActions"),a("span",{class:"token punctuation"},"."),t("copy"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" pasteCommand "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuCommand"),a("span",{class:"token punctuation"},"("),t("EditActions"),a("span",{class:"token punctuation"},"."),t("paste"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" deleteCommand "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuCommand"),a("span",{class:"token punctuation"},"("),t("EditActions"),a("span",{class:"token punctuation"},"."),t("delete"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\neditMenu"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuItem"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Cut'"),a("span",{class:"token punctuation"},","),t(" cutCommand"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\neditMenu"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuItem"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Copy'"),a("span",{class:"token punctuation"},","),t(" copyCommand"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\neditMenu"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuItem"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Paste'"),a("span",{class:"token punctuation"},","),t(" pasteCommand"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\neditMenu"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuItem"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Delete'"),a("span",{class:"token punctuation"},","),t(" deleteCommand"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\nappMenuBar"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),t("editMenu"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"//------------"),t("\n"),a("span",{class:"token keyword"},"const"),t(" insertMenu "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Menu"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Insert'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" textBlockCommand "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuCommand"),a("span",{class:"token punctuation"},"("),t("InsertActions"),a("span",{class:"token punctuation"},"."),t("textBlock"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\ninsertMenu"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuItem"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Text Block'"),a("span",{class:"token punctuation"},","),t(" textBlockCommand"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\nappMenuBar"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),t("insertMenu"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"//------------"),t("\n"),a("span",{class:"token keyword"},"const"),t(" helpMenu "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Menu"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Help'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token keyword"},"const"),t(" showHelpCommand "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuCommand"),a("span",{class:"token punctuation"},"("),t("HelpActions"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"showHelp"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\nhelpMenu"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"MenuItem"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Show Help'"),a("span",{class:"token punctuation"},","),t(" showHelpCommand"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\nappMenuBar"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"add"),a("span",{class:"token punctuation"},"("),t("helpMenu"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\ndocument"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getElementsByTagName"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'body'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"appendChild"),a("span",{class:"token punctuation"},"("),t("appMenuBar"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getElement"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\nappMenuBar"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"show"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br")])],-1),_s=a("p",null,"Command sequences to implement Macro/Batch/Undo command:",-1),Es=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"const"),t(),a("span",{class:"token function-variable function"},"Cursor"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("width"),a("span",{class:"token punctuation"},","),t(" height"),a("span",{class:"token punctuation"},","),t(" parent")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("width "),a("span",{class:"token operator"},"="),t(" width"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("height "),a("span",{class:"token operator"},"="),t(" height"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("commandStack "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("canvas "),a("span",{class:"token operator"},"="),t(" document"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"createElement"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'canvas'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("canvas"),a("span",{class:"token punctuation"},"."),t("width "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("width"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("canvas"),a("span",{class:"token punctuation"},"."),t("height "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("height"),a("span",{class:"token punctuation"},";"),t("\n parent"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"appendChild"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("canvas"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("ctx "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("canvas"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getContext"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'2d'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("ctx"),a("span",{class:"token punctuation"},"."),t("fillStyle "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token string"},"'#CCC000'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"move"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token class-name"},"Cursor"),a("span",{class:"token punctuation"},"."),t("prototype "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"move"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("x"),a("span",{class:"token punctuation"},","),t(" y")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" _this "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("commandStack"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"push"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n _this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"lineTo"),a("span",{class:"token punctuation"},"("),t("x"),a("span",{class:"token punctuation"},","),t(" y"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token function-variable function"},"lineTo"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("x"),a("span",{class:"token punctuation"},","),t(" y")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("position"),a("span",{class:"token punctuation"},"."),t("x "),a("span",{class:"token operator"},"+="),t(" x"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("position"),a("span",{class:"token punctuation"},"."),t("y "),a("span",{class:"token operator"},"+="),t(" y"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("ctx"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"lineTo"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("position"),a("span",{class:"token punctuation"},"."),t("x"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("position"),a("span",{class:"token punctuation"},"."),t("y"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token function-variable function"},"executeCommands"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("position "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),t(" x"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("width "),a("span",{class:"token operator"},"/"),t(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),t(" y"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("height "),a("span",{class:"token operator"},"/"),t(),a("span",{class:"token number"},"2"),t(),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("ctx"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"clearRect"),a("span",{class:"token punctuation"},"("),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("width"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("height"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("ctx"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"beginPath"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("ctx"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"moveTo"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("position"),a("span",{class:"token punctuation"},"."),t("x"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("position"),a("span",{class:"token punctuation"},"."),t("y"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"var"),t(" i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("commandStack"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},";"),t(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("commandStack"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("ctx"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"stroke"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token function-variable function"},"undo"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("commandStack"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"pop"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"executeCommands"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br")])],-1),Bs=a("h3",{id:"mediator-pattern"},[a("a",{class:"header-anchor",href:"#mediator-pattern","aria-hidden":"true"},"#"),t(" Mediator Pattern")],-1),Fs=a("p",null,"一个 Mediator 对象封装对象间的协议: 中央集权的控制中心 - 所有观察者共享一个共有的被观察者(所有订阅者订阅同一个节点).",-1),Ts=a("h3",{id:"observer-pattern"},[a("a",{class:"header-anchor",href:"#observer-pattern","aria-hidden":"true"},"#"),t(" Observer Pattern")],-1),Vs=a("ul",null,[a("li",null,"被观察者(Subject)维护一组观察者列表,每当被观察者状态改变时,调用 notify 函数,此函数中调用观察者(Observer)的 update 函数(可自定义)"),a("li",null,[t("decouple subject and observer: each depends on "),a("code",null,"Abstraction"),t(" not "),a("code",null,"Implementation")])],-1),qs=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"ObserverList"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token class-name"},"ObserverList"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"Add"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"obj"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"push"),a("span",{class:"token punctuation"},"("),t("obj"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token class-name"},"ObserverList"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"Empty"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token class-name"},"ObserverList"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"Count"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token class-name"},"ObserverList"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"Get"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"index"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("index "),a("span",{class:"token operator"},">"),t(),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),t(),a("span",{class:"token operator"},"&&"),t(" index "),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList"),a("span",{class:"token punctuation"},"["),t("index"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token class-name"},"ObserverList"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"Insert"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("obj"),a("span",{class:"token punctuation"},","),t(" index")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" pointer "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("index "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"unshift"),a("span",{class:"token punctuation"},"("),t("obj"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n pointer "),a("span",{class:"token operator"},"="),t(" index"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("index "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"push"),a("span",{class:"token punctuation"},"("),t("obj"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n pointer "),a("span",{class:"token operator"},"="),t(" index"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" pointer"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token class-name"},"ObserverList"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"IndexOf"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("obj"),a("span",{class:"token punctuation"},","),t(" startIndex")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" i "),a("span",{class:"token operator"},"="),t(" startIndex"),a("span",{class:"token punctuation"},","),t("\n pointer "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"while"),t(),a("span",{class:"token punctuation"},"("),t("i "),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"==="),t(" obj"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n pointer "),a("span",{class:"token operator"},"="),t(" i"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" pointer"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token class-name"},"ObserverList"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"RemoveAt"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"index"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("index "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"shift"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("index "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList"),a("span",{class:"token punctuation"},"."),t("length "),a("span",{class:"token operator"},"-"),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observerList"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"pop"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// 被观察者维护一个观察者列表"),t("\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Subject"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observers "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"ObserverList"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token class-name"},"Subject"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"AddObserver"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"observer"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observers"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"Add"),a("span",{class:"token punctuation"},"("),t("observer"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token class-name"},"Subject"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"RemoveObserver"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"observer"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observers"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"RemoveAt"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observers"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"IndexOf"),a("span",{class:"token punctuation"},"("),t("observer"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token class-name"},"Subject"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"Notify"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"context"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" observerCount "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observers"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"Count"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"var"),t(" i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(" observerCount"),a("span",{class:"token punctuation"},";"),t(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("observers"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"Get"),a("span",{class:"token punctuation"},"("),t("i"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"Update"),a("span",{class:"token punctuation"},"("),t("context"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// The Observer"),t("\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Observer"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"Update"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// ..."),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n\n"),a("span",{class:"token comment"},"// Extend an object with an extension"),t("\n"),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"extend"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("extension"),a("span",{class:"token punctuation"},","),t(" obj")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"var"),t(" key "),a("span",{class:"token keyword"},"in"),t(" extension"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n obj"),a("span",{class:"token punctuation"},"["),t("key"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(" extension"),a("span",{class:"token punctuation"},"["),t("key"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br"),a("span",{class:"line-number"},"58"),a("br"),a("span",{class:"line-number"},"59"),a("br"),a("span",{class:"line-number"},"60"),a("br"),a("span",{class:"line-number"},"61"),a("br"),a("span",{class:"line-number"},"62"),a("br"),a("span",{class:"line-number"},"63"),a("br"),a("span",{class:"line-number"},"64"),a("br"),a("span",{class:"line-number"},"65"),a("br"),a("span",{class:"line-number"},"66"),a("br"),a("span",{class:"line-number"},"67"),a("br"),a("span",{class:"line-number"},"68"),a("br"),a("span",{class:"line-number"},"69"),a("br"),a("span",{class:"line-number"},"70"),a("br"),a("span",{class:"line-number"},"71"),a("br"),a("span",{class:"line-number"},"72"),a("br"),a("span",{class:"line-number"},"73"),a("br"),a("span",{class:"line-number"},"74"),a("br"),a("span",{class:"line-number"},"75"),a("br"),a("span",{class:"line-number"},"76"),a("br"),a("span",{class:"line-number"},"77"),a("br"),a("span",{class:"line-number"},"78"),a("br"),a("span",{class:"line-number"},"79"),a("br"),a("span",{class:"line-number"},"80"),a("br"),a("span",{class:"line-number"},"81"),a("br"),a("span",{class:"line-number"},"82"),a("br"),a("span",{class:"line-number"},"83"),a("br"),a("span",{class:"line-number"},"84"),a("br"),a("span",{class:"line-number"},"85"),a("br"),a("span",{class:"line-number"},"86"),a("br"),a("span",{class:"line-number"},"87"),a("br"),a("span",{class:"line-number"},"88"),a("br"),a("span",{class:"line-number"},"89"),a("br"),a("span",{class:"line-number"},"90"),a("br"),a("span",{class:"line-number"},"91"),a("br")])],-1),Rs=a("h3",{id:"pub-sub-pattern"},[a("a",{class:"header-anchor",href:"#pub-sub-pattern","aria-hidden":"true"},"#"),t(" Pub-Sub Pattern")],-1),Us=a("ul",null,[a("li",null,"观察者模式中主体和观察者是互相感知"),a("li",null,"发布-订阅模式是借助第三方来实现调度, 发布者和订阅者之间互不感知")],-1),Hs=a("h4",{id:"implementation"},[a("a",{class:"header-anchor",href:"#implementation","aria-hidden":"true"},"#"),t(" Implementation")],-1),zs=a("ul",null,[a("li",null,"pubSub.js")],-1),Gs=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[t("module"),a("span",{class:"token punctuation"},"."),t("exports "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("window"),a("span",{class:"token punctuation"},","),t(" doc"),a("span",{class:"token punctuation"},","),t(" undef")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" pubSub "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"var"),t(" topics "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n subUid "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token operator"},"-"),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},";"),t("\n\n pubSub"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"publish"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("topic"),a("span",{class:"token punctuation"},","),t(" args")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// undefined check"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),t("topics"),a("span",{class:"token punctuation"},"["),t("topic"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token boolean"},"false"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token function"},"setTimeout"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" subscribers "),a("span",{class:"token operator"},"="),t(" topics"),a("span",{class:"token punctuation"},"["),t("topic"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},","),t("\n len "),a("span",{class:"token operator"},"="),t(" subscribers "),a("span",{class:"token operator"},"?"),t(" subscribers"),a("span",{class:"token punctuation"},"."),t("length "),a("span",{class:"token operator"},":"),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"while"),t(),a("span",{class:"token punctuation"},"("),t("len"),a("span",{class:"token operator"},"--"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n subscribers"),a("span",{class:"token punctuation"},"["),t("len"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"func"),a("span",{class:"token punctuation"},"("),t("topic"),a("span",{class:"token punctuation"},","),t(" args"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token boolean"},"true"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n pubSub"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"subscribe"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("topic"),a("span",{class:"token punctuation"},","),t(" func")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// undefined check"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),t("topics"),a("span",{class:"token punctuation"},"["),t("topic"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n topics"),a("span",{class:"token punctuation"},"["),t("topic"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token comment"},"// add observer to observerList (topics)"),t("\n "),a("span",{class:"token keyword"},"var"),t(" token "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"++"),t("subUid"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"toString"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n topics"),a("span",{class:"token punctuation"},"["),t("topic"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"push"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"{"),t("\n token"),a("span",{class:"token operator"},":"),t(" token"),a("span",{class:"token punctuation"},","),t("\n func"),a("span",{class:"token operator"},":"),t(" func"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(" token"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n pubSub"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"unsubscribe"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"token"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"var"),t(" m "),a("span",{class:"token keyword"},"in"),t(" topics"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("topics"),a("span",{class:"token punctuation"},"["),t("m"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"var"),t(" i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},","),t(" j "),a("span",{class:"token operator"},"="),t(" topics"),a("span",{class:"token punctuation"},"["),t("m"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(" j"),a("span",{class:"token punctuation"},";"),t(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("topics"),a("span",{class:"token punctuation"},"["),t("m"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),t("token "),a("span",{class:"token operator"},"==="),t(" token"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n topics"),a("span",{class:"token punctuation"},"["),t("m"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"splice"),a("span",{class:"token punctuation"},"("),t("i"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"return"),t(" token"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token boolean"},"false"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(" pubSub"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("document"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"undefined"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br")])],-1),Ws=a("ul",null,[a("li",null,"test.js")],-1),Qs=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token keyword"},"var"),t(" pubsub "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"require"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'./pubSub.js'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// add observer to observerList"),t("\n"),a("span",{class:"token keyword"},"var"),t(" testFirstSub "),a("span",{class:"token operator"},"="),t(" pubsub"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"subscribe"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'login'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("topic"),a("span",{class:"token punctuation"},","),t(" data")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n console"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),t("topic "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token string"},"': '"),t(),a("span",{class:"token operator"},"+"),t(" data"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// subject broadcast/notify, observer update"),t("\npubsub"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"publish"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'login'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'hello world!'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\npubsub"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"publish"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'login'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},"'test'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'a'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'b'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'c'"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\npubsub"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"publish"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'login'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"{"),t(" color"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token string"},"'blue'"),t(),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"{"),t(" text"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token string"},"'hello'"),t(),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token function"},"setTimeout"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n pubsub"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"unsubscribe"),a("span",{class:"token punctuation"},"("),t("testFirstSub"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// permanent subscribe"),t("\npubsub"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"subscribe"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'sum'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("topic"),a("span",{class:"token punctuation"},","),t(" data")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"toString"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"apply"),a("span",{class:"token punctuation"},"("),t("data"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"!=="),t(),a("span",{class:"token string"},"'[object Array]'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n console"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Please input array: * '"),t(),a("span",{class:"token operator"},"+"),t(" data "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token string"},"' * is not array!'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" tmp "),a("span",{class:"token operator"},"="),t(" data"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"filter"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"item"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token function"},"toString"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"apply"),a("span",{class:"token punctuation"},"("),t("item"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'[object Number]'"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("tmp"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" sum "),a("span",{class:"token operator"},"="),t(" tmp"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"reduce"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("previous"),a("span",{class:"token punctuation"},","),t(" current")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(" previous "),a("span",{class:"token operator"},"+"),t(" current"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n console"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'Sum of '"),t(),a("span",{class:"token operator"},"+"),t(" data "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token string"},"' : '"),t(),a("span",{class:"token operator"},"+"),t(" sum"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n console"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"log"),a("span",{class:"token punctuation"},"("),t("\n "),a("span",{class:"token string"},"'Please input number array: * '"),t(),a("span",{class:"token operator"},"+"),t(" data "),a("span",{class:"token operator"},"+"),t(),a("span",{class:"token string"},"' * is not number array!'"),t("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\npubsub"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"publish"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'login'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'hello again!'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\npubsub"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"publish"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'sum'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'hello again!'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\npubsub"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"publish"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'sum'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"2"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"3"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"4"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"5"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\npubsub"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"publish"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'sum'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},"'a'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'b'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'c'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'d'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'e'"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br")])],-1),Xs=a("ul",null,[a("li",null,"in jQuery")],-1),Js=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// Equivalent to subscribe(topicName, callback)"),t("\n"),a("span",{class:"token function"},"$"),a("span",{class:"token punctuation"},"("),t("document"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"on"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'topicName'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"//..perform some behavior"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// Equivalent to publish(topicName)"),t("\n"),a("span",{class:"token function"},"$"),a("span",{class:"token punctuation"},"("),t("document"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"trigger"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'topicName'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// Equivalent to unsubscribe(topicName)"),t("\n"),a("span",{class:"token function"},"$"),a("span",{class:"token punctuation"},"("),t("document"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"off"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},"'topicName'"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br")])],-1),Ks=a("ul",null,[a("li",null,"MicroEvent.js")],-1),Ys=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"/**\n * MicroEvent - to make any js object an event emitter (server or browser)\n *\n * - pure javascript - server compatible, browser compatible\n * - don't rely on the browser doms\n * - super simple - you get it immediately, no mystery, no magic involved\n *\n * - create a MicroEventDebug with goodies to debug\n * - make it safer to use\n */"),t("\n\n"),a("span",{class:"token keyword"},"var"),t(),a("span",{class:"token function-variable function"},"MicroEvent"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token class-name"},"MicroEvent"),a("span",{class:"token punctuation"},"."),t("prototype "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"bind"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("event"),a("span",{class:"token punctuation"},","),t(" fct")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events "),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events"),a("span",{class:"token punctuation"},"["),t("event"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events"),a("span",{class:"token punctuation"},"["),t("event"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events"),a("span",{class:"token punctuation"},"["),t("event"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"push"),a("span",{class:"token punctuation"},"("),t("fct"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token function-variable function"},"unbind"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("event"),a("span",{class:"token punctuation"},","),t(" fct")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events "),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("event "),a("span",{class:"token keyword"},"in"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token boolean"},"false"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token keyword"},"return"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events"),a("span",{class:"token punctuation"},"["),t("event"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"splice"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events"),a("span",{class:"token punctuation"},"["),t("event"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"indexOf"),a("span",{class:"token punctuation"},"("),t("fct"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token function-variable function"},"trigger"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),t("event "),a("span",{class:"token comment"},"/* , args... */"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events "),a("span",{class:"token operator"},"||"),t(),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t("event "),a("span",{class:"token keyword"},"in"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token boolean"},"false"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token keyword"},"return"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"var"),t(" i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events"),a("span",{class:"token punctuation"},"["),t("event"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},";"),t(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_events"),a("span",{class:"token punctuation"},"["),t("event"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"apply"),a("span",{class:"token punctuation"},"("),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token class-name"},"Array"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"slice"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"call"),a("span",{class:"token punctuation"},"("),t("arguments"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token number"},"1"),a("span",{class:"token punctuation"},")"),t("\n "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"/**\n * mixin will delegate all MicroEvent.js function in the destination object\n *\n * - require('MicroEvent').mixin(Foobar) will make Foobar able to use MicroEvent\n *\n * @param {Object} the object which will support MicroEvent\n */"),t("\nMicroEvent"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"mixin"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"destObject"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"var"),t(" props "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"["),a("span",{class:"token string"},"'bind'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'unbind'"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'trigger'"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"for"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"var"),t(" i "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token number"},"0"),a("span",{class:"token punctuation"},";"),t(" i "),a("span",{class:"token operator"},"<"),t(" props"),a("span",{class:"token punctuation"},"."),t("length"),a("span",{class:"token punctuation"},";"),t(" i"),a("span",{class:"token operator"},"++"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"typeof"),t(" destObject "),a("span",{class:"token operator"},"==="),t(),a("span",{class:"token string"},"'function'"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n destObject"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"["),t("props"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token class-name"},"MicroEvent"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"["),t("props"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t(),a("span",{class:"token keyword"},"else"),t(),a("span",{class:"token punctuation"},"{"),t("\n destObject"),a("span",{class:"token punctuation"},"["),t("props"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token class-name"},"MicroEvent"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"["),t("props"),a("span",{class:"token punctuation"},"["),t("i"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token keyword"},"return"),t(" destObject"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n"),a("span",{class:"token comment"},"// export in common js"),t("\n"),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"typeof"),t(" module "),a("span",{class:"token operator"},"!=="),t(),a("span",{class:"token string"},"'undefined'"),t(),a("span",{class:"token operator"},"&&"),t(),a("span",{class:"token string"},"'exports'"),t(),a("span",{class:"token keyword"},"in"),t(" module"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n module"),a("span",{class:"token punctuation"},"."),t("exports "),a("span",{class:"token operator"},"="),t(" MicroEvent"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br"),a("span",{class:"line-number"},"58"),a("br")])],-1),Zs=a("h4",{id:"sample"},[a("a",{class:"header-anchor",href:"#sample","aria-hidden":"true"},"#"),t(" Sample")],-1),na=a("h5",{id:"ajax-callback"},[a("a",{class:"header-anchor",href:"#ajax-callback","aria-hidden":"true"},"#"),t(" Ajax Callback")],-1),sa=a("ul",null,[a("li",null,"当请求返回,并且实际的数据可用的时候,会生成一个通知"),a("li",null,"如何使用这些事件(或者返回的数据),都是由订阅者自己决定的"),a("li",null,"可以有多个不同的订阅者,以不同的方式使用返回的数据"),a("li",null,"Ajax 层: 唯一的责任 - 请求和返回数据,接着将数据发送给所有想要使用数据的地方")],-1),aa=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"$"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n\n "),a("span",{class:"token comment"},'// Pre-compile template and "cache" it using closure'),t("\n "),a("span",{class:"token keyword"},"var"),t(" resultTemplate "),a("span",{class:"token operator"},"="),t(" _"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"template"),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"$"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token string"},'"#resultTemplate"'),t(),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"html"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// Subscribe to the new search tags topic"),t("\n $"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"subscribe"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token string"},'"/search/tags"'),t(),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"function"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token parameter"},"tags"),t(),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function"},"$"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token string"},'"#searchResults"'),t(),a("span",{class:"token punctuation"},")"),t("\n "),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"html"),a("span",{class:"token punctuation"},"("),t('"\n\n\n Searched '),a("span",{class:"token keyword"},"for"),a("span",{class:"token operator"},":"),a("span",{class:"token string"},'" + tags + "'),t('\n\n"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// Subscribe to the new results topic"),t("\n $"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"subscribe"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token string"},'"/search/resultSet"'),t(),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"function"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token parameter"},"results"),t(),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),t("\n\n "),a("span",{class:"token function"},"$"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token string"},'"#searchResults"'),t(),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"append"),a("span",{class:"token punctuation"},"("),a("span",{class:"token function"},"resultTemplate"),a("span",{class:"token punctuation"},"("),t(" results "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// Submit a search query and publish tags on the /search/tags topic"),t("\n "),a("span",{class:"token function"},"$"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token string"},'"#flickrSearch"'),t(),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"submit"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token keyword"},"function"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token parameter"},"e"),t(),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n\n e"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"preventDefault"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"var"),t(" tags "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token function"},"$"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"find"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token string"},'"#query"'),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"val"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token operator"},"!"),t("tags "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n $"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"publish"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token string"},'"/search/tags"'),t(),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"["),t(" $"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"trim"),a("span",{class:"token punctuation"},"("),t("tags"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"]"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n\n "),a("span",{class:"token comment"},"// Subscribe to new tags being published and perform"),t("\n "),a("span",{class:"token comment"},"// a search query using them. Once data has returned"),t("\n "),a("span",{class:"token comment"},"// publish this data for the rest of the application"),t("\n "),a("span",{class:"token comment"},"// to consume"),t("\n\n $"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"subscribe"),a("span",{class:"token punctuation"},"("),a("span",{class:"token string"},'"/search/tags"'),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"function"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token parameter"},"tags"),t(),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// Ajax Request"),t("\n $"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"getJSON"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token string"},'"http://api.flickr.com/services/feeds/"'),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"{"),t("\n tags"),a("span",{class:"token operator"},":"),t(" tags"),a("span",{class:"token punctuation"},","),t("\n tagMode"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token string"},'"any"'),a("span",{class:"token punctuation"},","),t("\n format"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token string"},'"json"'),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n\n "),a("span",{class:"token keyword"},"function"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token parameter"},"data"),t(),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"{"),t("\n\n "),a("span",{class:"token keyword"},"if"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token operator"},"!"),t("data"),a("span",{class:"token punctuation"},"."),t("items"),a("span",{class:"token punctuation"},"."),t("length "),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n $"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"publish"),a("span",{class:"token punctuation"},"("),t(),a("span",{class:"token string"},'"/search/resultSet"'),t(),a("span",{class:"token punctuation"},","),t(" data"),a("span",{class:"token punctuation"},"."),t("items "),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br"),a("span",{class:"line-number"},"58"),a("br"),a("span",{class:"line-number"},"59"),a("br"),a("span",{class:"line-number"},"60"),a("br"),a("span",{class:"line-number"},"61"),a("br"),a("span",{class:"line-number"},"62"),a("br")])],-1),ta=a("h2",{id:"mvc-pattern"},[a("a",{class:"header-anchor",href:"#mvc-pattern","aria-hidden":"true"},"#"),t(" MVC Pattern")],-1),ea=a("p",null,"在 MVC 中,视图位于我们架构的顶部,其背后是控制器. 模型在控制器后面,而因此我们的视图了解得到我们的控制器,而控制器了解得到模型. 这里,我们的视图有对模型的直接访问. 然而将整个模型完全暴露给视图可能会有安全和性能损失, 这取决于我们应用程序的复杂性. MVVM 则尝试去避免这些问题.",-1),oa=a("p",null,"在 MVP 中,控制器的角色被代理器所取代,代理器和视图处于同样的地位, 视图和模型的事件都被它侦听着并且接受它的调解. 不同于 MVVM,没有一个将视图绑定到视图模型的机制,因此我们转而依赖于每一个视图都实现一个允许代理器同视图去交互的接口.",-1),ca=a("p",null,"MVVM 进一步允许我们创建一个模型的特定视图子集,包含了状态和逻辑信息, 避免了将模型完全暴露给视图的必要。 不同于 MVP 的代理器,视图模型并不需要去引用一个视图。 视图可以绑定到视图模型的属性上面,视图模型则去将包含在模型中的数据暴露给视图。 像我们所提到过的,对视图的抽象意味着其背后的代码需要较少的逻辑。",-1),pa=a("h2",{id:"jquery-pattern"},[a("a",{class:"header-anchor",href:"#jquery-pattern","aria-hidden":"true"},"#"),t(" jQuery Pattern")],-1),la=a("h3",{id:"plugin-pattern"},[a("a",{class:"header-anchor",href:"#plugin-pattern","aria-hidden":"true"},"#"),t(" Plugin Pattern")],-1),ua=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"$"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n $"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"extend"),a("span",{class:"token punctuation"},"("),t("$"),a("span",{class:"token punctuation"},"."),t("fn"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token function-variable function"},"myPlugin"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// your plugin logic"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"("),t("jQuery"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br")])],-1),ia=a("div",{class:"language-js line-numbers-mode"},[a("pre",null,[a("code",null,[a("span",{class:"token comment"},"// the semi-colon before the function invocation is a safety"),t("\n"),a("span",{class:"token comment"},"// net against concatenated scripts and/or other plugins"),t("\n"),a("span",{class:"token comment"},"// that are not closed properly."),t("\n"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("$"),a("span",{class:"token punctuation"},","),t(" window"),a("span",{class:"token punctuation"},","),t(" document"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"undefined")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// undefined is used here as the undefined global"),t("\n "),a("span",{class:"token comment"},"// variable in ECMAScript 3 and is mutable (i.e. it can"),t("\n "),a("span",{class:"token comment"},"// be changed by someone else). undefined isn't really"),t("\n "),a("span",{class:"token comment"},"// being passed in so we can ensure that its value is"),t("\n "),a("span",{class:"token comment"},"// truly undefined. In ES5, undefined can no longer be"),t("\n "),a("span",{class:"token comment"},"// modified."),t("\n\n "),a("span",{class:"token comment"},"// window and document are passed through as local"),t("\n "),a("span",{class:"token comment"},"// variables rather than as globals, because this (slightly)"),t("\n "),a("span",{class:"token comment"},"// quickens the resolution process and can be more"),t("\n "),a("span",{class:"token comment"},"// efficiently minified (especially when both are"),t("\n "),a("span",{class:"token comment"},"// regularly referenced in our plugin)."),t("\n\n "),a("span",{class:"token comment"},"// Create the defaults once"),t("\n "),a("span",{class:"token keyword"},"var"),t(" pluginName "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token string"},"'defaultPluginName'"),a("span",{class:"token punctuation"},","),t("\n defaults "),a("span",{class:"token operator"},"="),t(),a("span",{class:"token punctuation"},"{"),t("\n propertyName"),a("span",{class:"token operator"},":"),t(),a("span",{class:"token string"},"'value'"),a("span",{class:"token punctuation"},","),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// The actual plugin constructor"),t("\n "),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token function"},"Plugin"),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},[t("element"),a("span",{class:"token punctuation"},","),t(" options")]),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("element "),a("span",{class:"token operator"},"="),t(" element"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// jQuery has an extend method that merges the"),t("\n "),a("span",{class:"token comment"},"// contents of two or more objects, storing the"),t("\n "),a("span",{class:"token comment"},"// result in the first object. The first object"),t("\n "),a("span",{class:"token comment"},"// is generally empty because we don't want to alter"),t("\n "),a("span",{class:"token comment"},"// the default options for future instances of the plugin"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("options "),a("span",{class:"token operator"},"="),t(" $"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"extend"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},"{"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},","),t(" defaults"),a("span",{class:"token punctuation"},","),t(" options"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_defaults "),a("span",{class:"token operator"},"="),t(" defaults"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),t("_name "),a("span",{class:"token operator"},"="),t(" pluginName"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"init"),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n\n "),a("span",{class:"token class-name"},"Plugin"),a("span",{class:"token punctuation"},"."),t("prototype"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function-variable function"},"init"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token comment"},"// Place initialization logic here"),t("\n "),a("span",{class:"token comment"},"// We already have access to the DOM element and"),t("\n "),a("span",{class:"token comment"},"// the options via the instance, e.g. this.element"),t("\n "),a("span",{class:"token comment"},"// and this.options"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n\n "),a("span",{class:"token comment"},"// A really lightweight plugin wrapper around the constructor,"),t("\n "),a("span",{class:"token comment"},"// preventing against multiple instantiations"),t("\n $"),a("span",{class:"token punctuation"},"."),t("fn"),a("span",{class:"token punctuation"},"["),t("pluginName"),a("span",{class:"token punctuation"},"]"),t(),a("span",{class:"token operator"},"="),t(),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token parameter"},"options"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"return"),t(),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"each"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"function"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n "),a("span",{class:"token keyword"},"if"),t(),a("span",{class:"token punctuation"},"("),a("span",{class:"token operator"},"!"),t("$"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"data"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'plugin_'"),t(),a("span",{class:"token operator"},"+"),t(" pluginName"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),t(),a("span",{class:"token punctuation"},"{"),t("\n $"),a("span",{class:"token punctuation"},"."),a("span",{class:"token function"},"data"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token string"},"'plugin_'"),t(),a("span",{class:"token operator"},"+"),t(" pluginName"),a("span",{class:"token punctuation"},","),t(),a("span",{class:"token keyword"},"new"),t(),a("span",{class:"token class-name"},"Plugin"),a("span",{class:"token punctuation"},"("),a("span",{class:"token keyword"},"this"),a("span",{class:"token punctuation"},","),t(" options"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n "),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},";"),t("\n"),a("span",{class:"token punctuation"},"}"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},"("),t("jQuery"),a("span",{class:"token punctuation"},","),t(" window"),a("span",{class:"token punctuation"},","),t(" document"),a("span",{class:"token punctuation"},")"),a("span",{class:"token punctuation"},";"),t("\n")])]),a("div",{class:"line-numbers-wrapper"},[a("span",{class:"line-number"},"1"),a("br"),a("span",{class:"line-number"},"2"),a("br"),a("span",{class:"line-number"},"3"),a("br"),a("span",{class:"line-number"},"4"),a("br"),a("span",{class:"line-number"},"5"),a("br"),a("span",{class:"line-number"},"6"),a("br"),a("span",{class:"line-number"},"7"),a("br"),a("span",{class:"line-number"},"8"),a("br"),a("span",{class:"line-number"},"9"),a("br"),a("span",{class:"line-number"},"10"),a("br"),a("span",{class:"line-number"},"11"),a("br"),a("span",{class:"line-number"},"12"),a("br"),a("span",{class:"line-number"},"13"),a("br"),a("span",{class:"line-number"},"14"),a("br"),a("span",{class:"line-number"},"15"),a("br"),a("span",{class:"line-number"},"16"),a("br"),a("span",{class:"line-number"},"17"),a("br"),a("span",{class:"line-number"},"18"),a("br"),a("span",{class:"line-number"},"19"),a("br"),a("span",{class:"line-number"},"20"),a("br"),a("span",{class:"line-number"},"21"),a("br"),a("span",{class:"line-number"},"22"),a("br"),a("span",{class:"line-number"},"23"),a("br"),a("span",{class:"line-number"},"24"),a("br"),a("span",{class:"line-number"},"25"),a("br"),a("span",{class:"line-number"},"26"),a("br"),a("span",{class:"line-number"},"27"),a("br"),a("span",{class:"line-number"},"28"),a("br"),a("span",{class:"line-number"},"29"),a("br"),a("span",{class:"line-number"},"30"),a("br"),a("span",{class:"line-number"},"31"),a("br"),a("span",{class:"line-number"},"32"),a("br"),a("span",{class:"line-number"},"33"),a("br"),a("span",{class:"line-number"},"34"),a("br"),a("span",{class:"line-number"},"35"),a("br"),a("span",{class:"line-number"},"36"),a("br"),a("span",{class:"line-number"},"37"),a("br"),a("span",{class:"line-number"},"38"),a("br"),a("span",{class:"line-number"},"39"),a("br"),a("span",{class:"line-number"},"40"),a("br"),a("span",{class:"line-number"},"41"),a("br"),a("span",{class:"line-number"},"42"),a("br"),a("span",{class:"line-number"},"43"),a("br"),a("span",{class:"line-number"},"44"),a("br"),a("span",{class:"line-number"},"45"),a("br"),a("span",{class:"line-number"},"46"),a("br"),a("span",{class:"line-number"},"47"),a("br"),a("span",{class:"line-number"},"48"),a("br"),a("span",{class:"line-number"},"49"),a("br"),a("span",{class:"line-number"},"50"),a("br"),a("span",{class:"line-number"},"51"),a("br"),a("span",{class:"line-number"},"52"),a("br"),a("span",{class:"line-number"},"53"),a("br"),a("span",{class:"line-number"},"54"),a("br"),a("span",{class:"line-number"},"55"),a("br"),a("span",{class:"line-number"},"56"),a("br"),a("span",{class:"line-number"},"57"),a("br")])],-1),ra=a("h2",{id:"scalability-design"},[a("a",{class:"header-anchor",href:"#scalability-design","aria-hidden":"true"},"#"),t(" Scalability Design")],-1),ka=a("ul",null,[a("li",null,"Prefer composites over mixins."),a("li",null,"Always clone objects between components."),a("li",null,"Use namespaced state store modules."),a("li",null,"Write robust tests."),a("li",null,"Interact with REST API via services/SDK."),a("li",null,[t("Wrap third-party libraries other using them directly: "),a("ul",null,[a("li",null,"Abstract: changing dependencies without changing interface."),a("li",null,"Extendability: More obvious route to extending functionality.")])])],-1),ba=a("h2",{id:"domain-driven-design"},[a("a",{class:"header-anchor",href:"#domain-driven-design","aria-hidden":"true"},"#"),t(" Domain Driven Design")],-1),ma=a("h3",{id:"interface-layer"},[a("a",{class:"header-anchor",href:"#interface-layer","aria-hidden":"true"},"#"),t(" Interface Layer")],-1),da=a("p",null,"主要负责与外部系统进行交互与通信:",-1),ya=a("ul",null,[a("li",null,"做参数的基本处理, 比如入参校验, 回参 DTO 转换 (拆包, 组包)"),a("li",null,"Dubbo Services"),a("li",null,"RESTful API")],-1),fa=a("h3",{id:"application-layer"},[a("a",{class:"header-anchor",href:"#application-layer","aria-hidden":"true"},"#"),t(" Application Layer")],-1),ha=a("p",null,"Application Service 层只是很薄的一层, 它内部并不实现任何逻辑, 只是负责协调和转发 (流程编排), 委派业务动作给更下层的领域层.",-1),wa=a("h3",{id:"domain-layer"},[a("a",{class:"header-anchor",href:"#domain-layer","aria-hidden":"true"},"#"),t(" Domain Layer")],-1),ga=a("p",null,"Domain 层是领域模型系统的核心, 负责维护面向对象的领域模型, 几乎全部的业务逻辑都会在这一层实现. 内部主要包含 Entity, ValueObject, Domain Event, Repository.",-1),va=a("h3",{id:"infrastructure-layer"},[a("a",{class:"header-anchor",href:"#infrastructure-layer","aria-hidden":"true"},"#"),t(" Infrastructure Layer")],-1),Pa=a("p",null,"主要为 Interface, Application 和 Domain 三层提供支撑:",-1),Ca=a("ul",null,[a("li",null,"封装基础资源服务, 通过依赖注入方式解耦."),a("li",null,"Third-party tools, Message Queue, File, Cache, Database, Search etc."),a("li",null,"实现仓储接口 DB, 通常真正读写 DB.")],-1),Sa=a("h3",{id:"ddd-layout"},[a("a",{class:"header-anchor",href:"#ddd-layout","aria-hidden":"true"},"#"),t(" DDD Layout")],-1),ja=a("ul",null,[a("li",null,[a("a",{href:"https://github.com/lupguo/ddd-layout",target:"_blank",rel:"noopener noreferrer"},"DDD Layout in Golang")])],-1),Ma=a("h2",{id:"高并发系统设计"},[a("a",{class:"header-anchor",href:"#高并发系统设计","aria-hidden":"true"},"#"),t(" 高并发系统设计")],-1),xa=a("h3",{id:"concurrent-code-layer"},[a("a",{class:"header-anchor",href:"#concurrent-code-layer","aria-hidden":"true"},"#"),t(" Concurrent Code Layer")],-1),Da=a("ul",null,[a("li",null,"Mutex Performance"),a("li",null,"Database Caches"),a("li",null,"Update Merge"),a("li",null,"BloomFilter"),a("li",null,"Asynchronous"),a("li",null,"Multi-Thread")],-1),Aa=a("h3",{id:"concurrent-database-layer"},[a("a",{class:"header-anchor",href:"#concurrent-database-layer","aria-hidden":"true"},"#"),t(" Concurrent DataBase Layer")],-1),Ia=a("ul",null,[a("li",null,"DataBase Type: RDBMS -> NoSQL -> NewSQL"),a("li",null,"Table Structure Design"),a("li",null,"Index Design"),a("li",null,"Split Table"),a("li",null,"Read and Write Separation"),a("li",null,"Data Slice and Data Partition"),a("li",null,"Hot Data Cache")],-1),Na=a("h3",{id:"concurrent-architecture-layer"},[a("a",{class:"header-anchor",href:"#concurrent-architecture-layer","aria-hidden":"true"},"#"),t(" Concurrent Architecture Layer")],-1),Oa=a("ul",null,[a("li",null,"Microservices"),a("li",null,"Scale Friendly"),a("li",null,"FailFast"),a("li",null,"Data PreFetch"),a("li",null,"Multi-Level Caches")],-1),La=a("h2",{id:"高可用系统设计"},[a("a",{class:"header-anchor",href:"#高可用系统设计","aria-hidden":"true"},"#"),t(" 高可用系统设计")],-1),$a=a("h3",{id:"resource-isolation"},[a("a",{class:"header-anchor",href:"#resource-isolation","aria-hidden":"true"},"#"),t(" Resource Isolation")],-1),_a=a("h3",{id:"load-balance-design"},[a("a",{class:"header-anchor",href:"#load-balance-design","aria-hidden":"true"},"#"),t(" Load Balance Design")],-1),Ea=a("ul",null,[a("li",null,"Hardware Load Balance"),a("li",null,"Software Load Balance"),a("li",null,"Load Balance Algorithms: Random, RoundRobin, WeightRoundRobin, ConsistentHash"),a("li",null,"Error Machines Auto Detection"),a("li",null,"Error Services Auto Retirement"),a("li",null,"Services Retry Automation"),a("li",null,"Recovery Services Auto Detection")],-1),Ba=a("h3",{id:"idempotence-design"},[a("a",{class:"header-anchor",href:"#idempotence-design","aria-hidden":"true"},"#"),t(" Idempotence Design")],-1),Fa=a("p",null,"在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同.",-1),Ta=a("h4",{id:"write-idempotence-design"},[a("a",{class:"header-anchor",href:"#write-idempotence-design","aria-hidden":"true"},"#"),t(" Write Idempotence Design")],-1),Va=a("ul",null,[a("li",null,"Mutex"),a("li",null,"Key Index"),a("li",null,"Token"),a("li",null,"Data Version"),a("li",null,"State Machine")],-1),qa=a("h3",{id:"cap-theory"},[a("a",{class:"header-anchor",href:"#cap-theory","aria-hidden":"true"},"#"),t(" CAP Theory")],-1),Ra=a("p",null,"A distributed system to simultaneously provide more than two out of the following three guarantees:",-1),Ua=a("ul",null,[a("li",null,"Consistency: Every read receives the most recent write or an error."),a("li",null,"Availability: Every request receives a (non-error) response, without the guarantee that it contains the most recent write."),a("li",null,"Partition tolerance: The system continues to operate despite an arbitrary number of messages being dropped (or delayed) by the network between nodes.")],-1),Ha=a("h3",{id:"服务熔断"},[a("a",{class:"header-anchor",href:"#服务熔断","aria-hidden":"true"},"#"),t(" 服务熔断")],-1),za=a("h3",{id:"服务限流"},[a("a",{class:"header-anchor",href:"#服务限流","aria-hidden":"true"},"#"),t(" 服务限流")],-1),Ga=a("h4",{id:"服务限流算法"},[a("a",{class:"header-anchor",href:"#服务限流算法","aria-hidden":"true"},"#"),t(" 服务限流算法")],-1),Wa=a("p",null,"一定程度上可以参考计算机网络拥塞控制算法:",-1),Qa=a("ul",null,[a("li",null,"计数器固定窗口限流: 单位时间内达到阈值后开始限流, 单位时间后重新计数. 窗口临界处流量过大, 导致服务不可用."),a("li",null,"滑动窗口限流: 在固定窗口限流基础上, 将窗口向右滑动."),a("li",null,"漏斗限流: 未满前可进入, 满则拒绝. 可以平滑流量, 无法解决突发流量."),a("li",null,"令牌桶限流: 在漏斗限流基础上, 以恒定速率产生令牌. 拥有令牌可进入, 无则拒绝. 可以平滑流量, 可以容忍突发流量.")],-1),Xa=a("h4",{id:"服务限流策略"},[a("a",{class:"header-anchor",href:"#服务限流策略","aria-hidden":"true"},"#"),t(" 服务限流策略")],-1),Ja=a("ul",null,[a("li",null,"服务拒绝"),a("li",null,"延时处理"),a("li",null,"请求分级"),a("li",null,"监控预警"),a("li",null,"动态限流"),a("li",null,"动态扩容")],-1),Ka=a("h4",{id:"服务限流位置"},[a("a",{class:"header-anchor",href:"#服务限流位置","aria-hidden":"true"},"#"),t(" 服务限流位置")],-1),Ya=a("ul",null,[a("li",null,"接入层限流: 通过 Nginx/API Router 对 DNS/IP 限流."),a("li",null,"应用限流: 每个服务拥有自己的集群限流服务."),a("li",null,"基础服务限流: 对消息队列/数据库限流.")],-1),Za=a("h3",{id:"服务降级"},[a("a",{class:"header-anchor",href:"#服务降级","aria-hidden":"true"},"#"),t(" 服务降级")],-1),nt=a("h2",{id:"reference"},[a("a",{class:"header-anchor",href:"#reference","aria-hidden":"true"},"#"),t(" Reference")],-1),st=a("ul",null,[a("li",null,[a("a",{href:"http://www.dofactory.com/javascript/design-patterns",target:"_blank",rel:"noopener noreferrer"},"JavaScript Design Patterns")])],-1);o.render=function(a,t,e,o,at,tt){return n(),s("div",null,[c,p,l,u,i,r,k,b,m,d,y,f,h,w,g,v,P,C,S,j,M,x,D,A,I,N,O,L,$,_,E,B,F,T,V,q,R,U,H,z,G,W,Q,X,J,K,Y,Z,nn,sn,an,tn,en,on,cn,pn,ln,un,rn,kn,bn,mn,dn,yn,fn,hn,wn,gn,vn,Pn,Cn,Sn,jn,Mn,xn,Dn,An,In,Nn,On,Ln,$n,_n,En,Bn,Fn,Tn,Vn,qn,Rn,Un,Hn,zn,Gn,Wn,Qn,Xn,Jn,Kn,Yn,Zn,ns,ss,as,ts,es,os,cs,ps,ls,us,is,rs,ks,bs,ms,ds,ys,fs,hs,ws,gs,vs,Ps,Cs,Ss,js,Ms,xs,Ds,As,Is,Ns,Os,Ls,$s,_s,Es,Bs,Fs,Ts,Vs,qs,Rs,Us,Hs,zs,Gs,Ws,Qs,Xs,Js,Ks,Ys,Zs,na,sa,aa,ta,ea,oa,ca,pa,la,ua,ia,ra,ka,ba,ma,da,ya,fa,ha,wa,ga,va,Pa,Ca,Sa,ja,Ma,xa,Da,Aa,Ia,Na,Oa,La,$a,_a,Ea,Ba,Fa,Ta,Va,qa,Ra,Ua,Ha,za,Ga,Wa,Qa,Xa,Ja,Ka,Ya,Za,nt,st])};export default o;export{e as __pageData}; diff --git a/assets/programming_devops_softwareTestingBasicNotes.md.a3d46251.js b/assets/programming_devops_softwareTestingBasicNotes.md.a3d46251.js new file mode 100644 index 00000000000..081fc4069de --- /dev/null +++ b/assets/programming_devops_softwareTestingBasicNotes.md.a3d46251.js @@ -0,0 +1 @@ +import{o as l,c as i,a as e}from"./app.6dd2a1b7.js";const a='{"title":"Software Testing Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"测试模型","slug":"测试模型"},{"level":3,"title":"PIE 模型","slug":"pie-模型"},{"level":3,"title":"启发式测试策略模型","slug":"启发式测试策略模型"},{"level":3,"title":"用户体验测试","slug":"用户体验测试"},{"level":2,"title":"测试规模","slug":"测试规模"},{"level":2,"title":"基础概念","slug":"基础概念"},{"level":2,"title":"测试方法","slug":"测试方法"},{"level":3,"title":"图结构覆盖方法","slug":"图结构覆盖方法"},{"level":3,"title":"数据流覆盖方法","slug":"数据流覆盖方法"},{"level":3,"title":"逻辑覆盖方法","slug":"逻辑覆盖方法"},{"level":3,"title":"随机测试方法","slug":"随机测试方法"},{"level":3,"title":"黑盒测试方法","slug":"黑盒测试方法"},{"level":3,"title":"Fault Location","slug":"fault-location"},{"level":3,"title":"模糊测试","slug":"模糊测试"},{"level":2,"title":"移动设备","slug":"移动设备"},{"level":2,"title":"Useful Tools","slug":"useful-tools"},{"level":2,"title":"Bug List","slug":"bug-list"},{"level":3,"title":"Basic Bug","slug":"basic-bug"},{"level":3,"title":"C Bug","slug":"c-bug"},{"level":3,"title":"偶发性 Bug","slug":"偶发性-bug"}],"relativePath":"programming/devops/softwareTestingBasicNotes.md","lastUpdated":1627196177000}',t={},r=e('

    Software Testing Basic Notes

    测试模型

    PIE 模型

    (Execution)Fault,(Infection)Error,(Propagation)Failure

    启发式测试策略模型

    Heuristic Test Strategy Model - 软件功能测试 (难以实现完全自动化):

    • 关注价值(Value):用户得到价值
    • 风险驱动(Risk):降低价值/用户体验的风险项
    • 产品元素(Product Elements)
    • 结构(Structure):产品物理元素(如代码、硬件、配置文件)
    • 功能(Function):产品功能
    • 数据(Data):产品所操作的数据(如输入、输出)
    • 接口(Interface):产品所使用/暴露出的接口
    • 平台(Platform):产品所依赖的外部元素(如操作系统、输入/输出设备)
    • 操作(Operation):产品被使用的方式(如键盘、鼠标、触摸等命令操作)
    • 时间(Time):影响产品的时间因素
    • 组合元素:测试产品功能间协作

    用户体验测试

    对软件功能测试的有益补充:

    • 功能性体验
    • 易用性体验
    • 性能体验
    • 可靠性体验(如软件兼容性)

    测试规模

    Unit/Module/Integration/System Testing

    基础概念

    测试路径:起始顶点至终止顶点

    测试方法

    图结构覆盖方法

    • 顶点覆盖,边覆盖,边对覆盖(三顶点,两邻边)
    • VC/EC/EPC 法

    数据流覆盖方法

    • 数据流覆盖:定义处覆盖,使用处覆盖
    • DU 法(Data&Use)

    逻辑覆盖方法

    • 逻辑覆盖:条件处覆盖,判定处覆盖
    • DC(Decision),CC(Condition)法
    • MC/DC 法
    • MCC 法(完全覆盖)

    随机测试方法

    • ART(随机测试):每个用例间"距离"尽可能远

    黑盒测试方法

    • 等价类划分:合法输入(软件功能),非法输入(异常处理)
    • 等价类的边界值分析:合法 MIN,MIN+,MAX-,MAX 非法:MIN-,MAX+
    • 决策表+组合测试:简化决策表(考虑输入相关性)
      • 组合用例:维度与测试准度成正比
      • 约束用例:需避开约束输入(输入相关性,同时输入会成为无效输入)
      • 测试用例约简+测试用例优先级:额外贪心算法进行化简+排序测试用例求得近似解

    Fault Location

    • 代码可疑度= (失败测试用例经过数/失败测试用例总数)/ (成功测试用例经过数/成功测试用例总数+失败测试用例经过数/失败测试用例总数)

    即在执行过目标代码的测试用例中失败测试用例占比

    模糊测试

    Fuzzing - 是一种通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法

    移动设备

    • 机型碎片化
    • 屏幕碎片化
    • 环境碎片化
    • 耗电量

    Useful Tools

    • JUnit
    • SeleniumIDE
    • PICT
    • GuiTar
    • Randoop
    • 压力测试(Apache Jmeter)
    • 移动测试(Monkey:Random Testing)

    Bug List

    Basic Bug

    • 必须进行输入验证 - 永远不要相信用户输入
    • 永不使用未经验证的数值的长度或大小
    • 必须返回正确的错误状态
    • 注意(隐式)类型转换

    C Bug

    • 栈缓冲区溢出
    • 空指针解引用
    • (隐式)类型转换
    • GOT 覆写(Global Offset Table)

    偶发性 Bug

    • 多进程完全异步编程的复杂性
    • 逐渐地内存泄漏
    ',42);t.render=function(e,a,t,h,s,u){return l(),i("div",null,[r])};export default t;export{a as __pageData}; diff --git a/assets/programming_devops_softwareTestingBasicNotes.md.a3d46251.lean.js b/assets/programming_devops_softwareTestingBasicNotes.md.a3d46251.lean.js new file mode 100644 index 00000000000..ecb2b482643 --- /dev/null +++ b/assets/programming_devops_softwareTestingBasicNotes.md.a3d46251.lean.js @@ -0,0 +1 @@ +import{o as l,c as i,a as e}from"./app.6dd2a1b7.js";const a='{"title":"Software Testing Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"测试模型","slug":"测试模型"},{"level":3,"title":"PIE 模型","slug":"pie-模型"},{"level":3,"title":"启发式测试策略模型","slug":"启发式测试策略模型"},{"level":3,"title":"用户体验测试","slug":"用户体验测试"},{"level":2,"title":"测试规模","slug":"测试规模"},{"level":2,"title":"基础概念","slug":"基础概念"},{"level":2,"title":"测试方法","slug":"测试方法"},{"level":3,"title":"图结构覆盖方法","slug":"图结构覆盖方法"},{"level":3,"title":"数据流覆盖方法","slug":"数据流覆盖方法"},{"level":3,"title":"逻辑覆盖方法","slug":"逻辑覆盖方法"},{"level":3,"title":"随机测试方法","slug":"随机测试方法"},{"level":3,"title":"黑盒测试方法","slug":"黑盒测试方法"},{"level":3,"title":"Fault Location","slug":"fault-location"},{"level":3,"title":"模糊测试","slug":"模糊测试"},{"level":2,"title":"移动设备","slug":"移动设备"},{"level":2,"title":"Useful Tools","slug":"useful-tools"},{"level":2,"title":"Bug List","slug":"bug-list"},{"level":3,"title":"Basic Bug","slug":"basic-bug"},{"level":3,"title":"C Bug","slug":"c-bug"},{"level":3,"title":"偶发性 Bug","slug":"偶发性-bug"}],"relativePath":"programming/devops/softwareTestingBasicNotes.md","lastUpdated":1627196177000}',t={},r=e('',42);t.render=function(e,a,t,h,s,u){return l(),i("div",null,[r])};export default t;export{a as __pageData}; diff --git a/assets/programming_functionalProgramming_functionalProgrammingBasicNotes.md.140216fc.js b/assets/programming_functionalProgramming_functionalProgrammingBasicNotes.md.140216fc.js new file mode 100644 index 00000000000..68704f1b2c7 --- /dev/null +++ b/assets/programming_functionalProgramming_functionalProgrammingBasicNotes.md.140216fc.js @@ -0,0 +1 @@ +import{o as a,c as s,a as n}from"./app.6dd2a1b7.js";const e='{"title":"Functional Programming Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Lambda Calculus","slug":"lambda-calculus"},{"level":3,"title":"Lambda Expression (Lambda-Term)","slug":"lambda-expression-lambda-term"},{"level":3,"title":"Lambda Reduction","slug":"lambda-reduction"},{"level":3,"title":"Church Numerals","slug":"church-numerals"},{"level":2,"title":"Definition for Functional Programming","slug":"definition-for-functional-programming"},{"level":2,"title":"Datatype","slug":"datatype"},{"level":3,"title":"Datatype Binding","slug":"datatype-binding"},{"level":3,"title":"Built-in Tagged Constructor","slug":"built-in-tagged-constructor"},{"level":3,"title":"Type Constructor","slug":"type-constructor"},{"level":2,"title":"Pattern Matching","slug":"pattern-matching"},{"level":2,"title":"Tail Position, Tail expression, Tail Call and Tail Recursion","slug":"tail-position-tail-expression-tail-call-and-tail-recursion"},{"level":2,"title":"Rules for expressions","slug":"rules-for-expressions"},{"level":3,"title":"samples","slug":"samples"},{"level":2,"title":"Standard ML","slug":"standard-ml"},{"level":3,"title":"functions","slug":"functions"},{"level":3,"title":"tuples","slug":"tuples"},{"level":3,"title":"lists","slug":"lists"},{"level":3,"title":"let expressions","slug":"let-expressions"},{"level":3,"title":"options","slug":"options"},{"level":3,"title":"boolean operations","slug":"boolean-operations"},{"level":3,"title":"closure","slug":"closure"},{"level":2,"title":"Type inference","slug":"type-inference"}],"relativePath":"programming/functionalProgramming/functionalProgrammingBasicNotes.md","lastUpdated":1627196177000}',p={},l=n('

    Functional Programming Basic Notes

    Lambda Calculus

    Lambda Expression (Lambda-Term)

    • Variable: x
    • Abstraction: λx.M
    • Application: M N

    e.g. λx.y λx.(λy.xy)

    • 变量 x 本身就是一个有效的 lambda 项
    • 如果 t 是一个 lambda 项,而 x 是一个变量,则 λx.t 是一个 lambda 项(称为 lambda 抽象)
    • 如果 t 和 s 是 lambda 项,那么 (ts) 是一个 lambda 项(称为应用)

    Lambda Reduction

    α 转换

    α: λx.x ≡ λy.y 等价变量替换

    β 归约

    β: ((λV.E) E′) ≡ E[V := E′] 函数抽象应用(apply)于参数的过程

    η 归约

    λx.M x ≡ M 用于清除 lambda 表达式中存在的冗余函数抽象

    Church Numerals

    按照皮亚诺公理可得自然数集合表示为 {0, S(0), S(S(0)), ...}, 于是得到如下定义:

    S ≡ λn.λf.λx.f (n f x)\n\n0 ≡ λf.λx.x\n1 ≡ λf.λx.f x\n2 ≡ λf.λx.f (f x)\n3 ≡ λf.λx.f (f (f x))\n...\n
    1
    2
    3
    4
    5
    6
    7

    对后继函数 S 和丘奇数的简单验证如下:

    S 0\n≡ (λn.λf.λx.f (n f x)) λf.λx.x\n= (λn.λg.λy.g (n g y)) λf.λx.x    // alpha\n= (λf.λx.f (n f x))[n := λf.λx.x] // beta\n= λg.λy.g ((λf.λx.x) g y)         // substitute\n= λg.λy.g (x[f := g, x := y])     // beta\n= λg.λy.g y                       // substitute\n= λf.λx.f x                       // alpha\n≡ 1\n
    1
    2
    3
    4
    5
    6
    7
    8
    9

    Definition for Functional Programming

    • avoid mutation
    • first class functions
    • recursive data structures and recursive functions
    • laziness

    Datatype

    Datatype Binding

    tagged union, every constructor name as tag, fields for different constructors can't exist at the same time

    Built-in Tagged Constructor

    • NONE
    • SOME i
    • []
    • x :: xs (infix constructor)
    • ()

    Type Constructor

    type constructor: datatype bindings with variables

    datatype 'a myList = EMPTY | CONS of 'a * 'a myList\nmyList isn't a type, int list is a type\n
    1
    2
    • 'a , 'a equivalent/different
    • 'a, 'b different
    • ''a, ''a equivalent

    Pattern Matching

    • null/isSome check tag part(variant)
    • hd/tl/valOf check data part (extract data)
    case e of\n      p1 => e1\n    | pn => en\n\nval p = e (* declare multiple variables once time in p(pattern) *)\n\n(* declare multiple callee arguments(hidden to caller) once time in p(pattern) *)\nfun foo p = e\n
    1
    2
    3
    4
    5
    6
    7
    8

    In SML, all functions only take 1 argument, a tuple/record:

    fun f (x, y, z) = x + y + z seems that takes 3 arguments, but truly owing to pattern matching only takes 1 tuple argument Likewise, fun f () = 0 takes 1 empty tuple argument.

    Further more, tuples is syntactic sugar for records.

    As a whole: all functions only take 1 record argument owing to pattern matching.

    Tail Position, Tail expression, Tail Call and Tail Recursion

    recursive definition for Tail Position:

    • if E isn't in tail position, then sub expressions of E aren't in tail position
    • if E is in tail position, then some sub expressions of E are in tail position
    if eb then e1 else e2\n
    1

    is in tail position, then e1 and e2 are in tail position, not eb

    f (x, e)\n
    1

    is in tail position, then f is in tail position(tail call), not x and e

    fun factorial n =\n    let\n        fun aux(n, acc) =\n            if\n                n = 0\n            then\n                acc\n            else\n                aux (n-1, n*acc)\n    in\n        aux (n,1)\n    end\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    Rules for expressions

    • Syntactic: syntax rules
    • Semantic: type checking rules
    • Runtime: evaluation rules

    samples

    syntax: if e1 then e2 else e3\ntype: e1 = bool,  e2 = e3 = any\nevaluation: e1 ? e2 : e3\n
    1
    2
    3

    Standard ML

    functions

    syntax: fun name (arg1: type1, .., argN: typeN) = body\ntype: name = type1 * ... * typeN -> body_type\nlazy evaluation\n
    1
    2
    3

    tuples

    (* tuples *)\nsyntax: e = (e1, ..., en)\ntype: e1 * ... * en (can become fun's arguments list)\nevaluation: #1 e, #2 e, ..., #n e\n
    1
    2
    3
    4

    lists

    (* lists *)\nsyntax: l = [e1, ..., en]\ntype: [] = elem_type list; hd(head) l = elem_type, tl(tail) x = elem_type list\nevaluation: cons = e :: l; null [] = false;\n\n> 6 :: [1, 3, 5]\n
    1
    2
    3
    4
    5
    6

    let expressions

    syntax: let\n            b1 b2 ... bn\n        in\n            body\n        end\ntype: whole let type = body_type\nevaluation: whole let result = body_result\n
    1
    2
    3
    4
    5
    6
    7

    options

    • NONE : type = 'a option
    • SOME e: type = e_type option
    • isSome: type = 'a option -> bool
    • valOf : type = 'a option -> 'a

    boolean operations

    • e1 andalso e2: keyword
    • e1 orelse e2 : keyword
    • not e1 : bool -> bool
    • =(equal) <>(not equal) > < >= <=: require two same type elem

    closure

    lexical scope vs dynamic scope

    • lexical scope: function where defined
    • dynamic scope: function where called

    compose and pipeline

    fun sqrt_of_abs = Math.sqrt o Real.fromInt o abs\n\ninfix !>\nfun x !> f = f x\n\nfun sqrt_of_abs i = i !> abs !> Real.fromInt !> Math.sqrt\n
    1
    2
    3
    4
    5
    6

    curry and unCurry

    fun carry f x y = f (x, y)\nfun unCarry f (x, y) = f x y\n\nfun range (i, j) = if i > j then [] else i :: range(i+1, j)\nfun countUp = curry range 1\n\nval arr = countUp 7 (* maps to [1, 2, ..., 7] *)\n
    1
    2
    3
    4
    5
    6
    7

    Type inference

    ',70);p.render=function(n,e,p,t,o,r){return a(),s("div",null,[l])};export default p;export{e as __pageData}; diff --git a/assets/programming_functionalProgramming_functionalProgrammingBasicNotes.md.140216fc.lean.js b/assets/programming_functionalProgramming_functionalProgrammingBasicNotes.md.140216fc.lean.js new file mode 100644 index 00000000000..75c0b525c89 --- /dev/null +++ b/assets/programming_functionalProgramming_functionalProgrammingBasicNotes.md.140216fc.lean.js @@ -0,0 +1 @@ +import{o as a,c as s,a as n}from"./app.6dd2a1b7.js";const e='{"title":"Functional Programming Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Lambda Calculus","slug":"lambda-calculus"},{"level":3,"title":"Lambda Expression (Lambda-Term)","slug":"lambda-expression-lambda-term"},{"level":3,"title":"Lambda Reduction","slug":"lambda-reduction"},{"level":3,"title":"Church Numerals","slug":"church-numerals"},{"level":2,"title":"Definition for Functional Programming","slug":"definition-for-functional-programming"},{"level":2,"title":"Datatype","slug":"datatype"},{"level":3,"title":"Datatype Binding","slug":"datatype-binding"},{"level":3,"title":"Built-in Tagged Constructor","slug":"built-in-tagged-constructor"},{"level":3,"title":"Type Constructor","slug":"type-constructor"},{"level":2,"title":"Pattern Matching","slug":"pattern-matching"},{"level":2,"title":"Tail Position, Tail expression, Tail Call and Tail Recursion","slug":"tail-position-tail-expression-tail-call-and-tail-recursion"},{"level":2,"title":"Rules for expressions","slug":"rules-for-expressions"},{"level":3,"title":"samples","slug":"samples"},{"level":2,"title":"Standard ML","slug":"standard-ml"},{"level":3,"title":"functions","slug":"functions"},{"level":3,"title":"tuples","slug":"tuples"},{"level":3,"title":"lists","slug":"lists"},{"level":3,"title":"let expressions","slug":"let-expressions"},{"level":3,"title":"options","slug":"options"},{"level":3,"title":"boolean operations","slug":"boolean-operations"},{"level":3,"title":"closure","slug":"closure"},{"level":2,"title":"Type inference","slug":"type-inference"}],"relativePath":"programming/functionalProgramming/functionalProgrammingBasicNotes.md","lastUpdated":1627196177000}',p={},l=n('',70);p.render=function(n,e,p,t,o,r){return a(),s("div",null,[l])};export default p;export{e as __pageData}; diff --git a/assets/programming_game_gameDesignBasicNotes.md.fb3c7fed.js b/assets/programming_game_gameDesignBasicNotes.md.fb3c7fed.js new file mode 100644 index 00000000000..21ce2e923b6 --- /dev/null +++ b/assets/programming_game_gameDesignBasicNotes.md.fb3c7fed.js @@ -0,0 +1 @@ +import{o as l,c as i,a}from"./app.6dd2a1b7.js";const e='{"title":"Game Design Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"游戏心理学","slug":"游戏心理学"},{"level":2,"title":"声音设计(音频制作/声音合成)","slug":"声音设计-音频制作-声音合成"},{"level":2,"title":"角色设计","slug":"角色设计"},{"level":2,"title":"AI","slug":"ai"},{"level":3,"title":"技能形式","slug":"技能形式"},{"level":2,"title":"战斗设计","slug":"战斗设计"},{"level":2,"title":"镜头设计","slug":"镜头设计"}],"relativePath":"programming/game/gameDesignBasicNotes.md","lastUpdated":1627196177000}',r={},s=a('

    Game Design Basic Notes

    游戏心理学

    • 代入感/角色扮演
    • 操纵感/打击感
    • 故事性
    • 挑战性
    • 探索性
    • 收集性
    • 个性化与自定义
    • 社交性

    声音设计(音频制作/声音合成)

    • 声音包络 (ASDR): attack decay sustain release

    角色设计

    • 表面模型设计: 2D/3D 模型 风格 动作 属性
    • 逻辑设计: 装备切换显示 动作绑点 碰撞盒

    AI

    • 触发逻辑: 警戒范围 攻击范围
    • 援助逻辑
    • 逃跑逻辑
    • 集群逻辑
    • 刷新逻辑
    • 仇恨列表
    • 技能前摇
    • 技能后摇

    技能形式

    • 爆发
    • 冲锋
    • 防御: 霸体 格挡 弹刀 防反 绝对防御
    • 发怒: 受击 援助 空击
    • 保护

    战斗设计

    • 打击感: 镜头抖动 镜头特写 镜头位移 镜头慢犯
    • 流畅感: 操作缓存响应 动画插值
    • 表现力: 丰富攻击招式 丰富受击反馈 丰富死亡效果

    镜头设计

    • 跟随主角
    • 跟随 Boss
    • 场景空间差值镜头
    • 场景限行差值镜头
    ',16);r.render=function(a,e,r,h,t,d){return l(),i("div",null,[s])};export default r;export{e as __pageData}; diff --git a/assets/programming_game_gameDesignBasicNotes.md.fb3c7fed.lean.js b/assets/programming_game_gameDesignBasicNotes.md.fb3c7fed.lean.js new file mode 100644 index 00000000000..60450ec1ecb --- /dev/null +++ b/assets/programming_game_gameDesignBasicNotes.md.fb3c7fed.lean.js @@ -0,0 +1 @@ +import{o as l,c as i,a}from"./app.6dd2a1b7.js";const e='{"title":"Game Design Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"游戏心理学","slug":"游戏心理学"},{"level":2,"title":"声音设计(音频制作/声音合成)","slug":"声音设计-音频制作-声音合成"},{"level":2,"title":"角色设计","slug":"角色设计"},{"level":2,"title":"AI","slug":"ai"},{"level":3,"title":"技能形式","slug":"技能形式"},{"level":2,"title":"战斗设计","slug":"战斗设计"},{"level":2,"title":"镜头设计","slug":"镜头设计"}],"relativePath":"programming/game/gameDesignBasicNotes.md","lastUpdated":1627196177000}',r={},s=a('',16);r.render=function(a,e,r,h,t,d){return l(),i("div",null,[s])};export default r;export{e as __pageData}; diff --git a/assets/programming_linux_linuxBasicNotes.md.37adc63b.js b/assets/programming_linux_linuxBasicNotes.md.37adc63b.js new file mode 100644 index 00000000000..8fef1c1386f --- /dev/null +++ b/assets/programming_linux_linuxBasicNotes.md.37adc63b.js @@ -0,0 +1 @@ +import{o as n,c as s,a}from"./app.6dd2a1b7.js";const e='{"title":"Linux Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Linux Boot System","slug":"linux-boot-system"},{"level":3,"title":"Grub","slug":"grub"},{"level":3,"title":"重装 Linux","slug":"重装-linux"},{"level":2,"title":"SSH 命令","slug":"ssh-命令"},{"level":3,"title":"Key","slug":"key"},{"level":3,"title":"SSHD","slug":"sshd"},{"level":3,"title":"SSH Config File","slug":"ssh-config-file"},{"level":3,"title":"密钥文件","slug":"密钥文件"},{"level":3,"title":"远程传输文件","slug":"远程传输文件"},{"level":2,"title":"命令优先级","slug":"命令优先级"},{"level":2,"title":"Linux 文件架构","slug":"linux-文件架构"},{"level":2,"title":"Ubuntu","slug":"ubuntu"},{"level":3,"title":"Ubuntu Locale Settings","slug":"ubuntu-locale-settings"},{"level":3,"title":"Ubuntu Themes","slug":"ubuntu-themes"},{"level":2,"title":"Arch Linux","slug":"arch-linux"},{"level":3,"title":"Basic Arch Linux Setup","slug":"basic-arch-linux-setup"},{"level":3,"title":"Pacman","slug":"pacman"},{"level":3,"title":"AUR","slug":"aur"},{"level":2,"title":"基本处理命令","slug":"基本处理命令"},{"level":3,"title":"ls","slug":"ls"},{"level":3,"title":"cd","slug":"cd"},{"level":3,"title":"pwd","slug":"pwd"},{"level":3,"title":"rm","slug":"rm"},{"level":3,"title":"cp","slug":"cp"},{"level":3,"title":"mv","slug":"mv"},{"level":3,"title":"ln","slug":"ln"},{"level":2,"title":"基本搜索命令","slug":"基本搜索命令"},{"level":3,"title":"locate","slug":"locate"},{"level":3,"title":"type","slug":"type"},{"level":3,"title":"apropos","slug":"apropos"},{"level":3,"title":"whereis and whatis","slug":"whereis-and-whatis"},{"level":3,"title":"which","slug":"which"},{"level":3,"title":"find","slug":"find"},{"level":3,"title":"Grep","slug":"grep"},{"level":2,"title":"Process Command","slug":"process-command"},{"level":3,"title":"uptime","slug":"uptime"},{"level":3,"title":"ps","slug":"ps"},{"level":3,"title":"top","slug":"top"},{"level":3,"title":"vmstat","slug":"vmstat"},{"level":3,"title":"pidstat","slug":"pidstat"},{"level":3,"title":"mpstat","slug":"mpstat"},{"level":3,"title":"lscpu","slug":"lscpu"},{"level":3,"title":"jobs","slug":"jobs"},{"level":3,"title":"bg","slug":"bg"},{"level":3,"title":"fg","slug":"fg"},{"level":3,"title":"kill","slug":"kill"},{"level":3,"title":"killall","slug":"killall"},{"level":3,"title":"shutdown","slug":"shutdown"},{"level":3,"title":"pstree","slug":"pstree"},{"level":3,"title":"xload and tload","slug":"xload-and-tload"},{"level":3,"title":"screen","slug":"screen"},{"level":2,"title":"CLI Input Output Command","slug":"cli-input-output-command"},{"level":3,"title":"cat","slug":"cat"},{"level":3,"title":"sort","slug":"sort"},{"level":3,"title":"uniq","slug":"uniq"},{"level":3,"title":"wc","slug":"wc"},{"level":3,"title":"Head and Tail","slug":"head-and-tail"},{"level":3,"title":"Tee","slug":"tee"},{"level":3,"title":"nl","slug":"nl"},{"level":3,"title":"fold","slug":"fold"},{"level":3,"title":"fmt","slug":"fmt"},{"level":3,"title":"pr","slug":"pr"},{"level":3,"title":"printf","slug":"printf"},{"level":2,"title":"帮助命令","slug":"帮助命令"},{"level":3,"title":"man","slug":"man"},{"level":3,"title":"help shell 内部命令","slug":"help-shell-内部命令"},{"level":3,"title":"info","slug":"info"},{"level":3,"title":"System Info","slug":"system-info"},{"level":2,"title":"压缩命令","slug":"压缩命令"},{"level":3,"title":"Zip","slug":"zip"},{"level":3,"title":"Gz","slug":"gz"},{"level":3,"title":"Bz2","slug":"bz2"},{"level":3,"title":"Tar","slug":"tar"},{"level":3,"title":"7z","slug":"_7z"},{"level":2,"title":"User and Group Command","slug":"user-and-group-command"},{"level":3,"title":"组操作","slug":"组操作"},{"level":3,"title":"用户操作","slug":"用户操作"},{"level":2,"title":"权限管理命令","slug":"权限管理命令"},{"level":3,"title":"普通权限","slug":"普通权限"},{"level":3,"title":"ACL 权限","slug":"acl-权限"},{"level":3,"title":"sudo 权限","slug":"sudo-权限"},{"level":3,"title":"SetUID and SetGID","slug":"setuid-and-setgid"},{"level":2,"title":"显示器管理命令","slug":"显示器管理命令"},{"level":3,"title":"xrandr","slug":"xrandr"},{"level":2,"title":"主机信息管理命令","slug":"主机信息管理命令"},{"level":2,"title":"Disk IO","slug":"disk-io"},{"level":3,"title":"挂载命令","slug":"挂载命令"},{"level":3,"title":"修复命令","slug":"修复命令"},{"level":3,"title":"分区命令","slug":"分区命令"},{"level":3,"title":"Zero Copy","slug":"zero-copy"},{"level":2,"title":"Device Command","slug":"device-command"},{"level":3,"title":"Monitor Info","slug":"monitor-info"},{"level":3,"title":"Touch Pad Synoptics","slug":"touch-pad-synoptics"},{"level":2,"title":"包管理命令","slug":"包管理命令"},{"level":3,"title":"rpm 命令","slug":"rpm-命令"},{"level":3,"title":"yum","slug":"yum"},{"level":3,"title":"源码包安装","slug":"源码包安装"},{"level":3,"title":"Applications Management","slug":"applications-management"},{"level":2,"title":"网络连接命令","slug":"网络连接命令"},{"level":3,"title":"wget","slug":"wget"},{"level":3,"title":"Certificate Bot","slug":"certificate-bot"},{"level":3,"title":"GFW","slug":"gfw"},{"level":2,"title":"网络管理命令","slug":"网络管理命令"},{"level":3,"title":"ufw","slug":"ufw"},{"level":3,"title":"arp","slug":"arp"},{"level":3,"title":"netstat","slug":"netstat"},{"level":3,"title":"nslookup","slug":"nslookup"},{"level":3,"title":"ping","slug":"ping"},{"level":3,"title":"telnet","slug":"telnet"},{"level":3,"title":"Trace Route","slug":"trace-route"},{"level":3,"title":"Net Filter Framework","slug":"net-filter-framework"},{"level":2,"title":"网络扫描命令","slug":"网络扫描命令"},{"level":3,"title":"fping","slug":"fping"},{"level":3,"title":"hping","slug":"hping"},{"level":3,"title":"mtr","slug":"mtr"},{"level":3,"title":"nmap","slug":"nmap"},{"level":3,"title":"ncat","slug":"ncat"},{"level":2,"title":"脚本运行命令","slug":"脚本运行命令"},{"level":3,"title":"Systemctl","slug":"systemctl"},{"level":3,"title":"定时任务","slug":"定时任务"},{"level":3,"title":"后台任务","slug":"后台任务"},{"level":3,"title":"开机任务","slug":"开机任务"},{"level":2,"title":"历史记录命令","slug":"历史记录命令"},{"level":3,"title":"history","slug":"history"},{"level":3,"title":"ctrl-r","slug":"ctrl-r"},{"level":3,"title":"History Shortcuts","slug":"history-shortcuts"},{"level":2,"title":"并行命令","slug":"并行命令"},{"level":2,"title":"C/C++ Binary Command","slug":"c-c-binary-command"},{"level":3,"title":"ldd","slug":"ldd"},{"level":3,"title":"nm","slug":"nm"},{"level":2,"title":"Plot Command","slug":"plot-command"},{"level":2,"title":"Other Command","slug":"other-command"},{"level":3,"title":"Time","slug":"time"},{"level":2,"title":"Shell 编程","slug":"shell-编程"},{"level":3,"title":"Shell Warnings","slug":"shell-warnings"},{"level":3,"title":"文件重定向","slug":"文件重定向"},{"level":3,"title":"变量","slug":"变量"},{"level":3,"title":"数值运算","slug":"数值运算"},{"level":3,"title":"Bash Expansions","slug":"bash-expansions"},{"level":3,"title":"流程控制语句","slug":"流程控制语句"},{"level":3,"title":"Bash Array","slug":"bash-array"},{"level":3,"title":"Bash Function","slug":"bash-function"},{"level":3,"title":"Bash IO","slug":"bash-io"},{"level":3,"title":"信号","slug":"信号"},{"level":3,"title":"Bash Debugging","slug":"bash-debugging"},{"level":3,"title":"Shell Script Best Practices","slug":"shell-script-best-practices"},{"level":3,"title":"Interactive Shell Script Tips","slug":"interactive-shell-script-tips"},{"level":2,"title":"Terminal","slug":"terminal"},{"level":3,"title":"Terminal Basis","slug":"terminal-basis"},{"level":3,"title":"Default Terminal","slug":"default-terminal"},{"level":3,"title":"Tmux","slug":"tmux"},{"level":2,"title":"Perf Tools","slug":"perf-tools"},{"level":3,"title":"Top Command","slug":"top-command"},{"level":3,"title":"dmesg","slug":"dmesg"},{"level":3,"title":"iostat","slug":"iostat"},{"level":3,"title":"free","slug":"free"},{"level":3,"title":"sar","slug":"sar"},{"level":3,"title":"perf","slug":"perf"},{"level":2,"title":"Linux Tools","slug":"linux-tools"},{"level":3,"title":"FFmpeg","slug":"ffmpeg"},{"level":3,"title":"Nginx","slug":"nginx"},{"level":3,"title":"Namespaces and Cgroup","slug":"namespaces-and-cgroup"},{"level":3,"title":"Docker","slug":"docker"}],"relativePath":"programming/linux/linuxBasicNotes.md","lastUpdated":1627731858000}',p={},l=a('

    Linux Basic Notes

    Linux Boot System

    Grub

    Grub Configuration

    • /etc/default/grub配置文件, 用于一些基本的修改项, 如默认启动项, Grub 界面等待时长, Grub 主题 etc. More details in info -f grub -n 'Simple configuration'
    # Default Startup OS\nGRUB_DEFAULT=0\n\n# Default Timeout\nGRUB_TIMEOUT=5\n\n# https://github.com/vinceliuice/grub2-themes\nGRUB_THEME="/boot/grub/themes/Tela/theme.txt"\n
    1
    2
    3
    4
    5
    6
    7
    8
    • /etc/grub.d/*生成/boot/grub/grub.cfg的执行脚本(update-grub命令), 可以更细致地修改启动项, 如各个启动项的名称、顺序等.

    Grub Repair

    Windows Repair
    • easyBCD for non-efi loader
    • with efi loader, run command:
    # root commander\nbcdedit /set "{bootmgr}" path \\EFI\\ubuntu\\grubx64.efi\n
    1
    2
    Ubuntu Live Repair
    sudo add-apt add-apt-repository ppa:yannubuntu/boot-repair\nsudo apt update\nsudo apt install boot-repair\nboot-repair\n
    1
    2
    3
    4

    重装 Linux

    • 自动挂载项 /etc/fstab etc/rc.local
    • 自定义脚本-新建目录(加入环境变量)
    • 自定义别名 ~/.bashrc

    SSH 命令

    Key

    ssh-keygen -t rsa\nssh-add ~/.ssh/id_rsa\n
    1
    2

    SSHD

    • config file in /etc/ssh/sshd_config
    sudo systemctl reload sshd\nsudo service restart sshd\n
    1
    2

    SSH Config File

    ~/.ssh/config:

    • Host 别名
      • HostName 主机名(ip) ssh user@ip
      • Port 可忽略
      • User 登录用户名 ssh user@ip
      • PreferredAuthentications publicKey
      • IdentityFile 密钥文件完整路径 ssh -i file
    Host github.com\n  HostName github.com\n  PreferredAuthentications publicKey\n  IdentityFile ~/.ssh/id_rsa\nHost cs.github.com\n  HostName github.com\n  PreferredAuthentications publicKey\n  IdentityFile ~/.ssh/cs\nHost cloud\n    HostName xx.org\n    User  root\n    IdentityFile ~/.ssh/dsl_private_key\nHost bwg\n    HostName 23.106.150.152\n    User root\n    Port 29692\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    git clone git@github.com:user/repo\ngit clone git@cs.github.com:user/repo\n
    1
    2
    ssh -qTfnN -D 7070 bwg\ngoogle-chrome socks5 127.0.0.1 7070\n
    1
    2

    密钥文件

    远程传输文件

    rsync -ax -e 'ssh -c blowfish' /root/start_dir root@x.x.x.x:/root/dest_dir\n
    1
    sshpass -p "$DEPLOY_PASSWORD" \\\n  scp -o StrictHostKeyChecking=no \\\n      -P $DEPLOY_PORT \\\n      -r ./build $DEPLOY_USER@$DEPLOY_ADDR:/var/www/html\n
    1
    2
    3
    4

    命令优先级

    包含路径命令 ./vmtools.pl >别名命令 >bash 内部命令 >$PATH 包含目录内的命令 /bin /sbin

    Linux 文件架构

    man hier\n
    1

    通过源码包安装的软件,可以通过 ./configure --prefix=/opt/

    /usr/src 是内核源码存放的目录

    Ubuntu

    Ubuntu Locale Settings

    export LANG=en_US\nxdg-user-dirs-gtk-update\nexport LANG=zh_CN\n
    1
    2
    3
    • /var/lib/locales/supported.d/local
    sudo locale-gen zh_CN.GBK\nsudo locale-gen zh_CN.GB18030\nsudo dpkg-reconfigure locales\n
    1
    2
    3

    Ubuntu Themes

    Icon Themes

    Nightly build for Numix Circle icon:

    sudo add-apt-repository ppa:numix/ppa\nsudo apt update\nsudo apt install numix-icon-theme-circle\n
    1
    2
    3

    GTK Themes

    GTK/GNOME themes located in /usr/share/themes/ or ~/.themes/:

    # Vimix Cursors Installation\ngit clone https://github.com/vinceliuice/Vimix-cursors\nsudo ./Vimix-cursors/install.sh\n\n# WhiteSur GNOME theme Installation\ngit clone https://github.com/vinceliuice/WhiteSur-gtk-theme\nsudo ./WhiteSur-gtk-theme/install.sh -t all -i ubuntu\n# Tweak for Firefox\nsudo ./WhiteSur-gtk-theme/tweaks.sh -f\n# Tweak for Snap Apps\nsudo ./WhiteSur-gtk-theme/tweaks.sh -s\n# Tweak for GDM\nsudo ./WhiteSur-gtk-theme/tweaks.sh -g -i ubuntu\n# Tweak Help Docs\nsudo ./WhiteSur-gtk-theme/tweaks.sh -h\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    Repair for not detected HDMI problem:

    sudo dpkg-reconfigure gdm3\nsudo apt install --reinstall gdm3 lightdm ubuntu-desktop\n
    1
    2

    GNOME Shell Extension

    • Install GNOME shell extension for browser.
    • Install local binding app: sudo apt install chrome-gnome-shell.
    • Visit extensions.gnome.org to install extensions.

    Arch Linux

    Basic Arch Linux Setup

    less /usr/share/aif/docs/official_installation_guide_en\npacman -S lynx arch-wiki-docs arch-wiki-lite\nlynx /usr/share/doc/arch-wiki/html/index.html\n
    1
    2
    3
    systemctl enable dhcpcd\nreboot\npacman -S --needed base-devel git wget jshon expac yajl zsh vim\n
    1
    2
    3
    • makepkg
    curl -L -O https://aur.archlinux.org/cgit/aur.git/snapshot/package_name.tar.gz\ncd package_name\nless PKGBUILD\nless package_name.install\n\nmakepkg -si\n# -s sync deps\n# -i install\n# -r rm deps\n# -c clean up\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    Pacman

    • /etc/pacman.conf
    • /etc/pacman.d/mirrorlist

    AUR

    # packages' list\nwget https://aur.archlinux.org/packages.gz\n
    1
    2

    基本处理命令

    ls

    • -lh(long human)
    • -ld(long directory)
    • -i inode(ID 号) --color==auto

    权限(user/group/other) 引用计数 user group 文件大小 文件修改时间 文件名

    cd

    • -上次目录
    • ..上级目录

    pwd

    print working directory

    rm

    • –r delete directory
    • –f delete forcedly
    • -i 显示确认信息

    cp

    • -r copy directory
    • -p copy property
    • -d copy link
    • -a --all(-pdr)
    • -i 显示确认信息

    mv

    无需参数(改名+移动)

    • -i 显示确认信息

    ln

    link 命令 .bak/.hard(硬链接) .soft(软链接:创建链接时填写绝对路径)

    ln -s(创建软链接) [原文件][目标文件]

    基本搜索命令

    locate

    结合 updatedb 命令(该命令一般自动 1 天/次)

    type

    indicate how a command name is interpreted

    apropos

    display a list of appropriate commands

    whereis and whatis

    which

    find

    find [搜索路径] [可选参数] [文件名](可加""):

    • -name
    • -iname 不区分大小写
    • -user user_name 按照所有者搜索
    • -nouser 搜索没有所有者的文件
    • -atime(文件访问时间)/-ctime(改变文件属性)/-mtime(改变文件内容) -10(十天内)/10(十天当天)/+10(十天前)
    • -size(文件大小) -25k(小于 25k)/25M(25M)/+25G(大于 25G)
    • -inum inode_number
    • -a / -o 逻辑与/逻辑或(左右两端搜索条件)
    • -exec/-ok `system_command_list {} ;对搜索结果执行操作

    Grep

    grep [可选参数] '字符串' 文件名:

    • -I: 不区分大小写
    • -v: 排除指定字符串
    • -r: recursive on directory
    • -l: only print matched filename
    • --exclude

    Find FunctionalComponent in files and open them all:

    grep -lr FunctionalComponent src --exclude=\\*.md | xargs code\n
    1

    Process Command

    uptime

    Average load information

    ps

    Report a snapshot of current processes

    ps aux\n
    1

    top

    top/htop:

    • Display tasks
    • Average load
    • Process status
    • CPU usage

    atop:

    • Memory usage
    • Disk I/O usage
    • Network usage

    vmstat

    Outputs a snapshot of system resource usage:

    • CPU usage
    • Context switch times
    • Interrupt times (/proc/interrupts)
    • Running and exclusive process status
    • Memory usage
    • Swap space
    • Disk I/O usage

    pidstat

    Process and Thread:

    • CPU usage
    • Context switch times
    • Interrupt times (/proc/interrupts)
    pidstat 1\n
    1

    mpstat

    • CPU usage
    • Software interrupt times (/proc/interrupts)
    mpstat -P ALL 1\n
    1

    lscpu

    Show /proc/cpuinfo.

    jobs

    list active jobs

    bg

    place a job in the background

    fg

    place a job in the foreground

    kill

    send a signal to a process

    killall

    kill processes by name

    shutdown

    shutdown or reboot the system

    pstree

    outputs a process list arranged in a tree-like pattern

    xload and tload

    draws a graph showing system load over time

    screen

    screen -S screenName\nscreen -ls\nscreen -r\n
    1
    2
    3
    • Ctrl+d // detach window
    • Ctrl+k // kill window

    CLI Input Output Command

    cat

    concatenate files

    sort

    sort lines of text

    uniq

    report or omit repeated lines

    wc

    print newline, word, and byte counts for each file

    Head and Tail

    output the first/last part of a file

    head -n 5 filename\ntail -f filename\n
    1
    2

    Tee

    read from standard input and write to standard output and files

    [me@linuxBox ~]$ ls /usr/bin | tee ls.txt | grep zip\nbunzip2\nbzip2\n....\n
    1
    2
    3
    4

    nl

    number lines

    fold

    wrap each line to a specified length

    fmt

    a simple text formatter

    pr

    prepare text for printing

    printf

    format and print data

    帮助命令

    man

    • -f 显示操作等级
    • -k 包含匹配
    • -1/2/.../9 显示命令不同操作等级的帮助
    1. Commands (Programs) Those commands that can be executed by the user from within a shell.
    2. System calls Those functions which must be performed by the kernel.
    3. Library calls Most of the libc functions.
    4. Special files (devices) Files found in /dev.
    5. File formats and conventions The format for /etc/passwd and other human-readable files.
    6. Games
    7. Conventions and miscellaneous Overviews of various topics, conventions and protocols, character set standards, and miscellaneous other things.
    8. System management commands Commands like mount(8), many of which only root can execute.

    help shell 内部命令

    显示 shell 内部命令帮助,如 cd 命令(shell 内部命令)

    info

    显示大型帮助文档 - enter 进入 u 返回 p 上一节 n 下一节 q 退出

    System Info

    sudo add-apt-repository ppa:dawidd0811/neofetch\nsudo apt-get update\nsudo apt-get install neofetch\n
    1
    2
    3
    sudo apt-get install screenfetch\n
    1

    压缩命令

    Zip

    • zip -r(目录) 压缩文件 源文件/源目录
    • unzip 源文件 -d 指定路径

    Gz

    • gzip 源文件
    • gzip –c 源文件 > 压缩文件
    • gzip -r 源目录 将源目录下所有子文件分别单独压缩
    • gzip –d(解压缩) 文件
    • gunzip 压缩文件

    Bz2

    不可压缩目录

    • bzip2 –k(保留源文件) 源文件
    • bzip2 –d(解压缩) –k(保留压缩文件) 压缩文件
    • bunzip2 –k(保留压缩文件) 压缩文件

    Tar

    tar.gz/.tar.bz2:

    tar [可选参数] 压缩文件(可指定压缩路径) [-c 解压缩路径]源文件/源目录

    • -z 将.tar 压缩为.tar.gz -j 将.tar 压缩为.tar.bz2
    • -c 打包 -x 解打包
    • -t 查看压缩文件
    • -v 显示过程
    • -f 指定压缩文件名
    • -C 指定解压缩路径
    • -zcvf/-zxvf/-ztcf -jcvf/-jxvf/-jtvf

    7z

    7z x manager.7z -r -o /home/xx\n7z a -t7z -r manager.7z /home/manager/*\n
    1
    2
    • a: add
    • x: extract
    • -r: recursive
    • -o: specific path
    • -t: type

    User and Group Command

    • w/who 查看用户详细信息
    • last 显示所有用户登陆信息(/var/log/wtmp)
    • lastlog 显示所有用户最后一次登陆时间(/var/log/lastlog)

    组操作

    创建组

    groupadd test

    修改组

    groupmod -n test2 test -g

    删除组

    groupdel test2

    查看组

    • groups someUser
    • cat /etc/group
    cat /etc/passwd | awk -F [:]{print $4}’\n\\ |sort|uniq | getent group |awk -F [:]{print $1}’\n
    1
    2

    用户操作

    增加用户

    useradd [options] LOGIN\n
    1

    Options:

    • -b, --base-dir BASE_DIR 设置基本路径作为用户的登录目录
    • -c, --comment COMMENT 对用户的注释
    • -d, --home-dir HOME_DIR 设置用户的登录目录
    • -D, --defaults 改变设置
    • -e, --expiredate EXPIRE_DATE 设置用户的有效期
    • -f, --inactive INACTIVE 用户过期后,让密码无效
    • -g, --gid GROUP 使用户只属于某个组
    • -G, --groups GROUPS 使用户加入某个组(附设组)
    • -h, --help 帮助
    • -k, --skel SKEL_DIR 指定其他的 skel 目录
    • -K, --key KEY=VALUE 覆盖 /etc/login.defs 配置文件
    • -m, --create-home 自动创建登录目录
    • -l, 不把用户加入到 lastlog 文件中
    • -M, 不自动创建登录目录
    • -r, 建立系统账号
    • -o, --non-unique 允许用户拥有相同的 UID
    • -p, --password PASSWORD 为新用户使用加密密码
    • -s, --shell SHELL 登录时候的 shell
    • -u, --uid UID 为新用户指定一个 UID
    • -Z, --selinux-user SEUSER use a specific SEUSER for the SELinux user mapping
    useradd -s bash -m testUser\npasswd testUser # modify `/etc/passwd`, then add to `/etc/sudoers`\n
    1
    2

    adduser is a perl script which uses useradd binary in back-end, adduser is more user friendly and interactive.

    修改用户

    usermod -d /home/test -G test2 test

    • -l 新用户名 旧用户名 修改用户名
    • -g 新用户组 目标用户 改变用户所属组

    gpasswd -a test test2 将用户 test 加入到 test2 组(附设组)

    gpasswd -d test test2 将用户 test 从 test2 组中移出

    usermod -aG sudo <username>\n
    1

    删除用户

    userdel test -r 同时删除用户登录目录(/home/xxx)

    查看用户

    w/who 查看当前登录的所有用户

    whoami 查看当前登录用户名

    finger apacheUser 查看单个用户信息

    限制用户

    • passwd -l 用户名 锁定用户
    • passwd -u 用户名 解锁用户
    • passwd -d 用户名 清除用户密码

    权限管理命令

    普通权限

    • chown 用户名:组名 文件名
    • chgrp 组名 文件名
    • umask 存储位置 ——/etc/profile
    • 文件默认权限 = 文件默认最大权限 rw-(666) 减去 umask 值(如----w--w-)(022)
    • 目录默认权限 = 目录默认最大权限 rwx(777) 减去 umask 值
    • id <username>

    ACL 权限

    • 查看分区 ACL 权限是否开启 dumpe2fs -h 设备分区名

    • 临时开启分区 ACL 权限 mount -o remount,acl 设备分区名

    • 永久开启分区 ACL 权限 /etc/fstab

    • setfacl -m (d:默认权限) u/g:用户名/组名:权限(rwx) 文件名

    • getfacl 文件名——查看文件 ACL 权限

    sudo 权限

    /etc/sudoers.tmp

    SetUID and SetGID

    可执行程序/目录+普通用户临时获得 root 权限 (rws):

    • chmod 0xxx 取消双权限
    • chmod 2xxx 设置 SetGID 权限
    • chmod 4xxx 设置 SetUID 权限
    • chmod 6xxx 设置双权限

    显示器管理命令

    xrandr

    xrandr -s 1920x1800 # set resolution\n
    1

    主机信息管理命令

    #!/bin/bash\n\n# Simple print cpu topology\n\n# numactl --hardware\n# ls /sys/devices/system/node/node0\n# lscpu\n\nfunction get_nr_processor()\n{\n    grep '^processor' /proc/cpuinfo | wc -l\n}\n\nfunction get_nr_socket()\n{\n    grep 'physical id' /proc/cpuinfo | awk -F: '{\n            print $2 | "sort -un"}' | wc -l\n}\n\nfunction get_nr_siblings()\n{\n    grep 'siblings' /proc/cpuinfo | awk -F: '{\n            print $2 | "sort -un"}'\n}\n\nfunction get_nr_cores_of_socket()\n{\n    grep 'cpu cores' /proc/cpuinfo | awk -F: '{\n            print $2 | "sort -un"}'\n}\n\necho '===== CPU Topology Table ====='\necho\n\necho '+--------------+---------+-----------+'\necho '| Processor ID | Core ID | Socket ID |'\necho '+--------------+---------+-----------+'\n\nwhile read line; do\n    if [ -z "$line" ]; then\n        printf '| %-12s | %-7s | %-9s |\\n' $p_id $c_id $s_id\n        echo '+--------------+---------+-----------+'\n        continue\n    fi\n\n    if echo "$line" | grep -q "^processor"; then\n        p_id=`echo "$line" | awk -F: '{print $2}' | tr -d ' '`\n    fi\n\n    if echo "$line" | grep -q "^core id"; then\n        c_id=`echo "$line" | awk -F: '{print $2}' | tr -d ' '`\n    fi\n\n    if echo "$line" | grep -q "^physical id"; then\n        s_id=`echo "$line" | awk -F: '{print $2}' | tr -d ' '`\n    fi\ndone < /proc/cpuinfo\n\necho\n\nawk -F: '{\n    if ($1 ~ /processor/) {\n        gsub(/ /,"",$2);\n        p_id=$2;\n    } else if ($1 ~ /physical id/){\n        gsub(/ /,"",$2);\n        s_id=$2;\n        arr[s_id]=arr[s_id] " " p_id\n    }\n}\n\nEND{\n    for (i in arr)\n        printf "Socket %s:%s\\n", i, arr[i];\n}' /proc/cpuinfo\n\necho\necho '===== CPU Info Summary ====='\necho\n\nnr_processor=`get_nr_processor`\necho "Logical processors: $nr_processor"\n\nnr_socket=`get_nr_socket`\necho "Physical socket: $nr_socket"\n\nnr_siblings=`get_nr_siblings`\necho "Siblings in one socket: $nr_siblings"\n\nnr_cores=`get_nr_cores_of_socket`\necho "Cores in one socket: $nr_cores"\n\nlet nr_cores*=nr_socket\necho "Cores in total: $nr_cores"\n\nif [ "$nr_cores" = "$nr_processor" ]; then\n    echo "Hyper-Threading: off"\nelse\n    echo "Hyper-Threading: on"\nfi\n\necho\necho '===== END ====='\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103

    Disk IO

    主分区(primary)与延伸分区(extended) 延伸分区可以继续划分成逻辑分区(logical)

    挂载命令

    mount [-t 文件系统][-o 特殊选项] 设备文件名 挂载点(挂载目录/media /misc /mnt)

    • 无参数 显示当前挂载设备
    • -a 依据/etc/fstab 文件配置,自动挂载

    umount 设备文件名/挂载点

    fdisk –l

    修复命令

    sudo debugfs /dev/sda9\n> debugfs: lsdel\n
    1
    2

    分区命令

    fdisk

    分区表类型 MBR

    n p e l 新 主 逻辑 扩展 分区 w 激活

    parted

    分区表类型 MBR/GPT

    • mklabel 选择分区表类型
    • print 打印分区信息
    • mkpart 新建分区
    • rm 删除分区
    • unit 选择单位
    • quit 结束分区

    Zero Copy

    • read + write: 4 context switch, 4 data copy (2 DMA, 2 CPU).
    • mmap + write: 4 context switch, 3 data copy (2 DMA, 1 CPU).
    • sendfile: 2 context switch, 3 data copy (2 DMA, 1 CPU).
    • scatter and gather sendfile: 2 context switch, 2 data copy (1 DMA, 1 SG-DMA).
    • 传输大文件 (无法命中内核 PageCache) 使用 异步 I/O + 直接 I/O, 传输小文件使用 Zero Copy.
    location /video/ {\n    sendfile on;\n    aio on;\n    directio 1024m;\n}\n
    1
    2
    3
    4
    5

    Device Command

    Monitor Info

    sudo apt-get install read-edid\nsudo get-edid | parse-edid\n
    1
    2

    Touch Pad Synoptics

    synclient TouchpadOff=0\n
    1

    包管理命令

    rpm 命令

    安装和卸载时同时存在依赖性(包依赖、库依赖)

    rpm 查询:

    • -q 包名 查询已安装的包 //必备参数
    • -a 查询所有已安装的包
    • -i 查询软件信息
    • -l list
    • -f 查询系统文件属于哪个软件包
    • -R 查询软件包的依赖性
    • -p 查询未安装包 //普适参数

    rpm 校验(查看 Cracker 信息):

    • -V 校验已安装包 相应信息不是.号便是被修改项 可用于找回丢失的系统命令

    yum

    源配置文件:/etc/yum.repos.d

    cd /etc/yum.repos.d\nmv CentOS-Base.repo CentOS-Base.repo.bk\nwget http://mirrors.163.com/.help/CentOS7-Base-163.repo\nyum makecache\n
    1
    2
    3
    4
    • yum list
    • yum search 'keyword'
    • yum -y(自动回答 yes) install 包名
    • yum -y update 包名
    • yum -y remove 包名
    • yum grouplist
    • yum groupinstall 软件组名
    • yum groupremove 软件组名

    源码包安装

    指定位置:

    • /usr/local/软件名/
    • /usr/local/src/软件名/

    (如上述脚本出错,执行 make clean)

    make install\n
    1

    e.g apache /var/www/html/index.html /usr/local/apache/htdocs/index.html

    Applications Management

    • desktop shortcut: /usr/share/applications
    • startup apps: gnome-session-properties or gnome-tweaks

    网络连接命令

    wget

    • 下载全站资料
    • -P 表示下载到哪个目录
    • -r 表示递归下载
    • -np 表示不下载旁站连接.
    • -k 表示将下载的网页里的链接修改为本地链接.
    • -p 获得所有显示网页所需的元素
    wget -r -p -np -k -P ~/tmp/ http://java-er.com\n
    1

    Certificate Bot

    CertBot for SSL certificates.

    GFW

    yum install python-setuptools && easy_install pip\npip install shadowsocks\necho "nohup sslocal -c /etc/shadowsocks.json /dev/null 2>&1 &" /etc/rc.local\nnohup ssserver -c /etc/shadowsocks.json -d start /dev/null 2>&1 &\n
    1
    2
    3
    4

    网络管理命令

    用途net-tool(被淘汰)iproute2
    地址和链路配置ifconfigip addr, ip link
    路由表routeip route
    邻居arpip neigh
    VLANvconfigip link
    隧道iptunnelip tunnel
    组播ipmaddrip maddr
    统计netstatss
    ip link show\nip address show\nip route show\n\n# add commands to /etc/init.d/local.sh\n\nrm -fr /etc/udev/rules.d/70-persistent-net.rules\n\n# start up network adapter\nip link set eth0 up\n\n# add/delete static ip\nip address add 192.168.1.1/24 dev eth0\nip address del 192.168.1.1/24 dev eth0\n\n# add/delete static route\nip route add 192.168.1.0/24 dev eth0\nip route del 192.168.1.0/24 dev eth0\nip route add default via 192.168.0.196\n\n# watch packets\nwatch -n 1 "ifconfig eth0"\nwatch -n 1 "ifconfig eth1"\nwatch -n 1 "ifconfig eth2"\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24

    ufw

    ufw status\nufw enable\nufw allow ssh\nufw allow http\nufw allow https\n
    1
    2
    3
    4
    5

    arp

    arp -a显示地址解析协议 (IP 地址—网卡地址):

    • 网际互联层:IP 协议(网际)、IGMP 协议(互联网组管理)、ICMP 协议(互联网控制报文)
    • 传输层:TCP 协议(传输控制)、UDP 协议(用户数据报)

    netstat

    netstat -an查看本机启用的端口:

    • (-a 查看所有连接和监听端口 -n 显示 IP 地址和端口号)
    • -t tcp 协议端口
    • -u udp 协议端口
    • -l 监听状态服务

    nslookup

    nslookup domain_name查看 DNS 解析器:

    /etc/network/interfaces

    主机名:

    • /etc/hostname
    • /etc/sysconfig/network
    • /etc/resolv.conf

    ping

    ping -c ip/domain探测网络状况

    telnet

    telnet [ip/domain] [端口]远程管理与端口探测命令

    Trace Route

    • traceroute [-n IP] domain路由跟踪命令
    • traceroute -n -I -T -p路由扫描

    Net Filter Framework

    nftables 命令行工具:nft

    网络扫描命令

    预防策略——SYN 攻击、DDoS 攻击

    fping

    fping -a -u -g -f [target]批量扫描主机地址

    hping

    hping -p -S -a可伪造 IP 地址

    mtr

    路由扫描

    nmap

    批量主机服务扫描:

    • -P ICMP
    • -sS TCP SYN
    • -sT TCP connect()
    • -sU UDP

    ncat

    批量主机服务扫描:

    • -w 设置超时时间
    • -v 显示命令执行过程
    • -z 一个输入输出模式
    • -u UDP 协议

    脚本运行命令

    exec 1>>output.log exec 2>>error.log

    Systemctl

    systemctl enable local\n
    1

    in /etc/init.d/local

    #!/bin/bash\n### BEGIN INIT INFO\n# Provides:          local\n# Required-Start:    $all\n# Required-Stop:\n# Default-Start:     3 4 5\n# Default-Stop:\n# Short-Description: Personal start script\n\nsslocal -c shadowsocks.json -d start\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    内存控制

    sysctl vm [-options] CONFIG \nswapoff\n
    1
    2

    定时任务

    crontab

    crontab -l(list)\ncrontab -e(establish)\n
    1
    2
    • m,n —— 分隔多个时间
    • m-n —— 表示时间范围
    • /n —— 表示每隔 n 时间
    • 天数 与 星期 设置 之间 是 “或”关系
    • /var/spool/cron/user_name/
    • /var/log/con
    • /etc/cron.*ly 时间表
    • /etc/anacrontab: 异步时间表

    后台任务

    • jobs —— 所有作业

    • atq —— 延时作业队列

    • at -M(不使用邮件发送运行结果) -f filename deltaTime

    • atrm 作业号/名

    • bg/fg 作业号/名

    • nohup 脚本 & —— 脱离控制台并后台运行脚本

    19 ~ -20 (-20 优先级最高)

    • nice -n number 作业号/名
    • renice number -p PID

    开机任务

    • /etc/rc.local —— 系统开机任务
    • /etc/profile/ /etc/bash.bashrc —— bash 启动任务/远程登陆任务
    • /etc/bash.bashrc —— SSH 连接任务

    历史记录命令

    history

    • -c 清除历史命令
    • -w (~/.bash_history) 保存历史命令

    /etc/profile 中修改 HISTSIZE !n/!!/!字符串 重复执行第 n 条/上一条/指定开头的历史命令

    # repeat history command\n!number\n
    1
    2

    ctrl-r

    press ctrl-r 提示符改变,显示我们正在执行反向增量搜索。 搜索过程是”反向的”,因为我们按照从”现在”到过去 某个时间段的顺序来搜寻。 下一步,我们开始输入要查找的文本搜索返回我们需要的结果。 (enter to execute, ctrl-j to copy)

    History Shortcuts

    commandfunction
    Ctrl-p移动到上一个历史条目
    Ctrl-n移动到下一个历史条目
    Alt-<移动到历史列表开头
    Alt->移动到历史列表结尾
    Ctrl-r反向增量搜索
    Alt-p反向搜索,非增量搜索
    Alt-n向前搜索,非增量
    Ctrl-o执行历史列表中的当前项,并移到下一个

    并行命令

    命令间插入符

    • command1;command2 顺序执行,相当于 C 语言中语句结束符
    • command1&&command2 命令同时执行(当 1 正确时)或同时不执行(当 1 出错时)
    • command1 || command2 只执行一个命令(正确命令)
    • command1 | command2 前一正确命令的输出结果作为后一命令的输入结果

    e.g ls && echo yes >> .log || echo no >> .log

    C/C++ Binary Command

    ldd

    ldd ./lib.sio\n
    1

    nm

    nm -Ca ./lib.so\n
    1

    Plot Command

    chart.gp

    #!/usr/bin/env gnuplot\n\nset term wxt enhanced\nset xtics\nset view\nset multiplot\nset size\nset origin\nfit\n\nplot 'data.dat' using 1:2, 'data.dat' using 1:3\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/bin/gnuplot -c\n\nset terminal png enhanced\nset output ARG1.".png"\nset style data linespoints\nshow timestamp\nset title ARG1\nset xlabel "time (seconds)"\nset ylabel "Segments (cwnd, ssthresh)"\nplot ARG1 using 1:7 title "snd_cwnd", \\\n     ARG1 using 1:($8>=2147483647 ? 0 : $8) title "snd_ssthresh"\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    Other Command

    Time

    date\n
    1

    change ntp (Network Time Protocol) time

    sudo apt-get install ntpdate\nsudo iptables -A OUTPUT -p udp --dport 123 -j ACCEPT\nsudo iptables -A INPUT -p udp --sport 123 -j ACCEPT\nsudo ntpdate time.windows.com\nsudo hwclock --localtime --systohc\n
    1
    2
    3
    4
    5

    use local time (not UTC time)

    sudo timedatectl set-local-rtc 1\n
    1

    Shell 编程

    Shell Warnings

    • = 左右无空格
    • () [] 内部最好有空格
    • 数值运算用 (()) 或 $(())

    文件重定向

    • > 文件名/输出设备名 覆盖标准输出重定向
    • >> 文件名/输出设备名 追加标准输出重定向
    • 2>(右端无空格)文件名/输出设备名 覆盖错误输出重定向
    • 2>>(右端无空格)文件名/输出设备名 追加错误输出重定向
    • >/>> 文件 2>&1 &>/&>>文件 覆盖/追加正确输出与错误输出同时重定向
    • </<< 文件名/输入设备名 覆盖/追加标准输入重定向

    Here Document

    command << END\n...\nEND\n\ncommand << EOF\n...\nEOF\n
    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash\ngnuplot -persist <<EOF\nset data style linespoints\nshow timestamp\nset title "$1"\nset xlabel "time (seconds)"\nset ylabel "Segments (cwnd, ssthresh)"\nplot "$1" using 1:7 title "snd_cwnd", \\\\\n     "$1" using 1:(\\$8>=2147483647 ? 0 : \\$8) title "snd_ssthresh"\nEOF\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    变量

    基本变量

    • = : 左右两端不可有空格
    • ' ': 完全标准字符串
    • " ": 格式化字符串
    • 调用变量值:$变量名
    • set/unset——设置/取消变量

    built-in 变量

    • $*/$@: argv[1], ..., argv[n]
    • $0/$1/../$n: argv[0], ..., argv[n]
    • $#: argc
    • $?: exit code of last command
    if [ "$?" -ne "0" ];then\n    echo "sorry, command execution failed!"\nfi\n
    1
    2
    3

    每次 shift 命令执行的时候,变量 $2 的值会移动到变量 $1 中,变量 $3 的值会移动到变量 $2 中. 变量 $# 的值也会相应的减 1

    #!/bin/bash\n# posit-param2: script to display all arguments\ncount=1\nwhile [[ $# -gt 0 ]]; do\n    echo "Argument $count = $1"\n    count=$((count + 1))\n    shift\ndone\n
    1
    2
    3
    4
    5
    6
    7
    8
    usage () {\n    echo "$PROGNAME: usage: $PROGNAME [-f file | -i]"\n    return\n}\n# process command line options\ninteractive=\nfilename=\nwhile [[ -n $1 ]]; do\n    case $1 in\n    -f | --file)            shift\n                            filename=$1\n                            ;;\n    -i | --interactive)     interactive=1\n                            ;;\n    -h | --help)            usage\n                            exit\n                            ;;\n    *)                      usage >&2\n                            exit 1\n                            ;;\n    esac\n    shift\ndone\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

    环境变量

    • /etc/profile.d/*.sh
    • ~/.bash_profile
    • ~/.bashrc
    • /etc/profile
    • /etc/bash.bashrc
    • /etc/issue——shell 登录信息
    • PS1 环境变量——shell 头行打印信息
    • PATH 环境变量
    Environment Command
    • env——查看环境变量
    • export 变量名=变量值——设置环境变量
    • printenv

    数值运算

    declare 命令

    Bash Expansions

    • $(()) or $[]: arithmetic expansion

    一般地, 将数值运算用 (()) [[]]$(()) 括起, 可以确保变量不会被识别为 string

    read x\nread y\n\necho $((x + y))\necho $((a < b ? a : b))\n\nif ((a > b))\nthen\n    echo "a > b"\nfi\n\nif [[ a -gt b ]]\nthen\n    echo "a > b"\nfi\n\nif [ "$a" -gt "$b" ]\nthen\n    echo "a > b"\nfi\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    • [[ xxx ]]: condition
    • (( xxx )): arithmetic condition
    operatorfunction
    ! EXPRESSIONThe EXPRESSION is false
    -n STRINGThe length of STRING is greater than zero
    -z STRINGThe length of STRING is zero (ie it is empty)
    STRING1 == STRING2STRING1 is equal to STRING2
    STRING1 != STRING2STRING1 is not equal to STRING2
    STRING1 > STRING2STRING1 sorts after STRING2
    STRING1 < STRING2STRING1 sorts before STRING2
    INTEGER1 -eq INTEGER2INTEGER1 is numerically equal to INTEGER2
    INTEGER1 -gt INTEGER2INTEGER1 is numerically greater than INTEGER2
    INTEGER1 -lt INTEGER2INTEGER1 is numerically less than INTEGER2
    -d FILEFILE exists and is a directory
    -e FILEFILE exists
    -r FILEFILE exists and the read permission is granted
    -s FILEFILE exists and it's size is greater than zero
    -w FILEFILE exists and the write permission is granted
    -x FILEFILE exists and the execute permission is granted
    AND -a &&
    OR -o ||
    NOT ! !
    • {}: group regexp
    echo a{A{1,2},B{3,4}}b\naA1b aA2b aB3b aB4b\n
    1
    2
    • ${}: string expansion
      • ${parameter:-word}: 若 parameter 没有设置(例如,不存在)或者为空,展开结果是 word 的值。 若 parameter 不为空,则展开结果是 parameter 的值
      • ${parameter:+word}: 若 parameter 没有设置或为空,展开结果为空。 若 parameter 不为空, 展开结果是 word 的值会替换掉 parameter 的值
      • ${parameter:=word}: 若 parameter 没有设置或为空,展开结果是 word 的值。 另外,word 的值会赋值给 parameter。 若 parameter 不为空,展开结果是 parameter 的值
      • ${parameter:?word}: 若 parameter 没有设置或为空,这种展开导致脚本带有错误退出, 并且 word 的内容会发送到标准错误。 若 parameter 不为空, 展开结果是 parameter 的值
      • ${!prefix*} ${!prefix@}: 这种展开会返回以 prefix 开头的已有变量名
      • ${#parameter}: 展开成由 parameter 所包含的字符串的长度
      • ${parameter:offset} ${parameter:offset:length}: 提取一部分字符
      • ${parameter,,} 把 parameter 的值全部展开成小写字母
      • ${parameter,} 仅仅把 parameter 的第一个字符展开成小写字母
      • ${parameter^^} 把 parameter 的值全部转换成大写字母
      • ${parameter^} 仅仅把 parameter 的第一个字符转换成大写字母
      • ${parameter#pattern} ${parameter##pattern}, ${parameter%pattern} ${parameter%%pattern}: 从 parameter 所包含的字符串中清除开头/末尾一部分文本
      • ${parameter/pattern/string}, ${parameter//pattern/string}, ${parameter/#pattern/string}, ${parameter/%pattern/string}: replace
    foo=file.txt.zip\necho ${foo#*.}\ntxt.zip\necho ${foo##*.}\nzip\n\nfoo=file.txt.zip\necho ${foo%.*}\nfile.txt\necho ${foo%%.*}\nfile\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    foo=JPG.JPG\necho ${foo/JPG/jpg}\njpg.JPG\necho ${foo//JPG/jpg}\njpg.jpg\necho ${foo/#JPG/jpg}\njpg.JPG\necho ${foo/%JPG/jpg}\nJPG.jpg\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    • $(): command result
    • "": allow expansions string
    • '': disallow expansions string

    流程控制语句

    if 语句

    if [[ 条件判断式 ]] ; then\n    程序\nfi\nif [[ 条件判断式 ]]\n    then\n        程序\n    else\n        程序\nfi\n\nif [[ 条件判断式1 ]]\n    then\n        程序1\nelif [[ 条件判断式2 ]]\n    then\n        程序2\n……\nelse\n        程序n\nfi\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    case 语句

    case $变量名 in\n    “值1”)\n            程序\n            ;;\n    “值2”)\n            程序\n            ;;\n    *)\n            程序\n;;\nesac\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    case patternfunction
    a)word equals "a"
    [[:alpha:]])word is a single alphabetic character
    ???)word is exactly three characters long
    \\*.txt)word ends with the characters “.txt”
    *)any value of word
    #!/bin/bash\n# case-menu: a menu driven system information program\nclear\necho "\nPlease Select:\n1. Display System Information\n2. Display Disk Space\n3. Display Home Space Utilization\n0. Quit\n"\nread -p "Enter selection [0-3] > "\ncase $REPLY in\n    0)  echo "Program terminated."\n        exit\n        ;;\n    1)  echo "Hostname: $HOSTNAME"\n        uptime\n        ;;\n    2)  df -h\n        ;;\n    3)  if [[ $(id -u) -eq 0 ]]; then\n            echo "Home Space Utilization (All Users)"\n            du -sh /home/*\n        else\n            echo "Home Space Utilization ($USER)"\n            du -sh $HOME\n        fi\n        ;;\n    *)  echo "Invalid entry" >&2\n        exit 1\n        ;;\nesac\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32

    or case pattern

    #!/bin/bash\n# case-menu: a menu driven system information program\nclear\necho "\nPlease Select:\nA. Display System Information\nB. Display Disk Space\nC. Display Home Space Utilization\nQ. Quit\n"\nread -p "Enter selection [A, B, C or Q] > "\ncase $REPLY in\nq|Q) echo "Program terminated."\n     exit\n     ;;\na|A) echo "Hostname: $HOSTNAME"\n     uptime\n     ;;\nb|B) df -h\n     ;;\nc|C) if [[ $(id -u) -eq 0 ]]; then\n         echo "Home Space Utilization (All Users)"\n         du -sh /home/*\n     else\n         echo "Home Space Utilization ($USER)"\n         du -sh $HOME\n     fi\n     ;;\n*)   echo "Invalid entry" >&2\n     exit 1\n     ;;\nesac\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32

    fall through case pattern (;;&)

    #!/bin/bash\n# case4-2: test a character\nread -n 1 -p "Type a character > "\necho\ncase $REPLY in\n    [[:upper:]])    echo "'$REPLY' is upper case." ;;&\n    [[:lower:]])    echo "'$REPLY' is lower case." ;;&\n    [[:alpha:]])    echo "'$REPLY' is alphabetic." ;;&\n    [[:digit:]])    echo "'$REPLY' is a digit." ;;&\n    [[:graph:]])    echo "'$REPLY' is a visible character." ;;&\n    [[:punct:]])    echo "'$REPLY' is a punctuation symbol." ;;&\n    [[:space:]])    echo "'$REPLY' is a whitespace character." ;;&\n    [[:xdigit:]])   echo "'$REPLY' is a hexadecimal digit." ;;&\nesac\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    for 语句

    for 变量 in 值1 值2 值3 …… 值n\n    do\n        程序\n    done\n\n$(seq 1 50)  # 1 2 ... 50\n{1..50}     # 1 2 ... 50\n{0..10..2}  # 0 2 4 6 8 10\n\nfor (( 初始值;循环控制条件;变量变化 )); do\n    程序\ndone\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    while 语句与 until 语句

    while [[ 条件判断式 ]]\n    do\n        程序\n    done\n\nuntil [[ 条件判断式 ]]\n    do\n        程序\n    done\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    (( expression1 ))\nwhile (( expression2 )); do\n    commands\n    (( expression3 ))\ndone\n
    1
    2
    3
    4
    5
    #!/bin/bash\n# while-menu: a menu driven system information program\nDELAY=3 # Number of seconds to display results\nwhile [[ $REPLY != 0 ]]; do\n    clear\n    cat <<- _EOF_\n        Please Select:\n        1. Display System Information\n        2. Display Disk Space\n        3. Display Home Space Utilization\n        0. Quit\n    _EOF_\n    read -p "Enter selection [0-3] > "\n    if [[ $REPLY =~ ^[0-3]$ ]]; then\n        if [[ $REPLY == 1 ]]; then\n            echo "Hostname: $HOSTNAME"\n            uptime\n            sleep $DELAY\n        fi\n        if [[ $REPLY == 2 ]]; then\n            df -h\n            sleep $DELAY\n        fi\n        if [[ $REPLY == 3 ]]; then\n            if [[ $(id -u) -eq 0 ]]; then\n                echo "Home Space Utilization (All Users)"\n                du -sh /home/*\n            else\n                echo "Home Space Utilization ($USER)"\n                du -sh $HOME\n            fi\n            sleep $DELAY\n        fi\n    else\n        echo "Invalid entry."\n        sleep $DELAY\n    fi\ndone\necho "Program terminated."\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #!/bin/bash\n# while-read: read lines from a file\nwhile read dist version release; do\n    printf "Dist: %s\\tVersion: %s\\tReleased: %s\\n" \\\n        $dist \\\n        $version \\\n        $release\ndone < dist.txt\n
    1
    2
    3
    4
    5
    6
    7
    8

    do while statement

    while : ; do\n    actions\n    [[ current_time <= $cutoff ]] || break\ndone\n
    1
    2
    3
    4

    Bash Array

    Bash Function

    • 函数局部变量 local + 变量名
    • 函数参数 : $ + #/?/@/n
    • 引用函数库文件 —— source sh 文件名 / . sh 文件名 可修改~/.bashrc 文件

    Bash IO

    #!/bin/bash\n# read-validate: validate input\ninvalid_input () {\n    echo "Invalid input '$REPLY'" >&2\n    exit 1\n}\nread -p "Enter a single item > "\n# input is empty (invalid)\n[[ -z $REPLY ]] && invalid_input\n# input is multiple items (invalid)\n(( $(echo $REPLY | wc -w) > 1 )) && invalid_input\n# is input a valid filename?\nif [[ $REPLY =~ ^[-[:alnum:]\\._]+$ ]]; then\n    echo "'$REPLY' is a valid filename."\n    if [[ -e $REPLY ]]; then\n        echo "And file '$REPLY' exists."\n    else\n        echo "However, file '$REPLY' does not exist."\n    fi\n    # is input a floating point number?\n    if [[ $REPLY =~ ^-?[[:digit:]]*\\.[[:digit:]]+$ ]]; then\n        echo "'$REPLY' is a floating point number."\n    else\n        echo "'$REPLY' is not a floating point number."\n    fi\n    # is input an integer?\n    if [[ $REPLY =~ ^-?[[:digit:]]+$ ]]; then\n        echo "'$REPLY' is an integer."\n    else\n        echo "'$REPLY' is not an integer."\n    fi\nelse\n    echo "The string '$REPLY' is not a valid filename."\nfi\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #!/bin/bash\n# read-menu: a menu driven system information program\nclear\necho "\nPlease Select:\n\n    1. Display System Information\n    2. Display Disk Space\n    3. Display Home Space Utilization\n    0. Quit\n"\nread -p "Enter selection [0-3] > "\n\nif [[ $REPLY =~ ^[0-3]$ ]]; then\n    if [[ $REPLY == 0 ]]; then\n        echo "Program terminated."\n        exit\n    fi\n    if [[ $REPLY == 1 ]]; then\n        echo "Hostname: $HOSTNAME"\n        uptime\n        exit\n    fi\n    if [[ $REPLY == 2 ]]; then\n        df -h\n        exit\n    fi\n    if [[ $REPLY == 3 ]]; then\n        if [[ $(id -u) -eq 0 ]]; then\n            echo "Home Space Utilization (All Users)"\n            du -sh /home/*\n        else\n            echo "Home Space Utilization ($USER)"\n            du -sh $HOME\n        fi\n        exit\n    fi\nelse\n    echo "Invalid entry." >&2\n    exit 1\nfi\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    # interactive mode\nif [[ -n $interactive ]]; then\n    while true; do\n        read -p "Enter name of output file: " filename\n        if [[ -e $filename ]]; then\n            read -p "'$filename' exists. Overwrite? [y/n/q] > "\n            case $REPLY in\n            Y|y)    break\n                    ;;\n            Q|q)    echo "Program terminated."\n                    exit\n                    ;;\n            *)      continue\n                    ;;\n            esac\n        elif [[ -z $filename ]]; then\n            continue\n        else\n            break\n        fi\n    done\nfi\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22

    信号

    • man 7 signal —— 传递信号给进程
    • CTRL + C —— SIGINT
    • CTRL + Z —— SIGSTP
    • kill/killall —— SIGINT
    • trap SIG*/EXIT —— 捕捉信号(后 + 忽略信号/默认处理信号/自定义处理信号)
    • trap – SIG*/EXIT —— 移除信号

    Bash Debugging

    -x option

    #!/bin/bash -x\n# trouble: script to demonstrate common errors\nnumber=1\nif [ $number = 1 ]; then\n    echo "Number is equal to 1."\nelse\n    echo "Number is not equal to 1."\nfi\n
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash\n# trouble: script to demonstrate common errors\nnumber=1\necho "number=$number" # DEBUG\nset -x # Turn on tracing\nif [ $number = 1 ]; then\n    echo "Number is equal to 1."\nelse\n    echo "Number is not equal to 1."\nfi\nset +x # Turn off tracing\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    Shell Script Best Practices

    • Google Shell Style Guide
    • 指定默认解释器cat /etc/shells
    • 设置bash strict mode
    • 条件判断使用[[ ]]
    • 使用变量时用双引号把变量包起来 cp -r "$src_dir" "$dest_dir"
    • 使用$()获取表达式的值
    • 使用${arr[@]}进行列表循环
    #!/usr/bin/env bash\n\n# 设置命令回显\nset -x\n\n# 遇到未声明的变量则报错停止\nset -u\n# 遇到执行错误则停止\nset -e\n# 管道命令其中一步失败则中止\nset -o pipefail\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    Interactive Shell Script Tips

    Check Root Validation

    if (( $EUID != 0 )); then\n    echo "Please run as root!"\n    exit\nfi\n
    1
    2
    3
    4
    # run as root directly\nsudo chown root <filename>\nsudo chmod +s <filename>\n
    1
    2
    3

    Bash help option

    #!/bin/sh\nif [[ ${#@} -ne 0 ]] && [[ "${@#"--help"}" = "" ]]; then\n  printf -- '...help...\\n';\n  exit 0;\nfi;\n
    1
    2
    3
    4
    5

    Bash Silent Option

    #!/bin/sh\nif [[ ${#@} -ne 0 ]] && [[ "${@#"--silent"}" = "" ]]; then\n  stty -echo;\nfi;\n# ...\n# before point of intended output:\nstty +echo && printf -- 'intended output\\n';\n# silence it again till end of script\nstty -echo;\n# ...\nstty +echo;\nexit 0;\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    Check Command Validation

    #!/bin/sh\n_=$(command -v docker);\nif [[ "$?" != "0" ]]; then\n  printf -- 'You don\\'t seem to have Docker installed.\\n';\n  printf -- 'Get it: https://www.docker.com/community-edition\\n';\n  printf -- 'Exiting with code 127...\\n';\n  exit 127;\nfi;\n
    1
    2
    3
    4
    5
    6
    7
    8
    Get Absolute Path
    #!/bin/sh\nCUR_DIR="$(dirname $0);"\nprintf -- 'moving application to /opt/app.jar';\nmv "${CUR_DIR}/application.jar" /opt/app.jar;\n
    1
    2
    3
    4

    Bash error handle

    #!/bin/sh\nerror_handle() {\n  stty echo;\n}\n\nif [[ ${#@} -ne 0 ]] && [[ "${@#"--silent"}" = "" ]]; then\n  stty -echo;\n  trap error_handle INT;\n  trap error_handle TERM;\n  trap error_handle KILL;\n  trap error_handle EXIT;\nfi;\n# ...\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    Bash loading progress

    #!/bin/sh\nprintf -- 'Performing asynchronous action..';\n./trigger-action;\nDONE=0;\nwhile [ $DONE -eq 0 ]; do\n  ./async-checker;\n  if [ "$?" = "0" ]; then DONE=1; fi;\n  printf -- '.';\n  sleep 1;\ndone;\nprintf -- ' DONE!\\n';\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    Terminal

    Terminal Basis

    • 电传打字机 (TeleTypeWriter, TTY) 是物理设备, 最初是为电报设计, 后来被连接到计算机上, 发送输入和获取输出.
    • 电传打字机 (TTY) 现在被运行在内核中的模块所模拟, 被称为终端模拟器 (Terminal Emulator).
    • 伪终端 (Pseudo Terminal, PTY) 是运行在用户区的终端模拟程序.
    • Shell 由 Terminal fork 出来, 是 Terminal 的子进程. Terminal 处理键盘事件, 负责字符的显示. Shell 负责解释执行用户输入的字符, 返回操作系统底层响应.
    • 可以使用 stty 命令对 TTY 设备进行配置.
    • 远程终端 ssh 也是一种伪终端 PTY:
      • Local: PTY Master is Terminal, PTY Slave is bash and ssh client.
      • Remote: PTY Master is ssh server, PTY Slave is bash.

    Default Terminal

    sudo update-alternatives --install /usr/bin/x-terminal-emulator\n \\ x-terminal-emulator /opt/Hyper/hyper 50\n
    1
    2
    sudo update-alternatives --config x-terminal-emulator\n
    1

    Tmux

    Basic Tmux Command

    tmux ls\ntmux new -s sessionID\ntmux a -t sessionID # attach\ntmux show -g >> current.tmux.conf # export configuration\n
    1
    2
    3
    4

    Basic Hotkeys

    ?        # 快捷键帮助列表\n
    1
    Session management
    :new<CR> # 创建新的 Session,其中 : 是进入 Tmux 命令行的快捷键\ns list sessions\n$ rename the current session\nd detach from the current session\n
    1
    2
    3
    4
    Tmux Windows Hotkeys
    c create a new window\n, rename the current window\nw list windows\n% split horizontally\n" split vertically\nn change to the next window\np change to the previous window\n0 to 9 select windows 0 through 9\n
    1
    2
    3
    4
    5
    6
    7
    8
    Tmux Panes Hotkeys
    % create a horizontal pane\n" create a vertical pane\n<space>  # 切换 Pane 布局\nh move to the left pane. *\nj move to the pane below *\nl move to the right pane *\nk move to the pane above *\nq show pane numbers\no toggle between panes\n} swap with next pane\n{ swap with previous pane\n! break the pane out of the window\nx kill the current pane\nt        # 显示一个时钟\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Tmux Scroll
    • C-a + [ to into scroll mode, q to quit scroll mode
    • copy mode can scroll too
    • set -g mouse on for enabling mouse scrolling

    Configuration

    # C-b is not acceptable -- Vim uses it\nset-option -g prefix C-a\nbind-key C-a last-window\n\n# Start numbering at 1\nset -g base-index 1\n\n# Allows for faster key repetition\nset -s escape-time 0\n\n# Set status bar\nset -g status-bg black\nset -g status-fg white\nset -g status-left ""\nset -g status-right "#[fg=green]#H"\n\n# Enable scroll mouse\nset -g mouse on\n\n# Rather than constraining window size to the maximum size of any client\n# connected to the *session*, constrain window size to the maximum size of any\n# client connected to *that window*. Much more reasonable.\nsetw -g aggressive-resize on\n\n# Allows us to use C-a a <command> to send commands to a TMUX session inside\n# another TMUX session\nbind-key a send-prefix\n\n# Reload configuration\nbind r source-file ~/.tmux.conf \\; display-message "Config reloaded"\n\n# Escape to enter copy mode, v to selection, y to yank, p to paste\nbind Escape copy-mode\nbind-key -T copy-mode-vi 'v' send -X begin-selection\nbind-key -T copy-mode-vi 'y' send -X copy-selection-and-cancel\n# bind-key -t vi-copy v begin-selection\n# bind-key -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"\nunbind p\nbind p pasteb\n\nsetw -g mode-keys vi      # Vi\n\n# Highlight active window\nset-window-option -g window-status-current-bg red\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44

    Perf Tools

    Top Command

    top\n
    1

    dmesg

    dmesg | tail\n
    1

    iostat

    iostat -xz 1\n
    1

    free

    free -m\n
    1

    sar

    `sar -n DEV 1`\n
    1
    `sar -n TCP,ETCP 1`\n
    1

    perf

    Perf Examples

    perf list # events\nperf stat <command>\nperf stat -e <events> <command>\nperf record -e <events> -a <command>\nperf report\n
    1
    2
    3
    4
    5

    Linux Tools

    FFmpeg

    # https://www.yanxurui.cc/posts/tool/2017-10-07-use-ffmpeg-to-edit-video\nffmpeg -global_options -input_1_options -i input_1 -input_2_options -i input_2 \\\n  -output_1_options output_1 ...\n
    1
    2
    3

    FFmpeg Probe

    ffprobe input.mp4\nffmpeg -hide_banner -i input.mkv\n
    1
    2

    FFmpeg Transform

    • MP4: H264Video + ACCAudio
    • WebM: VP8Video + VorbisAudio
    • OGG: TheoraVideo + VorbisAudio
    # code decoder information\nffmpeg -codecs\n
    1
    2
    # mkv to mp4\nffmpeg -i input.mkv -codec copy output.mp4\n
    1
    2
    # compress\nffmpeg -i input.mkv -c copy -c:v libx264 -vf scale=-2:720 output.mkv\n
    1
    2
    # make mkv with video and subtitle\nffmpeg -i input.avi -i input.srt \\\n  -map 0:0 -map 0:1 -map 1:0 -c:v libx264 -c:a aac -c:s srt output.mkv\n
    1
    2
    3
    # flac to mp3\nffmpeg -i "Michael Jackson - Billie Jean.flac" \\\n  -ab 320k "Michael Jackson - Billie Jean.mp3"\nffmpeg -i music_flac.flac \\\n  -acodec libmp3lame      \\\n  -ar 44100               \\\n  -ab 320k                \\\n  -ac 2 music_flac_mp3.mp3\n# - acodec: Audio Coder Decoder 音频编码解码器\n# - libmp3lame: MP3 解码器\n# - ar: audio rate 音频采样率, 默认用原音频的采样率\n# - ab: audio bit rate 音频比特率, 默认 128K\n# - ac: audio channels 音频声道, 默认采用源音频的声道数\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # mp4 to avi\nffmpeg -i video.mp4 \\\n  -s 1920x1080      \\\n  -pix_fmt yuv420p  \\\n  -vcodec libx264   \\\n  -preset medium    \\\n  -profile:v high   \\\n  -level:v 4.1      \\\n  -crf 23           \\\n  -r 30             \\\n  -acodec aac       \\\n  -ar 44100         \\\n  -ac 2             \\\n  -b:a 128k video_avi.avi\n# - s: 缩放视频新尺寸 (size)\n# - pix_fmt:pixel format, 设置视频颜色空间\n# - vcodec: Video Coder Decoder, 视频编码解码器\n# - preset: 编码器预设\n# - profile:v: 编码器配置, 与压缩比有关. 实时通讯-baseline, 流媒体-main, 超清视频-high\n# - level:v: 对编码器设置的具体规范和限制, 权衡压缩比和画质\n# - crf: 设置码率控制模式, constant rate factor恒定速率因子模式, 范围 0~51, 数值越小, 画质越高\n# - r:设置视频帧率\n# - b:a: 音频比特率, 大多数网站限制音频比特率 128k, 129k\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

    FFmpeg Cutting

    # audio only\nffmpeg -i cut.mp4 -vn output.mp3\nffmpeg -i video.mp4 -vn -acodec copy video_noVideo.m4a\n\n# video only\nffmpeg -i video.mp4 -vcodec copy -an video_silent.mp4\n
    1
    2
    3
    4
    5
    6
    # from to cutting\nffmpeg -i music.mp3 -ss 00:00:30 -to 00:02:00 -acodec copy music_cutout.mp3\nffmpeg -i in.mp4 -ss 00:01:00 -to 00:01:10 -c copy out.mp4\nffmpeg -ss 00:01:00 -i in.mp4 -to 00:01:10 -c copy -copyts out.mp4\n\n# 30s duration cutting\nffmpeg -ss 00:02:00.0 -i input.mkv -t 30 -c copy output.mkv\nffmpeg -i input.mkv -ss 00:02:00.0 -t 30 -c copy output.mkv\nffmpeg -ss 00:01:30.0 -i input.mkv -ss 00:00:30.0 -t 30 output.mkv\n
    1
    2
    3
    4
    5
    6
    7
    8
    9

    FFmpeg Mixing

    # replace audio\nffmpeg -i input.mkv -i input.mp3 -map 0:v -map 1:a -c copy -shortest output.mp4\n\n# merge audio and video\nffmpeg -i video_noVideo.m4a -i video_silent.mp4 -c copy video_merge.mp4\n\nffmpeg -i "concat:01.mp4|02.mp4|03.mp4" -c copy out.mp4\n\nffmpeg -i input.mkv -i output.aac \\\n  -filter_complex "[0:a][1:a]amerge=inputs=2[a]" -map 0:v -map "[a]" \\\n  -c:v copy -c:a aac -ac 2 -shortest output.mp4\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    FFmpeg Screenshot

    # -vf -> -filter:v\nffmpeg -ss 00:30:14.435 -i input.mkv -vframes 1 out.png\nffmpeg -i input.mkv -vf fps=1/60 -strftime 1 out_%Y%m%d%H%M%S.jpg\n
    1
    2
    3

    FFmpeg Gif

    ffmpeg -i video.mp4 -ss 7.5 -to 8.5 -s 640x320 -r 15 video_gif.gif\n\npalette="/tmp/palette.png"\nfilters="fps=10,scale=-1:144:flags=lanczos"\nffmpeg -ss 30 -t 5 -i input.mp4 -vf "$filters,palettegen" -y $palette\nffmpeg -ss 30 -t 5 -i input.mp4 -i $palette \\\n  -filter_complex "$filters [x]; [x][1:v] paletteuse" -y output.gif\n
    1
    2
    3
    4
    5
    6
    7

    FFmpeg Subtitle

    ffmpeg -i input.mkv -vf subtitles=input.srt output.mp4\nffmpeg -i input.mkv -vf ass=input.ass output.mp4\n
    1
    2

    FFmpeg Watermark

    ffmpeg -i input.mkv -i input.png \\\n  -filter_complex "overlay=W-w-5:5" -c copy -c:v libx264 output.mkv\n
    1
    2

    FFmpeg Desktop Recording

    # windows\nffmpeg -f gdigrab -i desktop rec.mp4\n\n# linux\nsudo ffmpeg -f fbdev -framerate 10 -i /dev/fb0 rec.mp4\n
    1
    2
    3
    4
    5

    FFmpeg Live Streaming

    ffmpeg -re i rec.mp4 按照网站要求编码 -f flv "你的 RTMP 地址/你的直播码"\n
    1

    Nginx

    • /etc/nginx/sites-available: sites config
    nginx -t # check config syntax\n
    1

    Nginx Basic Configuration

    泛域名路径分离: xxx.test.dev -> /usr/local/html/xxx

    server {\n  listen 80;\n  server_name ~^([\\w-]+)\\.test\\.dev$;\n  root /usr/local/html/$1;\n}\n
    1
    2
    3
    4
    5
    server {\n  # SSL configuration\n  #\n  # listen 443 ssl default_server;\n  # listen [::]:443 ssl default_server;\n  #\n  root /var/www/html/;\n\n  # Add index.php to the list if you are using PHP\n  index index.html index.htm index.nginx-debian.html;\n\n  server_name example.tld www.example.tld;\n\n  # Cache static assets\n  location ~* \\.(?:jpg|jpeg|gif|png|ico|svg)$ {\n    expires 7d;\n    add_header Cache-Control "public";\n  }\n\n  location ^~ /assets/ {\n    gzip_static on;\n    expires 12h;\n    add_header Cache-Control "public";\n  }\n\n  # Cache css and js bundle\n  location ~* \\.(?:css|js)$ {\n    add_header Cache-Control "no-cache, public, must-revalidate, proxy-revalidate";\n  }\n\n  location / {\n    include /etc/nginx/mime.types;\n    try_files $uri $uri/ /index.html;\n    # try_files $uri $uri/ =404;\n\n    # proxy_http_version 1.1;\n    # proxy_cache_bypass $http_upgrade;\n    # proxy_set_header Upgrade $http_upgrade;\n    # proxy_set_header Connection 'upgrade';\n    # proxy_set_header Host $host;\n    # proxy_set_header X-Real-IP $remote_addr;\n    # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n    # proxy_set_header X-Forwarded-Proto $scheme;\n    # proxy_pass http://localhost:3000;\n  }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46

    Namespaces and Cgroup

    Namespaces

    # PID Namespace\nunshare --fork --pid --mount-proc /bin/bash\nps -aux\n\n# Mount Namespace\nunshare --fork --mount /bin/bash\nmkdir /tmp/mnt\nmount -t tmpfs -o size=1m tmpfs /tmp/mnt\ndf -h |grep mnt\n\n# User Namespace\nPS1='\\u@container#' unshare --user -r /bin/bash\n\n# UTS Namespace (isolated hostname)\nunshare --fork --uts /bin/bash\nhostname -b container\n\n# IPC Namespace\nunshare --fork --ipc /bin/bash\nipcmk -Q\nipcs -q\n\n# Net Namespace\nunshare --fork --net /bin/bash\nip addr\nnetstat -ntlp\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26

    Cgroup

    Cgroup (Linux Control Group): limit process group resources usage, including CPU, Memory, Disk I/O, Network Bandwidth etc.

    • Resource usage limit.
    • Priority.
    • Resource record.
    • Process Control.

    List cgroup

    mount -t cgroup\nls -l /sys/fs/cgroup/\n
    1
    2

    Create cgroup

    mkdir /sys/fs/cgroup/cpu/loop\nls -l /sys/fs/cgroup/cpu/loop\ncat /sys/fs/cgroup/cpu/loop/cpu.cfs_period_us # 100000us\ncat /sys/fs/cgroup/cpu/loop/cpu.cfs_quota_us  # -1 (no limit)\n
    1
    2
    3
    4

    Resource control via cgroup

    # limit cpu usage to 50%\necho 50000 >/sys/fs/cgroup/cpu/loop/cpu.cfs_quota_us\n\n# add pid to `loop` cgroup\necho 21497 >/sys/fs/cgroup/cpu/loop/tasks\n
    1
    2
    3
    4
    5

    Docker

    Docker Installation

     sudo apt-get update\n sudo apt-get install \\\n  apt-transport-https \\\n  ca-certificates \\\n  curl \\\n  gnupg \\\n  lsb-release\ncurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -\nsudo add-apt-repository \\\n  "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"\nsudo apt update\nsudo apt install docker-ce docker-ce-cli containerd.io\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    curl -fsSL https://get.docker.com -o get-docker.sh\nsudo DRY_RUN=1 sh get-docker.sh\n
    1
    2
    sudo systemctl status docker\nsudo usermod -aG docker $USER\n
    1
    2

    Docker Uninstallation

    docker container stop $(docker container ls -aq)\ndocker system prune -a --volumes\nsudo apt purge docker-ce docker-ce-cli containerd.io\nsudo apt autoremove\nsudo rm -rf /var/lib/docker\nsudo rm -rf /var/lib/containerd\n
    1
    2
    3
    4
    5
    6

    Docker Basic Usage

    Build Docker Image
    docker build . -t image-name\n\n# use Dockerfile at the root of the repository\ndocker build <github-repo-url> -t image-name\n
    1
    2
    3
    4
    Run Docker Image
    # docker run -dp <host-port>:<container-port> [docker-image]\ndocker run -d -p 80:80 --name app-name docker/getting-started\ndocker run -d -p 80:80/tcp -p 80:80/udp --name app-name docker/getting-started\n
    1
    2
    3
    ',565);p.render=function(a,e,p,t,r,i){return n(),s("div",null,[l])};export default p;export{e as __pageData}; diff --git a/assets/programming_linux_linuxBasicNotes.md.37adc63b.lean.js b/assets/programming_linux_linuxBasicNotes.md.37adc63b.lean.js new file mode 100644 index 00000000000..123ea40c760 --- /dev/null +++ b/assets/programming_linux_linuxBasicNotes.md.37adc63b.lean.js @@ -0,0 +1 @@ +import{o as n,c as s,a}from"./app.6dd2a1b7.js";const e='{"title":"Linux Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Linux Boot System","slug":"linux-boot-system"},{"level":3,"title":"Grub","slug":"grub"},{"level":3,"title":"重装 Linux","slug":"重装-linux"},{"level":2,"title":"SSH 命令","slug":"ssh-命令"},{"level":3,"title":"Key","slug":"key"},{"level":3,"title":"SSHD","slug":"sshd"},{"level":3,"title":"SSH Config File","slug":"ssh-config-file"},{"level":3,"title":"密钥文件","slug":"密钥文件"},{"level":3,"title":"远程传输文件","slug":"远程传输文件"},{"level":2,"title":"命令优先级","slug":"命令优先级"},{"level":2,"title":"Linux 文件架构","slug":"linux-文件架构"},{"level":2,"title":"Ubuntu","slug":"ubuntu"},{"level":3,"title":"Ubuntu Locale Settings","slug":"ubuntu-locale-settings"},{"level":3,"title":"Ubuntu Themes","slug":"ubuntu-themes"},{"level":2,"title":"Arch Linux","slug":"arch-linux"},{"level":3,"title":"Basic Arch Linux Setup","slug":"basic-arch-linux-setup"},{"level":3,"title":"Pacman","slug":"pacman"},{"level":3,"title":"AUR","slug":"aur"},{"level":2,"title":"基本处理命令","slug":"基本处理命令"},{"level":3,"title":"ls","slug":"ls"},{"level":3,"title":"cd","slug":"cd"},{"level":3,"title":"pwd","slug":"pwd"},{"level":3,"title":"rm","slug":"rm"},{"level":3,"title":"cp","slug":"cp"},{"level":3,"title":"mv","slug":"mv"},{"level":3,"title":"ln","slug":"ln"},{"level":2,"title":"基本搜索命令","slug":"基本搜索命令"},{"level":3,"title":"locate","slug":"locate"},{"level":3,"title":"type","slug":"type"},{"level":3,"title":"apropos","slug":"apropos"},{"level":3,"title":"whereis and whatis","slug":"whereis-and-whatis"},{"level":3,"title":"which","slug":"which"},{"level":3,"title":"find","slug":"find"},{"level":3,"title":"Grep","slug":"grep"},{"level":2,"title":"Process Command","slug":"process-command"},{"level":3,"title":"uptime","slug":"uptime"},{"level":3,"title":"ps","slug":"ps"},{"level":3,"title":"top","slug":"top"},{"level":3,"title":"vmstat","slug":"vmstat"},{"level":3,"title":"pidstat","slug":"pidstat"},{"level":3,"title":"mpstat","slug":"mpstat"},{"level":3,"title":"lscpu","slug":"lscpu"},{"level":3,"title":"jobs","slug":"jobs"},{"level":3,"title":"bg","slug":"bg"},{"level":3,"title":"fg","slug":"fg"},{"level":3,"title":"kill","slug":"kill"},{"level":3,"title":"killall","slug":"killall"},{"level":3,"title":"shutdown","slug":"shutdown"},{"level":3,"title":"pstree","slug":"pstree"},{"level":3,"title":"xload and tload","slug":"xload-and-tload"},{"level":3,"title":"screen","slug":"screen"},{"level":2,"title":"CLI Input Output Command","slug":"cli-input-output-command"},{"level":3,"title":"cat","slug":"cat"},{"level":3,"title":"sort","slug":"sort"},{"level":3,"title":"uniq","slug":"uniq"},{"level":3,"title":"wc","slug":"wc"},{"level":3,"title":"Head and Tail","slug":"head-and-tail"},{"level":3,"title":"Tee","slug":"tee"},{"level":3,"title":"nl","slug":"nl"},{"level":3,"title":"fold","slug":"fold"},{"level":3,"title":"fmt","slug":"fmt"},{"level":3,"title":"pr","slug":"pr"},{"level":3,"title":"printf","slug":"printf"},{"level":2,"title":"帮助命令","slug":"帮助命令"},{"level":3,"title":"man","slug":"man"},{"level":3,"title":"help shell 内部命令","slug":"help-shell-内部命令"},{"level":3,"title":"info","slug":"info"},{"level":3,"title":"System Info","slug":"system-info"},{"level":2,"title":"压缩命令","slug":"压缩命令"},{"level":3,"title":"Zip","slug":"zip"},{"level":3,"title":"Gz","slug":"gz"},{"level":3,"title":"Bz2","slug":"bz2"},{"level":3,"title":"Tar","slug":"tar"},{"level":3,"title":"7z","slug":"_7z"},{"level":2,"title":"User and Group Command","slug":"user-and-group-command"},{"level":3,"title":"组操作","slug":"组操作"},{"level":3,"title":"用户操作","slug":"用户操作"},{"level":2,"title":"权限管理命令","slug":"权限管理命令"},{"level":3,"title":"普通权限","slug":"普通权限"},{"level":3,"title":"ACL 权限","slug":"acl-权限"},{"level":3,"title":"sudo 权限","slug":"sudo-权限"},{"level":3,"title":"SetUID and SetGID","slug":"setuid-and-setgid"},{"level":2,"title":"显示器管理命令","slug":"显示器管理命令"},{"level":3,"title":"xrandr","slug":"xrandr"},{"level":2,"title":"主机信息管理命令","slug":"主机信息管理命令"},{"level":2,"title":"Disk IO","slug":"disk-io"},{"level":3,"title":"挂载命令","slug":"挂载命令"},{"level":3,"title":"修复命令","slug":"修复命令"},{"level":3,"title":"分区命令","slug":"分区命令"},{"level":3,"title":"Zero Copy","slug":"zero-copy"},{"level":2,"title":"Device Command","slug":"device-command"},{"level":3,"title":"Monitor Info","slug":"monitor-info"},{"level":3,"title":"Touch Pad Synoptics","slug":"touch-pad-synoptics"},{"level":2,"title":"包管理命令","slug":"包管理命令"},{"level":3,"title":"rpm 命令","slug":"rpm-命令"},{"level":3,"title":"yum","slug":"yum"},{"level":3,"title":"源码包安装","slug":"源码包安装"},{"level":3,"title":"Applications Management","slug":"applications-management"},{"level":2,"title":"网络连接命令","slug":"网络连接命令"},{"level":3,"title":"wget","slug":"wget"},{"level":3,"title":"Certificate Bot","slug":"certificate-bot"},{"level":3,"title":"GFW","slug":"gfw"},{"level":2,"title":"网络管理命令","slug":"网络管理命令"},{"level":3,"title":"ufw","slug":"ufw"},{"level":3,"title":"arp","slug":"arp"},{"level":3,"title":"netstat","slug":"netstat"},{"level":3,"title":"nslookup","slug":"nslookup"},{"level":3,"title":"ping","slug":"ping"},{"level":3,"title":"telnet","slug":"telnet"},{"level":3,"title":"Trace Route","slug":"trace-route"},{"level":3,"title":"Net Filter Framework","slug":"net-filter-framework"},{"level":2,"title":"网络扫描命令","slug":"网络扫描命令"},{"level":3,"title":"fping","slug":"fping"},{"level":3,"title":"hping","slug":"hping"},{"level":3,"title":"mtr","slug":"mtr"},{"level":3,"title":"nmap","slug":"nmap"},{"level":3,"title":"ncat","slug":"ncat"},{"level":2,"title":"脚本运行命令","slug":"脚本运行命令"},{"level":3,"title":"Systemctl","slug":"systemctl"},{"level":3,"title":"定时任务","slug":"定时任务"},{"level":3,"title":"后台任务","slug":"后台任务"},{"level":3,"title":"开机任务","slug":"开机任务"},{"level":2,"title":"历史记录命令","slug":"历史记录命令"},{"level":3,"title":"history","slug":"history"},{"level":3,"title":"ctrl-r","slug":"ctrl-r"},{"level":3,"title":"History Shortcuts","slug":"history-shortcuts"},{"level":2,"title":"并行命令","slug":"并行命令"},{"level":2,"title":"C/C++ Binary Command","slug":"c-c-binary-command"},{"level":3,"title":"ldd","slug":"ldd"},{"level":3,"title":"nm","slug":"nm"},{"level":2,"title":"Plot Command","slug":"plot-command"},{"level":2,"title":"Other Command","slug":"other-command"},{"level":3,"title":"Time","slug":"time"},{"level":2,"title":"Shell 编程","slug":"shell-编程"},{"level":3,"title":"Shell Warnings","slug":"shell-warnings"},{"level":3,"title":"文件重定向","slug":"文件重定向"},{"level":3,"title":"变量","slug":"变量"},{"level":3,"title":"数值运算","slug":"数值运算"},{"level":3,"title":"Bash Expansions","slug":"bash-expansions"},{"level":3,"title":"流程控制语句","slug":"流程控制语句"},{"level":3,"title":"Bash Array","slug":"bash-array"},{"level":3,"title":"Bash Function","slug":"bash-function"},{"level":3,"title":"Bash IO","slug":"bash-io"},{"level":3,"title":"信号","slug":"信号"},{"level":3,"title":"Bash Debugging","slug":"bash-debugging"},{"level":3,"title":"Shell Script Best Practices","slug":"shell-script-best-practices"},{"level":3,"title":"Interactive Shell Script Tips","slug":"interactive-shell-script-tips"},{"level":2,"title":"Terminal","slug":"terminal"},{"level":3,"title":"Terminal Basis","slug":"terminal-basis"},{"level":3,"title":"Default Terminal","slug":"default-terminal"},{"level":3,"title":"Tmux","slug":"tmux"},{"level":2,"title":"Perf Tools","slug":"perf-tools"},{"level":3,"title":"Top Command","slug":"top-command"},{"level":3,"title":"dmesg","slug":"dmesg"},{"level":3,"title":"iostat","slug":"iostat"},{"level":3,"title":"free","slug":"free"},{"level":3,"title":"sar","slug":"sar"},{"level":3,"title":"perf","slug":"perf"},{"level":2,"title":"Linux Tools","slug":"linux-tools"},{"level":3,"title":"FFmpeg","slug":"ffmpeg"},{"level":3,"title":"Nginx","slug":"nginx"},{"level":3,"title":"Namespaces and Cgroup","slug":"namespaces-and-cgroup"},{"level":3,"title":"Docker","slug":"docker"}],"relativePath":"programming/linux/linuxBasicNotes.md","lastUpdated":1627731858000}',p={},l=a('',565);p.render=function(a,e,p,t,r,i){return n(),s("div",null,[l])};export default p;export{e as __pageData}; diff --git a/assets/programming_tools_buildTools_CMakeBasicNotes.md.c21de6b5.js b/assets/programming_tools_buildTools_CMakeBasicNotes.md.c21de6b5.js new file mode 100644 index 00000000000..512ce8d8b7b --- /dev/null +++ b/assets/programming_tools_buildTools_CMakeBasicNotes.md.c21de6b5.js @@ -0,0 +1 @@ +import{o as n,c as s,a}from"./app.6dd2a1b7.js";const e='{"title":"CMake Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Basic Build System","slug":"basic-build-system"},{"level":3,"title":"Basic Options","slug":"basic-options"},{"level":2,"title":"Flow Control","slug":"flow-control"},{"level":3,"title":"if control","slug":"if-control"},{"level":3,"title":"foreach control","slug":"foreach-control"},{"level":3,"title":"while control","slug":"while-control"},{"level":3,"title":"function control","slug":"function-control"},{"level":2,"title":"Useful Command","slug":"useful-command"},{"level":3,"title":"Checking Command","slug":"checking-command"},{"level":3,"title":"Testing Command","slug":"testing-command"},{"level":3,"title":"Option Command","slug":"option-command"},{"level":3,"title":"Math Command","slug":"math-command"},{"level":3,"title":"List Command","slug":"list-command"},{"level":3,"title":"Package Command","slug":"package-command"},{"level":3,"title":"Install Command","slug":"install-command"},{"level":3,"title":"find packages","slug":"find-packages"},{"level":2,"title":"Useful Tools","slug":"useful-tools"},{"level":2,"title":"Config Command","slug":"config-command"},{"level":3,"title":"Version Config","slug":"version-config"},{"level":3,"title":"Project Config","slug":"project-config"},{"level":3,"title":"Environment Config","slug":"environment-config"},{"level":3,"title":"Library for Clients Usage","slug":"library-for-clients-usage"},{"level":2,"title":"Test Setting","slug":"test-setting"},{"level":2,"title":"Generator Expression","slug":"generator-expression"},{"level":2,"title":"Submodule and Dependencies","slug":"submodule-and-dependencies"},{"level":2,"title":"CMake Patterns","slug":"cmake-patterns"},{"level":3,"title":"Modern CMake","slug":"modern-cmake"},{"level":3,"title":"Nice Patterns","slug":"nice-patterns"},{"level":3,"title":"Anti Patterns","slug":"anti-patterns"},{"level":2,"title":"Makefile Notes","slug":"makefile-notes"},{"level":3,"title":"Makefile Macro","slug":"makefile-macro"},{"level":3,"title":"Built-in Makefile Variable","slug":"built-in-makefile-variable"},{"level":3,"title":"Makefile Inexplicit Rules","slug":"makefile-inexplicit-rules"},{"level":3,"title":"Makefile Function","slug":"makefile-function"},{"level":3,"title":"Makefile Best Practice","slug":"makefile-best-practice"},{"level":2,"title":"Reference","slug":"reference"}],"relativePath":"programming/tools/buildTools/CMakeBasicNotes.md","lastUpdated":1627196177000}',p={},t=a('

    CMake Basic Notes

    Basic Build System

    build for executable

    cmake_minimum_required(VERSION 2.8.9)\nproject(directory_test)\n\nadd_definitions(-DUSEXX)\nadd_compile_options(-std=c++11 -Wall -Wextra)\n\n# Bring the headers, such as Student.h into the project\ninclude_directories(include)\n\n# Can manually add the sources using the set command as follows:\n# set(SOURCES src/mainApp.cpp src/Student.cpp)\n\n# However, the file(GLOB...) allows for wildcard additions:\nfile(GLOB SOURCES "src/*.cpp")\n\nmessage(STATUS "CMake demo: build for executable")\n\nadd_executable(testStudent ${SOURCES})\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    build for library

    cmake_minimum_required(VERSION 2.8.9)\nproject(directory_test)\nset(CMAKE_BUILD_TYPE Release)\n\n# Bring the headers, such as Student.h into the project\ninclude_directories(include)\n\n# However, the file(GLOB...) allows for wildcard additions:\nfile(GLOB SOURCES "src/*.cpp")\n\n# Generate the shared library from the sources\n# flag: SHARED, STATIC, MODULE\nadd_library(testStudent SHARED ${SOURCES})\n\nmessage(STATUS "CMake demo: build for library")\n\n# Set the location for library installation -- i.e., /usr/lib in this case\n# not really necessary in this example. Use "sudo make install" to apply\ninstall(TARGETS testStudent DESTINATION /usr/lib)\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    use a shared or static library

    cmake_minimum_required(VERSION 2.8.9)\nproject(TestLibrary)\n\n# For the shared library:\nset(PROJECT_LINK_LIBS libTestStudent.so)\nlink_directories(~/exploringBB/extras/cmake/studentLib_shared/build)\n\n# For the static library:\n# set (PROJECT_LINK_LIBS libTestStudent.a)\n# link_directories(~/exploringBB/extras/cmake/studentLib_static/build)\n\ninclude_directories(~/exploringBB/extras/cmake/studentLib_shared/include)\n\nadd_executable(libTest libTest.cpp)\ntarget_link_libraries(libTest ${PROJECT_LINK_LIBS} )\n\nmessage(STATUS "CMake demo: use library")\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

    set output of library

    # 指定lib输出目录\nset(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)\nset(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)\nset(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)\n\n# 指定版本\nset(DEMO5_VERSION_MAJOR 1)\nset(DEMO5_VERSION_MINOR 1)\nset(DEMO5_VERSION_PATCH 1)\nset(DEMO5_VERSION ${DEMO5_VERSION_MAJOR}.${DEMO5_VERSION_MINOR}.${DEMO5_VERSION_PATCH})\n\naux_source_directory(. SRC_LIST)\n\nadd_library(demo5 SHARED ${SRC_LIST})\nset_target_properties(\n    demo5 PROPERTIES\n    VERSION ${DEMO5_VERSION}\n    SOVERSION ${DEMO5_VERSION_MAJOR}\n)\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    build for library and executable

    cmake_minimum_required(VERSION 3.5)\nproject(MiniSat VERSION 2.2 LANGUAGES CXX)\n\nadd_library(libMiniSat STATIC\n    miniSat/core/Solver.cc\n    miniSat/utils/Options.cc\n    miniSat/utils/System.cc\n    miniSat/simp/SimpSolver.cc\n)\n\ntarget_compile_features(libMiniSat\n    PUBLIC\n      cxx_attributes\n      cxx_defaulted_functions\n      cxx_deleted_functions\n      cxx_final\n)\n\ntarget_include_directories(libMiniSat PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})\n\ntarget_compile_definitions(libMiniSat PUBLIC __STDC_LIMIT_MACROS __STDC_FORMAT_MACROS)\n\n# Also build the two MiniSat executables\nadd_executable(miniSat miniSat/core/Main.cc)\ntarget_link_libraries(miniSat libMiniSat)\n\nadd_executable(miniSat-simp miniSat/simp/Main.cc)\ntarget_link_libraries(miniSat-simp libMiniSat)\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28

    Basic Options

    make VERBOSE=1\n
    1

    Standard options:

    • -DCMAKE_BUILD_TYPE= Pick from Release, RelWithDebInfo, Debug, or sometimes more
    • -DCMAKE_INSTALL_PREFIX= /usr/local (the default), ~/.local
    • -D BUILD_SHARED_LIBS=
    • --trace print every line of CMake

    Flow Control

    if control

    • Unary: NOT, TARGET, EXISTS (file), DEFINED
    • Binary: STREQUAL, AND, OR, MATCHES(regular expression), VERSION_LESS, VERSION_LESS_EQUAL
    if(WIN32)\n    message("This is win32 platform")\nelse()\n    message("This is not win32 platform")\nendif()\n
    1
    2
    3
    4
    5

    foreach control

    set(FOR_LIST demo1.cpp demo2.cpp demo3.cpp)\nforeach(f ${FOR_LIST})\n    message("now is file: " ${f})\nendforeach ()\n
    1
    2
    3
    4

    while control

    set(A "1")\nset(B "1")\nwhile(A LESS "1000000")\n    message("${A}")                 # Print A\n    math(EXPR T "${A} + ${B}")      # Add values of A and B; store result in T\n    set(A "${B}")                   # Assign the value of B to A\n    set(B "${T}")                   # Assign the value of T to B\nendwhile()\n
    1
    2
    3
    4
    5
    6
    7
    8

    function control

    Basic Usage of Function

    function(doubleIt VALUE)\n    math(EXPR RESULT "${VALUE} * 2")\n    message("${RESULT}")\nendfunction()\n\ndoubleIt("4")          # Prints: 8\n
    1
    2
    3
    4
    5
    6
    function(doubleIt VARNAME VALUE)\n    math(EXPR RESULT "${VALUE} * 2")\n    set(${VARNAME} "${RESULT}" PARENT_SCOPE)\nendfunction()\n\ndoubleIt(RESULT "4")   # Tell the function to set the variable named RESULT\nmessage("${RESULT}")   # Prints: 8\n
    1
    2
    3
    4
    5
    6
    7
    function(doubleEach)\n    foreach(ARG ${ARGN})           # Iterate over each argument\n        math(EXPR N "${ARG} * 2")  # Double ARG numeric value\n        message("${N}")            # Print N\n    endforeach()\nendfunction()\n\ndoubleEach(5 6 7 8)                # Prints 10, 12, 14, 16 on separate lines\n
    1
    2
    3
    4
    5
    6
    7
    8

    Parse Arguments of Function

    function(COMPLEX)\ncmake_parse_arguments(\n    COMPLEX_PREFIX\n    "SINGLE;ANOTHER"\n    "ONE_VALUE;ALSO_ONE_VALUE"\n    "MULTI_VALUES"\n    ${ARGN}\n)\n\nendfunction()\n\ncomplex(SINGLE ONE_VALUE value MULTI_VALUES some other values)\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    Inside the function after this call, you'll find:

    COMPLEX_PREFIX_SINGLE = TRUE\nCOMPLEX_PREFIX_ANOTHER = FALSE\nCOMPLEX_PREFIX_ONE_VALUE = "value"\nCOMPLEX_PREFIX_ALSO_ONE_VALUE = <UNDEFINED>\nCOMPLEX_PREFIX_MULTI_VALUES = "some;other;values"\n
    1
    2
    3
    4
    5

    Useful Command

    Checking Command

    # does this system provide the log and exp functions?\ninclude(CheckFunctionExists)\ncheck_function_exists(log HAVE_LOG)\ncheck_function_exists(exp HAVE_EXP)\n
    1
    2
    3
    4

    Testing Command

    #define a macro to simplify adding tests, then use it\nmacro(do_test arg result)\n  add_test(TutorialComp${arg} Tutorial ${arg})\n  set_tests_properties(TutorialComp${arg}\n    PROPERTIES PASS_REGULAR_EXPRESSION ${result})\nendmacro(do_test)\n\n# do a bunch of result based tests\ndo_test(25 "25 is 5")\ndo_test(-25 "-25 is 0")\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    include(CTest)\n\n# does the application run\nadd_test (TutorialRuns Tutorial 25)\n\n# does it sqrt of 25\nadd_test (TutorialComp25 Tutorial 25)\nset_tests_properties (TutorialComp25 PROPERTIES PASS_REGULAR_EXPRESSION "25 is 5")\n\n# does it handle negative numbers\nadd_test (TutorialNegative Tutorial -25)\nset_tests_properties (\n    TutorialNegative PROPERTIES\n    PASS_REGULAR_EXPRESSION "-25 is 0"\n)\n\n# does it handle small numbers\nadd_test (TutorialSmall Tutorial 0.0001)\nset_tests_properties (\n    TutorialSmall PROPERTIES\n    PASS_REGULAR_EXPRESSION "0.0001 is 0.01"\n)\n\n# does the usage message work?\nadd_test (TutorialUsage Tutorial)\nset_tests_properties (\n    TutorialUsage PROPERTIES\n    PASS_REGULAR_EXPRESSION "Usage:.*number"\n)\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29

    Option Command

    # 是否使用我们自己的函数?\noption(USE_MATH\n        "Use tutorial provided math implementation" ON)\n\n# add the MathFunctions library?\nif(USE_MATH)\n  include_directories("${PROJECT_SOURCE_DIR}/MathFunctions")\n  add_subdirectory(MathFunctions)\n  set(EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)\nendif(USE_MATH)\n\n# add the executable\nadd_executable(Tutorial tutorial.cxx)\ntarget_link_libraries(Tutorial  ${EXTRA_LIBS})\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    Math Command

    set(ARGS "EXPR;T;1 + 1")\nmath(${ARGS})                      # Equivalent to calling math(EXPR T "1 + 1")\n
    1
    2

    List Command

    set(MY_LIST These are separate arguments)\nlist(REMOVE_ITEM MY_LIST "separate")  # Removes "separate" from the list\nmessage("${MY_LIST}")                 # Prints: These;are;arguments\n
    1
    2
    3

    Package Command

    # build a CPack driven installer package\ninclude(InstallRequiredSystemLibraries)\nset(CPACK_RESOURCE_FILE_LICENSE\n     "${CMAKE_CURRENT_SOURCE_DIR}/License.txt")\nset(CPACK_PACKAGE_VERSION_MAJOR "${Tutorial_VERSION_MAJOR}")\nset(CPACK_PACKAGE_VERSION_MINOR "${Tutorial_VERSION_MINOR}")\ninclude(CPack)\n
    1
    2
    3
    4
    5
    6
    7
    cpack --config CPackConfig.cmake\ncpack --config CPackSourceConfig.cmake\n
    1
    2

    Install Command

    install binaries

    INSTALL(TARGETS targets...\n        [[ARCHIVE|LIBRARY|RUNTIME]\n        [DESTINATION < dir >]\n        [PERMISSIONS permissions...]\n        [CONFIGURATIONS\n        [Debug|Release|...]]\n        [COMPONENT < component >]\n        [OPTIONAL]\n        ] [...])\n\nINSTALL(TARGETS myRun myLib myStaticLib\n        RUNTIME DESTINATION bin\n        LIBRARY DESTINATION lib\n        ARCHIVE DESTINATION libStatic)\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    install normal files

    INSTALL(FILES files... DESTINATION <dir>\n     [PERMISSIONS permissions...]\n     [CONFIGURATIONS [Debug|Release|...]]\n     [COMPONENT <component>]\n     [RENAME <name>] [OPTIONAL])\n\n\nINSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/t2)\n
    1
    2
    3
    4
    5
    6
    7
    8

    install scripts

    INSTALL(PROGRAMS files... DESTINATION <dir>\n     [PERMISSIONS permissions...]\n     [CONFIGURATIONS [Debug|Release|...]]\n     [COMPONENT <component>]\n     [RENAME <name>] [OPTIONAL])\n\n\nINSTALL(PROGRAMS runHello.sh DESTINATION bin)\n
    1
    2
    3
    4
    5
    6
    7
    8

    install directories

    INSTALL(DIRECTORY dirs... DESTINATION <dir>\n     [FILE_PERMISSIONS permissions...]\n     [DIRECTORY_PERMISSIONS permissions...]\n     [USE_SOURCE_PERMISSIONS]\n     [CONFIGURATIONS [Debug|Release|...]]\n     [COMPONENT <component>]\n     [[PATTERN <pattern> | REGEX <regex>]\n     [EXCLUDE] [PERMISSIONS permissions...]] [...])\n\nINSTALL(DIRECTORY icons scripts/ DESTINATION share/myProj\n     PATTERN "CVS" EXCLUDE\n     PATTERN "scripts/*"\n     PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ\n     GROUP_EXECUTE GROUP_READ)\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    Install Demo

    find_package(Bar 2.0 REQUIRED)\nadd_library(Foo ...)\ntarget_link_libraries(Foo PRIVATE Bar::Bar)\n\ninstall(TARGETS Foo EXPORT FooTargets\n  LIBRARY DESTINATION lib\n  ARCHIVE DESTINATION lib\n  RUNTIME DESTINATION bin\n  INCLUDES DESTINATION include\n)\n\ninstall(EXPORT FooTargets\n  FILE FooTargets.cmake\n  NAMESPACE Foo::\n  DESTINATION lib/cmake/Foo\n)\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

    find packages

    find modules

    cmake –-help-module-list\nls /usr/share/cmake/Modules/\n\ncmake --help-module FindBZip2\n
    1
    2
    3
    4

    Basic Usage of Find

    project(helloWorld)\nadd_executable(helloWorld hello.c)\nfind_package (BZip2)\nif (BZIP2_FOUND)\n    include_directories(${BZIP_INCLUDE_DIRS})\n    target_link_libraries(helloWorld ${BZIP2_LIBRARIES})\nendif (BZIP2_FOUND)\n
    1
    2
    3
    4
    5
    6
    7
    find_path(Foo_INCLUDE_DIR foo.h)\nfind_library(Foo_LIBRARY foo)\nmark_as_advanced(Foo_INCLUDE_DIR Foo_LIBRARY)\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(Foo\n  REQUIRED_VARS Foo_LIBRARY Foo_INCLUDE_DIR\n)\n\nif(Foo_FOUND AND NOT TARGET Foo::Foo)\n  add_library(Foo::Foo UNKNOWN IMPORTED)\n  set_target_properties(Foo::Foo PROPERTIES\n    IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"\n    IMPORTED_LOCATION "${Foo_LIBRARY}"\n    INTERFACE_INCLUDE_DIRECTORIES "${Foo_INCLUDE_DIR}"\n  )\nendif()\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

    Find CMake

    Find.cmake: add find module for project

    # cmake/FindDEMO9LIB.cmake\n# 辅助输出信息\nmessage("now using FindDEMO9LIB.cmake find demo9 lib")\n\n# 将demo9.h文件路径赋值给DEMO9LIB_INCLUDE_DIR\nFIND_PATH(DEMO9LIB_INCLUDE_DIR demo9.h /usr/include/demo9/\n        /usr/local/demo9/include/)\nmessage("./h dir ${DEMO9LIB_INCLUDE_DIR}")\n\n# 将libDemo9_lib.a文件路径赋值给DEMO9LIB_LIBRARY\nFIND_LIBRARY(DEMO9LIB_LIBRARY libDemo9_lib.a /usr/local/demo9/lib/)\nmessage("lib dir: ${DEMO9LIB_LIBRARY}")\n\nif(DEMO9LIB_INCLUDE_DIR AND DEMO9LIB_LIBRARY)\n    # 设置变量结果\n    set(DEMO9LIB_FOUND TRUE)\nendif(DEMO9LIB_INCLUDE_DIR AND DEMO9LIB_LIBRARY)\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

    Full Find Demo

    # CMakeLists.txt\ncmake_minimum_required(VERSION 3.5)\n\nproject(demo9)\n\n# create libDemo9_lib.a\nset(SRC_LIB demo9.cpp)\nadd_library(demo9_lib STATIC ${SRC_LIB})\n\n# install it\ninstall(TARGETS demo9_lib DESTINATION demo9/lib)\ninstall(FILES demo9.h DESTINATION demo9/include)\n\n# create demo9_main executable\nset(SRC_EXE demo9_main.cpp)\n\n# set demo9_lib cmake module path\nset(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)\nmessage("cmake_module_path: ${CMAKE_MODULE_PATH}")\nfind_package(DEMO9LIB)\n\nif(DEMO9LIB_FOUND)\n    add_executable(demo9_main ${SRC_EXE})\n    message("found demo9 ${DEMO9LIB_INCLUDE_DIR} ${DEMO9LIB_LIBRARY}")\n    include_directories(${DEMO9LIB_INCLUDE_DIR})\n    target_link_libraries(demo9_main ${DEMO9LIB_LIBRARY})\nelse()\n    message("not found DEMO9LIB_FOUND")\nendif(DEMO9LIB_FOUND)\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29

    Useful Tools

    ldd and ar

    ldd library.so\nar -t library.a\n
    1
    2

    Makefile

    # -----------------------------------------------------------------------------\n# CMake project wrapper Makefile ----------------------------------------------\n# -----------------------------------------------------------------------------\n\nSHELL := /bin/bash\nRM    := rm -rf\nMKDIR := mkdir -p\n\nall: ./build/Makefile\n    @ $(MAKE) -C build\n\n./build/Makefile:\n    @  ($(MKDIR) build > /dev/null)\n    @  (cd build > /dev/null 2>&1 && cmake ..)\n\nclean:\n    @  ($(MKDIR) build > /dev/null)\n    @  (cd build > /dev/null 2>&1 && cmake .. > /dev/null 2>&1)\n    @- $(MAKE) --silent -C build clean || true\n    @- $(RM) ./build/Makefile\n    @- $(RM) ./build/src\n    @- $(RM) ./build/test\n    @- $(RM) ./build/CMake*\n    @- $(RM) ./build/cmake.*\n    @- $(RM) ./build/*.cmake\n    @- $(RM) ./build/*.txt\n\nifeq ($(findstring clean,$(MAKECMDGOALS)),)\n    $(MAKECMDGOALS): ./build/Makefile\n    @ $(MAKE) -C build $(MAKECMDGOALS)\nendif\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31

    Config Command

    Version Config

    cmake_minimum_required(VERSION 3.1)\n\nif(${CMAKE_VERSION} VERSION_LESS 3.13)\n  cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})\nelse()\n  cmake_policy(VERSION 3.13)\nendif()\n
    1
    2
    3
    4
    5
    6
    7

    Project Config

    project(MyProject VERSION 1.0 DESCRIPTION "Very nice project" LANGUAGES CXX)\n
    1

    Environment Config

    set(ENV{variable_name} value) and get $ENV{variable_name} environment variables

    Library for Clients Usage

    include(CMakePackageConfigHelpers)\nwrite_basic_package_version_file("FooConfigVersion.cmake"\n  VERSION ${Foo_VERSION}\n  COMPATIBILITY SameMajorVersion\n)\n\ninstall(FILES "FooConfig.cmake" "FooConfigVersion.cmake"\n  DESTINATION lib/cmake/Foo\n)\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    include(CMakeFindDependencyMacro)\nfind_dependency(Bar 2.0)\ninclude("${CMAKE_CURRENT_LIST_DIR}/FooTargets.cmake")\n
    1
    2
    3

    Test Setting

    set(CTEST_SOURCE_DIRECTORY "/source")\nset(CTEST_BINARY_DIRECTORY "/binary")\n\nset(ENV{CXXFLAGS} "--coverage")\nset(CTEST_CMAKE_GENERATOR "Ninja")\nset(CTEST_USE_LAUNCHERS 1)\n\nset(CTEST_COVERAGE_COMMAND "gcov")\nset(CTEST_MEMORYCHECK_COMMAND "valgrind")\n#set(CTEST_MEMORYCHECK_TYPE "ThreadSanitizer")\n\nctest_start("Continuous")\nctest_configure()\nctest_build()\nctest_test()\nctest_coverage()\nctest_memcheck()\nctest_submit()\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    macro(package_add_test TESTNAME)\n    add_executable(${TESTNAME} ${ARGN})\n    target_link_libraries(${TESTNAME} gtest gmock gtest_main)\n    add_test(${TESTNAME} COMMAND ${TESTNAME})\n    set_target_properties(${TESTNAME} PROPERTIES FOLDER tests)\nendmacro()\n\npackage_add_test(test1 test1.cpp)\n
    1
    2
    3
    4
    5
    6
    7
    8

    Generator Expression

    Most CMake commands happen at configure time, include the if statements seen above. Generator expressions were added at runtime. They are evaluated in target properties:

    • If you want to put a compile flag only for the DEBUG configuration
    • Limiting an item to a certain language only, such as CXX
    • Accessing configuration dependent properties, like target file location
    • Giving a different location for build and install directories
    target_include_directories(MyTarget PUBLIC\n  $<BUILD_INTERFACE:"${CMAKE_CURRENT_SOURCE_DIR}/include">\n  $<INSTALL_INTERFACE:include>\n)\n
    1
    2
    3
    4

    Submodule and Dependencies

    find_package(Git QUIET)\n\nif(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")\n  execute_process(COMMAND\n    ${GIT_EXECUTABLE} submodule update --init --recursive\n    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} RESULT_VARIABLE GIT_SUBMOD_RESULT\n  )\n\n  if(NOT GIT_SUBMOD_RESULT EQUAL "0")\n    message(FATAL_ERROR "git submodule update --init failed with ${GIT_SUBMOD_RESULT}")\n  endif()\nendif()\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    CMake Patterns

    Modern CMake

    Modern CMake is all about targets and properties.

    Constructors of Targets:

    • add_executable()
    • add_library()

    Member variables of Targets:

    • Target properties

    Member functions:

    • get_target_property()
    • set_target_properties()
    • get_property(TARGET)
    • set_property(TARGET)
    • target_compile_definitions()
    • target_compile_features()
    • target_compile_options()
    • target_include_directories()
    • target_link_libraries()
    • target_sources()

    Interface vs Private

    interface properties model usage requirements, whereas private properties model build requirements of targets.

    Nice Patterns

    • Think in targets (Object-Oriented)
    • Export your interface: You should be able to run from build or install
    • Write a Config.cmake file: This is what a library author should do to support clients
    • Make ALIAS targets to keep usage consistent
    • Combine common functionality into clearly documented functions
    • Use lowercase function names
    • Upper case is for variables
    • Use cmake_policy and/or range of versions

    Anti Patterns

    • Do not use global functions: e.g link_directories, include_libraries
    • Don't add unneeded PUBLIC requirements e.g -Wall
    • Don't GLOB files
    • Link to built files directly: Always link to targets if available
    • Never skip PUBLIC/PRIVATE when linking

    Makefile Notes

    Makefile Macro

    foo := a.o b.o c.o\nbar := $(foo:.o=.c)\nfirst_second = Hello\na = first\nb = second\nall = $($a_$b)\n
    1
    2
    3
    4
    5
    6

    这里的$a_$b 组成了 first_second, 于是, $(all)的值就是“Hello”。

    Built-in Makefile Macro

    • AR: 函数库打包程序。默认命令是“ar”
    • AS: 汇编语言编译程序。默认命令是“as”
    • CC: C 语言编译程序。默认命令是“cc”
    • CXX: C++语言编译程序。默认命令是“g++”
    • CO: 从 RCS 文件中扩展文件程序。默认命令是“co”
    • CPP: C 程序的预处理器(输出是标准输出设备)。默认命令是“$(CC) –E”
    • FC: Fortran 和 RatFor 的编译器和预处理程序。默认命令是“f77”
    • GET: 从 SCCS 文件中扩展文件的程序。默认命令是“get”。
    • LEX: Lex 方法分析器程序(针对于 C 或 RatFor)。默认命令是“lex”
    • PC: Pascal 语言编译程序。默认命令是“pc”
    • YACC: Yacc 文法分析器(针对于 C 程序)。默认命令是“yacc”
    • YACCR: Yacc 文法分析器(针对于 RatFor 程序)。默认命令是“yacc –r”
    • MAKEINFO: 转换 TexInfo 源文件(.texi)到 Info 文件程序。默认命令是“makeinfo”
    • TEX: 从 TeX 源文件创建 TeX DVI 文件的程序。默认命令是“tex”
    • TEXI2DVI: 从 TexInfo 源文件创建军 TeX DVI 文件的程序。默认命令是“texi2dvi”
    • WEAVE: 转换 Web 到 TeX 的程序。默认命令是“weave”
    • CWEAVE: 转换 C Web 到 TeX 的程序。默认命令是“cweave”
    • TANGLE: 转换 Web 到 Pascal 语言的程序。默认命令是“tangle”
    • CTANGLE: 转换 C Web 到 C。默认命令是“ctangle”
    • RM: 删除文件命令。默认命令是“rm –f”
    • ARFLAGS: 函数库打包程序 AR 命令的参数。默认值是“rv”
    • ASFLAGS: 汇编语言编译器参数。(当明显地调用“.s”或“.S”文件时)
    • CFLAGS: C 语言编译器参数
    • CXXFLAGS: C++语言编译器参数
    • COFLAGS: RCS 命令参数
    • CPPFLAGS: C 预处理器参数。( C 和 Fortran 编译器也会用到)
    • FFLAGS: Fortran 语言编译器参数
    • GFLAGS: SCCS “get”程序参数
    • LDFLAGS: 链接器参数。(如:“ld”)
    • LFLAGS: Lex 文法分析器参数
    • PFLAGS: Pascal 语言编译器参数
    • RFLAGS: RatFor 程序的 Fortran 编译器参数
    • YFLAGS: Yacc 文法分析器参数

    Built-in Makefile Variable

    • $@: 表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合
    • $%: 仅当目标是函数库文件中,表示规则中的目标成员名。 例如,如果一个目标是"foo.a(bar.o)",那么,"$%"就是"bar.o","$@"就是"foo.a"。 如果目标不是函数库文件(Unix 下是[.a],Windows 下是[.lib]),那么,其值为空
    • $<: 依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的, 那么"$<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的
    • $?: 所有比目标新的依赖目标的集合。以空格分隔
    • $^: 所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份
    • $+: 这个变量很像"$^",也是所有依赖目标的集合。只是它不去除重复的依赖目标
    • $* : 这个变量表示目标模式中"%"及其之前的部分。如果目标是"dir/a.foo.b", 并且目标的模式是a.%.b,那么, $*的值就是dir/a.foo。这个变量对于构造有关联的文件名是比较有较。如果目标中没有模式的定义,那么$*也就不能被推导出, 但是,如果目标文件的后缀是 make 所识别的,那么$*就是除了后缀的那一部分。例如:如果目标是foo.c, 因为".c"是 make 所能识别的后缀名,所以,$*的值就是"foo"。这个特性是 GNU make 的, 很有可能不兼容于其它版本的 make, 所以,你应该尽量避免使用$*, 除非是在隐含规则或是静态模式中。 如果目标中的后缀是 make 所不能识别的,那么$*就是空值
    • $(@D): 表示"$@"的目录部分(不以斜杠作为结尾), 如果"$@"值是"dir/foo.o",那么"$(@D)"就是"dir", 而如果"$@"中没有包含斜杠的话,其值就是"."(当前目录)
    • $(@F): 表示"$@"的文件部分,如果"$@"值是"dir/foo.o",那么"$(@F)"就是"foo.o", "$(@F)"相当于函数"$(notdir $@)"
    • $(*D)"/"$(*F): 和上面所述的同理,也是取文件的目录部分和文件部分。对于上面的那个例子,$(*D)返回"dir",而$(*F)返回"foo"
    • "$(%D)"/"$(%F)": 分别表示了函数包文件成员的目录部分和文件部分。 这对于形同"archive(member)"形式的目标中的"member"中包含了不同的目录很有用。
    • "$(<D)"/"$(<F)": 分别表示依赖文件的目录部分和文件部分。
    • "$(^D)"/"$(^F)": 分别表示所有依赖文件的目录部分和文件部分。(无相同的)
    • "$(+D)"/"$(+F)": 分别表示所有依赖文件的目录部分和文件部分。(可以有相同的)
    • "$(?D)"/"$(?F)": 分别表示被更新的依赖文件的目录部分和文件部分。

    Makefile Inexplicit Rules

    Makefile C Rules

    <n>.o的目标的依赖目标会自动推导为<n>.c,并且其生成命令是“$(CC) –c $(CPPFLAGS) $(CFLAGS)”

    Makefile C++ Rules

    <n>.o的目标的依赖目标会自动推导为<n>.cc或是<n>.C, 并且其生成命令是$(CXX) –c $(CPPFLAGS) \\$(CFLAGS) (建议使用.cc作为 C++源文件的后缀,而不是.C).

    Makefile ASM Rules

    <n>.o 的目标的依赖目标会自动推导为<n>.s,默认使用编译品“as”,并且其生成命令是:“$(AS) $(ASFLAGS)”。 <n>.s 的目标的依赖目标会自动推导为<n>.S,默认使用 C 预编译器“cpp”,并且其生成命令是:“$(AS) $(ASFLAGS)”。

    Makefile Object Linking

    <n>目标依赖于<n>.o,通过运行 C 的编译器来运行链接程序生成(一般是“ld”),其生成命令是: $(CC) $(LDFLAGS) <n>.o $(LOADLIBES) $(LDLIBS) 这个规则对于只有一个源文件的工程有效,同时也对多个 Object 文件(由不同的源文件生成)的也有效。例如如下规则:

    x : y.o z.o

    并且“x.c”、“y.c”和“z.c”都存在时,隐含规则将执行如下命令:

    cc -c x.c -o x.o cc -c y.c -o y.o cc -c z.c -o z.o cc x.o y.o z.o -o x rm -f x.o rm -f y.o rm -f z.o

    Makefile Function

    • filter
    • shell
    • subst
    • wildcard

    Makefile Best Practice

    $(filter %.o,$(files)): %.o: %.c\n$(filter %.elc,$(files)): %.elc: %.el\n
    1
    2
    $(CC) -c $(CFLAGS) $< -o $@\n
    1
    (%.o) : %.c\n$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $*.o\n$(AR) r $@ $*.o\n$(RM) $*.o\n
    1
    2
    3
    4
    %.d: %.c\n@set -e; rm -f $@; /\n$(CC) -M $(CPPFLAGS) $< > $@.$$$$; /\nsed 's,/($*/)/.o[ :]*,/1.o $@ : ,g' < $@.$$$$ > $@; /\n$(RM) -f $@.$$$$\n
    1
    2
    3
    4
    5

    Reference

    ',139);p.render=function(a,e,p,l,o,c){return n(),s("div",null,[t])};export default p;export{e as __pageData}; diff --git a/assets/programming_tools_buildTools_CMakeBasicNotes.md.c21de6b5.lean.js b/assets/programming_tools_buildTools_CMakeBasicNotes.md.c21de6b5.lean.js new file mode 100644 index 00000000000..ea0a709d1d8 --- /dev/null +++ b/assets/programming_tools_buildTools_CMakeBasicNotes.md.c21de6b5.lean.js @@ -0,0 +1 @@ +import{o as n,c as s,a}from"./app.6dd2a1b7.js";const e='{"title":"CMake Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Basic Build System","slug":"basic-build-system"},{"level":3,"title":"Basic Options","slug":"basic-options"},{"level":2,"title":"Flow Control","slug":"flow-control"},{"level":3,"title":"if control","slug":"if-control"},{"level":3,"title":"foreach control","slug":"foreach-control"},{"level":3,"title":"while control","slug":"while-control"},{"level":3,"title":"function control","slug":"function-control"},{"level":2,"title":"Useful Command","slug":"useful-command"},{"level":3,"title":"Checking Command","slug":"checking-command"},{"level":3,"title":"Testing Command","slug":"testing-command"},{"level":3,"title":"Option Command","slug":"option-command"},{"level":3,"title":"Math Command","slug":"math-command"},{"level":3,"title":"List Command","slug":"list-command"},{"level":3,"title":"Package Command","slug":"package-command"},{"level":3,"title":"Install Command","slug":"install-command"},{"level":3,"title":"find packages","slug":"find-packages"},{"level":2,"title":"Useful Tools","slug":"useful-tools"},{"level":2,"title":"Config Command","slug":"config-command"},{"level":3,"title":"Version Config","slug":"version-config"},{"level":3,"title":"Project Config","slug":"project-config"},{"level":3,"title":"Environment Config","slug":"environment-config"},{"level":3,"title":"Library for Clients Usage","slug":"library-for-clients-usage"},{"level":2,"title":"Test Setting","slug":"test-setting"},{"level":2,"title":"Generator Expression","slug":"generator-expression"},{"level":2,"title":"Submodule and Dependencies","slug":"submodule-and-dependencies"},{"level":2,"title":"CMake Patterns","slug":"cmake-patterns"},{"level":3,"title":"Modern CMake","slug":"modern-cmake"},{"level":3,"title":"Nice Patterns","slug":"nice-patterns"},{"level":3,"title":"Anti Patterns","slug":"anti-patterns"},{"level":2,"title":"Makefile Notes","slug":"makefile-notes"},{"level":3,"title":"Makefile Macro","slug":"makefile-macro"},{"level":3,"title":"Built-in Makefile Variable","slug":"built-in-makefile-variable"},{"level":3,"title":"Makefile Inexplicit Rules","slug":"makefile-inexplicit-rules"},{"level":3,"title":"Makefile Function","slug":"makefile-function"},{"level":3,"title":"Makefile Best Practice","slug":"makefile-best-practice"},{"level":2,"title":"Reference","slug":"reference"}],"relativePath":"programming/tools/buildTools/CMakeBasicNotes.md","lastUpdated":1627196177000}',p={},t=a('',139);p.render=function(a,e,p,l,o,c){return n(),s("div",null,[t])};export default p;export{e as __pageData}; diff --git a/assets/programming_tools_git_gitBasicNotes.md.abd5ba70.js b/assets/programming_tools_git_gitBasicNotes.md.abd5ba70.js new file mode 100644 index 00000000000..07d85e20c30 --- /dev/null +++ b/assets/programming_tools_git_gitBasicNotes.md.abd5ba70.js @@ -0,0 +1 @@ +import{o as n,c as e,b as s,d as a}from"./app.6dd2a1b7.js";const l='{"title":"Git Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Git Configuration","slug":"git-configuration"},{"level":3,"title":"Basic Configuration","slug":"basic-configuration"},{"level":3,"title":"Proxy Configuration","slug":"proxy-configuration"},{"level":3,"title":"List and Help","slug":"list-and-help"},{"level":2,"title":"File State","slug":"file-state"},{"level":2,"title":"Git Ignore File","slug":"git-ignore-file"},{"level":2,"title":"Diff","slug":"diff"},{"level":2,"title":"Add","slug":"add"},{"level":2,"title":"Commit","slug":"commit"},{"level":3,"title":"Commit Style Guide","slug":"commit-style-guide"},{"level":2,"title":"Stash","slug":"stash"},{"level":2,"title":"Revert","slug":"revert"},{"level":2,"title":"Remove","slug":"remove"},{"level":2,"title":"Move","slug":"move"},{"level":2,"title":"Log","slug":"log"},{"level":3,"title":"Pretty Format","slug":"pretty-format"},{"level":3,"title":"Log Options","slug":"log-options"},{"level":2,"title":"Reflog","slug":"reflog"},{"level":2,"title":"Show","slug":"show"},{"level":2,"title":"Remote","slug":"remote"},{"level":2,"title":"Tag","slug":"tag"},{"level":2,"title":"Alias","slug":"alias"},{"level":2,"title":"Merge","slug":"merge"},{"level":2,"title":"Rebase","slug":"rebase"},{"level":2,"title":"Branch","slug":"branch"},{"level":3,"title":"Basic Workflow Commands","slug":"basic-workflow-commands"},{"level":3,"title":"Advanced Branch Workflow","slug":"advanced-branch-workflow"},{"level":2,"title":"Git Inside","slug":"git-inside"},{"level":3,"title":"Add Inside","slug":"add-inside"},{"level":3,"title":"Commit Inside","slug":"commit-inside"},{"level":3,"title":"Checkout Inside","slug":"checkout-inside"},{"level":3,"title":"Merge Inside","slug":"merge-inside"},{"level":3,"title":"Fetch Inside","slug":"fetch-inside"},{"level":3,"title":"Clone Inside","slug":"clone-inside"},{"level":3,"title":"Push Inside","slug":"push-inside"},{"level":3,"title":"HEAD Branch Inside","slug":"head-branch-inside"},{"level":3,"title":"Git Objects","slug":"git-objects"},{"level":2,"title":"GitHub","slug":"github"},{"level":3,"title":"GPG Usage","slug":"gpg-usage"},{"level":3,"title":"LICENSE","slug":"license"},{"level":3,"title":"Teamwork","slug":"teamwork"},{"level":3,"title":"GitHub CLI Tool","slug":"github-cli-tool"},{"level":3,"title":"Wiki","slug":"wiki"},{"level":3,"title":"Shorten GitHub URL","slug":"shorten-github-url"},{"level":3,"title":"GitHub Flavored Markdown","slug":"github-flavored-markdown"},{"level":3,"title":"GitHub Pages","slug":"github-pages"},{"level":2,"title":"Git Tools","slug":"git-tools"},{"level":3,"title":"Diff and Patch","slug":"diff-and-patch"},{"level":3,"title":"Semantic Git Commit Message","slug":"semantic-git-commit-message"},{"level":3,"title":"Changelog Generator","slug":"changelog-generator"},{"level":3,"title":"Purge Tool","slug":"purge-tool"},{"level":2,"title":"Commands List","slug":"commands-list"},{"level":3,"title":"Basic Commands","slug":"basic-commands"},{"level":3,"title":"检查与比较","slug":"检查与比较"},{"level":3,"title":"调试","slug":"调试"},{"level":3,"title":"补丁","slug":"补丁"},{"level":3,"title":"邮件","slug":"邮件"},{"level":3,"title":"外部系统","slug":"外部系统"},{"level":3,"title":"管理","slug":"管理"}],"relativePath":"programming/tools/git/gitBasicNotes.md","lastUpdated":1627953616000}',t={},i=s("h1",{id:"git-basic-notes"},[s("a",{class:"header-anchor",href:"#git-basic-notes","aria-hidden":"true"},"#"),a(" Git Basic Notes")],-1),r=s("p",null,[s("div",{class:"table-of-contents"},[s("ul",null,[s("li",null,[s("a",{href:"#git-basic-notes"},"Git Basic Notes"),s("ul",null,[s("li",null,[s("a",{href:"#git-configuration"},"Git Configuration")]),s("li",null,[s("a",{href:"#file-state"},"File State")]),s("li",null,[s("a",{href:"#git-ignore-file"},"Git Ignore File")]),s("li",null,[s("a",{href:"#diff"},"Diff")]),s("li",null,[s("a",{href:"#add"},"Add")]),s("li",null,[s("a",{href:"#commit"},"Commit")]),s("li",null,[s("a",{href:"#stash"},"Stash")]),s("li",null,[s("a",{href:"#revert"},"Revert")]),s("li",null,[s("a",{href:"#remove"},"Remove")]),s("li",null,[s("a",{href:"#move"},"Move")]),s("li",null,[s("a",{href:"#log"},"Log")]),s("li",null,[s("a",{href:"#reflog"},"Reflog")]),s("li",null,[s("a",{href:"#show"},"Show")]),s("li",null,[s("a",{href:"#remote"},"Remote")]),s("li",null,[s("a",{href:"#tag"},"Tag")]),s("li",null,[s("a",{href:"#alias"},"Alias")]),s("li",null,[s("a",{href:"#merge"},"Merge")]),s("li",null,[s("a",{href:"#rebase"},"Rebase")]),s("li",null,[s("a",{href:"#branch"},"Branch")]),s("li",null,[s("a",{href:"#git-inside"},"Git Inside")]),s("li",null,[s("a",{href:"#github"},"GitHub")]),s("li",null,[s("a",{href:"#git-tools"},"Git Tools")]),s("li",null,[s("a",{href:"#commands-list"},"Commands List")])])])])])],-1),o=s("h2",{id:"git-configuration"},[s("a",{class:"header-anchor",href:"#git-configuration","aria-hidden":"true"},"#"),a(" Git Configuration")],-1),c=s("ul",null,[s("li",null,"/etc/gitconfig"),s("li",null,"~/.gitconfig 或 ~/.config/git/config"),s("li",null,"repo/.git/config")],-1),u=s("h3",{id:"basic-configuration"},[s("a",{class:"header-anchor",href:"#basic-configuration","aria-hidden":"true"},"#"),a(" Basic Configuration")],-1),p=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" config --global user.name "),s("span",{class:"token string"},'"sabertazimi"'),a("\n"),s("span",{class:"token function"},"git"),a(" config --global user.email sabertazimi@gmail.com\n"),s("span",{class:"token function"},"git"),a(" config --global core.editor "),s("span",{class:"token function"},"vim"),a("\n"),s("span",{class:"token function"},"git"),a(" config --global credential.helper store\n"),s("span",{class:"token function"},"git"),a(" config --global color.ui "),s("span",{class:"token boolean"},"true"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br")])],-1),b=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" config --global commit.template "),s("span",{class:"token environment constant"},"$HOME"),a("/.GitCommit.md\n"),s("span",{class:"token function"},"git"),a(" config --global commit.gpgsign "),s("span",{class:"token boolean"},"true"),a("\n"),s("span",{class:"token function"},"git"),a(" config --global user.signingkey "),s("span",{class:"token operator"},"<"),a("pub-keyID"),s("span",{class:"token operator"},">"),a("\n\n"),s("span",{class:"token function"},"git"),a(" config --global push.default simple\n"),s("span",{class:"token function"},"git"),a(" config --global merge.conflictstyle "),s("span",{class:"token function"},"diff3"),a("\n"),s("span",{class:"token function"},"git"),a(" config --global pull.rebase "),s("span",{class:"token boolean"},"true"),a("\n"),s("span",{class:"token function"},"git"),a(" config --global rebase.autoStash "),s("span",{class:"token boolean"},"true"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br")])],-1),d=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token comment"},"# after 1s, git auto correct wrong command"),a("\n"),s("span",{class:"token function"},"git"),a(" config --global help.autocorrect "),s("span",{class:"token number"},"10"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),m=s("h3",{id:"proxy-configuration"},[s("a",{class:"header-anchor",href:"#proxy-configuration","aria-hidden":"true"},"#"),a(" Proxy Configuration")],-1),h=s("ul",null,[s("li",null,[s("a",{href:"http://github.com.cnpmjs.org",target:"_blank",rel:"noopener noreferrer"},"github.com.cnpmjs.org")]),s("li",null,[s("a",{href:"http://hub.fastgit.org",target:"_blank",rel:"noopener noreferrer"},"hub.fastgit.org")]),s("li",null,[s("a",{href:"http://raw.fastgit.org",target:"_blank",rel:"noopener noreferrer"},"raw.fastgit.org")])],-1),g=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token comment"},"# speed up by cnpmjs"),a("\n"),s("span",{class:"token comment"},"# git clone/push/pull works"),a("\n"),s("span",{class:"token function"},"git"),a(" config --global url."),s("span",{class:"token string"},'"https://github.com.cnpmjs.org/"'),a(".insteadOf "),s("span",{class:"token string"},'"https://github.com/"'),a("\n\n"),s("span",{class:"token comment"},"# post buffer config"),a("\n"),s("span",{class:"token function"},"git"),a(" config --global http.postbuffer "),s("span",{class:"token number"},"524288000"),a("\n"),s("span",{class:"token function"},"git"),a(" config --global http.postbuffer "),s("span",{class:"token number"},"1048576000"),a("\n\n"),s("span",{class:"token comment"},"# proxy"),a("\n"),s("span",{class:"token function"},"git"),a(" config --global http.proxy "),s("span",{class:"token string"},"'socks5://127.0.0.1:1080'"),a("\n"),s("span",{class:"token function"},"git"),a(" config --global https.proxy "),s("span",{class:"token string"},"'socks5://127.0.0.1:1080'"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br"),s("span",{class:"line-number"},"9"),s("br"),s("span",{class:"line-number"},"10"),s("br"),s("span",{class:"line-number"},"11"),s("br")])],-1),k=s("h3",{id:"list-and-help"},[s("a",{class:"header-anchor",href:"#list-and-help","aria-hidden":"true"},"#"),a(" List and Help")],-1),f=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" config --list\n"),s("span",{class:"token function"},"git"),a(" --help\n"),s("span",{class:"token function"},"man"),a(" git-\n"),s("span",{class:"token function"},"git"),a(),s("span",{class:"token builtin class-name"},"help"),a("\n"),s("span",{class:"token function"},"git"),a(),s("span",{class:"token builtin class-name"},"help"),a(" config\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br")])],-1),v=s("h2",{id:"file-state"},[s("a",{class:"header-anchor",href:"#file-state","aria-hidden":"true"},"#"),a(" File State")],-1),w=s("ul",null,[s("li",null,"Untracked"),s("li",null,[a("Unmodified("),s("strong",null,"Stable State"),a(")")]),s("li",null,"Modified"),s("li",null,"Staged")],-1),y=s("h2",{id:"git-ignore-file"},[s("a",{class:"header-anchor",href:"#git-ignore-file","aria-hidden":"true"},"#"),a(" Git Ignore File")],-1),x=s("p",null,"文件 .gitignore 的格式规范如下:",-1),C=s("ul",null,[s("li",null,"所有空行或者以 # 开头的行都会被 Git 忽略"),s("li",null,"可以使用标准的 glob 模式(简化正则表达式)匹配"),s("li",null,"匹配模式可以以( / )开头防止递归"),s("li",null,"匹配模式可以以( / )结尾指定目录"),s("li",null,"要跟踪指定模式以外的文件或目录,可以在模式前加上惊叹号( ! )取反"),s("li",null,[s("a",{href:"https://github.com/github/gitignore",target:"_blank",rel:"noopener noreferrer"},"GitHub gitignore Style")])],-1),A=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token comment"},"# no .a files"),a("\n*.a\n\n"),s("span",{class:"token comment"},"# but do track lib.a, even though you're ignoring .a files above"),a("\n"),s("span",{class:"token operator"},"!"),a("lib.a\n\n"),s("span",{class:"token comment"},"# only ignore the TODO file in the current directory, not subDir/TODO"),a("\n/TODO\n\n"),s("span",{class:"token comment"},"# ignore all files in the build/ directory"),a("\nbuild/\n\n"),s("span",{class:"token comment"},"# ignore doc/notes.txt, but not doc/server/arch.txt"),a("\ndoc/*.txt\n\n"),s("span",{class:"token comment"},"# ignore all .pdf files in the doc/ directory"),a("\ndoc/**/*.pdf\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br"),s("span",{class:"line-number"},"9"),s("br"),s("span",{class:"line-number"},"10"),s("br"),s("span",{class:"line-number"},"11"),s("br"),s("span",{class:"line-number"},"12"),s("br"),s("span",{class:"line-number"},"13"),s("br"),s("span",{class:"line-number"},"14"),s("br"),s("span",{class:"line-number"},"15"),s("br"),s("span",{class:"line-number"},"16"),s("br"),s("span",{class:"line-number"},"17"),s("br")])],-1),G=s("h2",{id:"diff"},[s("a",{class:"header-anchor",href:"#diff","aria-hidden":"true"},"#"),a(" Diff")],-1),I=s("p",null,"查看未暂存(un-staged)差异",-1),E=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(),s("span",{class:"token function"},"diff"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),T=s("p",null,"查看已暂存(staged)差异",-1),N=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(),s("span",{class:"token function"},"diff"),a(" --staged\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),O=s("p",null,"显示空白字符错误(space/tab/return)",-1),R=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(),s("span",{class:"token function"},"diff"),a(" --check\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),S=s("h2",{id:"add"},[s("a",{class:"header-anchor",href:"#add","aria-hidden":"true"},"#"),a(" Add")],-1),H=s("ul",null,[s("li",null,"交互式的选择 add 特定部分")],-1),L=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(),s("span",{class:"token function"},"add"),a(" -p\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),j=s("h2",{id:"commit"},[s("a",{class:"header-anchor",href:"#commit","aria-hidden":"true"},"#"),a(" Commit")],-1),D=s("ul",null,[s("li",null,"-a: 跳过暂存阶段(git add)"),s("li",null,"-v: 显示详细 diff 信息")],-1),P=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" commit -a -v\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),B=s("p",null,"重新提交",-1),_=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" commit --amend -a -v\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),M=s("h3",{id:"commit-style-guide"},[s("a",{class:"header-anchor",href:"#commit-style-guide","aria-hidden":"true"},"#"),a(" Commit Style Guide")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/conventional-commits/conventionalcommits.org",target:"_blank",rel:"noopener noreferrer"},"Conventional Commits Specification")]),s("li",null,[s("a",{href:"https://github.com/conventional-changelog/commitlint",target:"_blank",rel:"noopener noreferrer"},"Commit Lint")]),s("li",null,[s("a",{href:"https://github.com/commitizen/cz-cli",target:"_blank",rel:"noopener noreferrer"},"Commitizen: Conventional commits CLI tool")]),s("li",null,[s("a",{href:"https://github.com/conventional-changelog/standard-version",target:"_blank",rel:"noopener noreferrer"},"Standard Version: Automate versioning and CHANGELOG generation")])],-1),U=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"npm"),a(" i -D standard-version\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),$=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,"npx commitizen init cz-conventional-changelog --save-dev --save-exact\n")]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),q=s("div",{class:"language-md line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token tag"},[s("span",{class:"token tag"},[s("span",{class:"token punctuation"},"<"),a("type")]),s("span",{class:"token punctuation"},">")]),a("("),s("span",{class:"token tag"},[s("span",{class:"token tag"},[s("span",{class:"token punctuation"},"<"),a("scope")]),s("span",{class:"token punctuation"},">")]),a("): "),s("span",{class:"token tag"},[s("span",{class:"token tag"},[s("span",{class:"token punctuation"},"<"),a("subject")]),s("span",{class:"token punctuation"},">")]),a("\n(emptyLine)\n\n"),s("span",{class:"token tag"},[s("span",{class:"token tag"},[s("span",{class:"token punctuation"},"<"),a("body")]),s("span",{class:"token punctuation"},">")]),a("\n (emptyLine)\n"),s("span",{class:"token tag"},[s("span",{class:"token tag"},[s("span",{class:"token punctuation"},"<"),a("footer")]),s("span",{class:"token punctuation"},">")]),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br")])],-1),z=s("h4",{id:"message-subject"},[s("a",{class:"header-anchor",href:"#message-subject","aria-hidden":"true"},"#"),a(" Message Subject")],-1),W=s("p",null,"no more than 50 characters",-1),Y=s("h4",{id:"commit-type"},[s("a",{class:"header-anchor",href:"#commit-type","aria-hidden":"true"},"#"),a(" Commit Type")],-1),V=s("ul",null,[s("li",null,"feat: 新增了一个功能 (MINOR Version)."),s("li",null,"fix: 修复了一个 bug (PATCH Version)."),s("li",null,"docs: 只是更改文档."),s("li",null,"style: 不影响代码含义的变化 (空白、格式化、缺少分号等)."),s("li",null,"refactor: 代码重构, 既不修复错误也不添加功能."),s("li",null,"perf: 改进性能的代码更改."),s("li",null,"test: 添加确实测试或更正现有的测试."),s("li",null,"build: 影响构建系统或外部依赖关系的更改 (示例范围: gulp, broccoli, NPM)."),s("li",null,"ci: 更改持续集成文件和脚本 (示例范围: Travis, Circle, BrowserStack, SauceLabs)."),s("li",null,[a("chore: 其他不修改 src 或 test 文件 e.g "),s("code",null,"chore(release)"),a(".")]),s("li",null,"revert: commit 回退.")],-1),K=s("h4",{id:"scope-values"},[s("a",{class:"header-anchor",href:"#scope-values","aria-hidden":"true"},"#"),a(" Scope Values")],-1),J=s("ul",null,[s("li",null,"init"),s("li",null,"runner"),s("li",null,"watcher"),s("li",null,"config"),s("li",null,"web-server"),s("li",null,"proxy"),s("li",null,"empty")],-1),X=s("h4",{id:"message-body"},[s("a",{class:"header-anchor",href:"#message-body","aria-hidden":"true"},"#"),a(" Message Body")],-1),Q=s("ul",null,[s("li",null,"uses the imperative, present tense: “change” not “changed” nor “changes”"),s("li",null,[a("includes "),s("strong",null,"motivation"),a(" for the change and contrasts with previous behavior")])],-1),Z=s("h4",{id:"message-footer"},[s("a",{class:"header-anchor",href:"#message-footer","aria-hidden":"true"},"#"),a(" Message Footer")],-1),nn=s("ul",null,[s("li",null,"referencing issues e.g. close #666, #888"),s("li",null,[a("BREAKING CHANGE ("),s("code",null,"!"),a(") (MAJOR Version) e.g."),s("code",null,"port-runner"),a(" command line option has changed to "),s("code",null,"runner-port"),a(", so that it is consistent with the configuration file syntax. To migrate your project, change all the commands, where you use "),s("code",null,"--port-runner"),a(" to "),s("code",null,"--runner-port"),a(".")])],-1),en=s("h2",{id:"stash"},[s("a",{class:"header-anchor",href:"#stash","aria-hidden":"true"},"#"),a(" Stash")],-1),sn=s("ul",null,[s("li",null,"git stash: 备份当前的工作区的内容,将当前的工作区内容保存到 Git 栈"),s("li",null,"git stash apply/pop: 从 Git 栈中读取最近一次保存的内容,恢复工作区的相关内容"),s("li",null,[a("git stash branch "),s("code",null,""),a(": 新建分支,并在该分支上恢复储藏内容")]),s("li",null,"git stash list: 显示 Git 栈内的所有备份"),s("li",null,"git stash clear: 清空 Git 栈")],-1),an=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token comment"},"# git stash popup"),a("\n"),s("span",{class:"token function"},"git"),a(" stash show -p stash@"),s("span",{class:"token punctuation"},"{"),s("span",{class:"token number"},"0"),s("span",{class:"token punctuation"},"}"),a(),s("span",{class:"token operator"},"|"),a(),s("span",{class:"token function"},"git"),a(" apply -R\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),ln=s("p",null,"Pop a single file:",-1),tn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" restore -s stash@"),s("span",{class:"token punctuation"},"{"),s("span",{class:"token number"},"0"),s("span",{class:"token punctuation"},"}"),a(" -- "),s("span",{class:"token operator"},"<"),a("filename"),s("span",{class:"token operator"},">"),a("\n"),s("span",{class:"token function"},"git"),a(" checkout stash@"),s("span",{class:"token punctuation"},"{"),s("span",{class:"token number"},"0"),s("span",{class:"token punctuation"},"}"),a(" -- "),s("span",{class:"token operator"},"<"),a("filename"),s("span",{class:"token operator"},">"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),rn=s("h2",{id:"revert"},[s("a",{class:"header-anchor",href:"#revert","aria-hidden":"true"},"#"),a(" Revert")],-1),on=s("ul",null,[s("li",null,"重新提交前 n 次的 commit")],-1),cn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" revert -n\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),un=s("h2",{id:"remove"},[s("a",{class:"header-anchor",href:"#remove","aria-hidden":"true"},"#"),a(" Remove")],-1),pn=s("p",null,"完全删除文件",-1),bn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(),s("span",{class:"token function"},"rm"),a(" filename\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),dn=s("p",null,"--cached: 保留磁盘文件(仅从 git 库移除文件)",-1),mn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(),s("span",{class:"token function"},"rm"),a(" --cached filename\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),hn=s("h2",{id:"move"},[s("a",{class:"header-anchor",href:"#move","aria-hidden":"true"},"#"),a(" Move")],-1),gn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(),s("span",{class:"token function"},"mv"),a(" old_path new_path\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),kn=s("h2",{id:"log"},[s("a",{class:"header-anchor",href:"#log","aria-hidden":"true"},"#"),a(" Log")],-1),fn=s("ul",null,[s("li",null,"-p: 打印 diff 差异信息"),s("li",null,"-n: n 为十进制数字,显示最近 n 次信息"),s("li",null,"--stat: 打印简略统计信息"),s("li",null,"--graph: 显示分支合并历史"),s("li",null,"--pretty=: 设置日志格式"),s("li",null,"--author=: 指定作者"),s("li",null,"--committer=: 指定提交者"),s("li",null,"--after=/--since=: 限制日志时间"),s("li",null,'--before=/--until=: 限制日志时间 "2008-01-15" "2 years 1 day 3 minutes ago"'),s("li",null,"--decorate: 查看各个分支当前所指的对象(commit object)"),s("li",null,"--help")],-1),vn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" log -p --stat --graph --pretty"),s("span",{class:"token operator"},"="),a("format:"),s("span",{class:"token string"},'"%h - %an, %ar : %s"'),a(" --since"),s("span",{class:"token operator"},"="),s("span",{class:"token number"},"2"),a(".weeks path_name\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),wn=s("h3",{id:"pretty-format"},[s("a",{class:"header-anchor",href:"#pretty-format","aria-hidden":"true"},"#"),a(" Pretty Format")],-1),yn=s("table",null,[s("thead",null,[s("tr",null,[s("th",{style:{"text-align":"left"}},"选项"),s("th",{style:{"text-align":"left"}},"说明")])]),s("tbody",null,[s("tr",null,[s("td",{style:{"text-align":"left"}},"%H"),s("td",{style:{"text-align":"left"}},"提交对象(commit)的完整哈希字串")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%h"),s("td",{style:{"text-align":"left"}},"提交对象的简短哈希字串")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%T"),s("td",{style:{"text-align":"left"}},"树对象(tree)的完整哈希字串")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%t"),s("td",{style:{"text-align":"left"}},"树对象的简短哈希字串")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%P"),s("td",{style:{"text-align":"left"}},"父对象(parent)的完整哈希字串")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%p"),s("td",{style:{"text-align":"left"}},"父对象的简短哈希字串")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%an"),s("td",{style:{"text-align":"left"}},"作者(author)的名字")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%ae"),s("td",{style:{"text-align":"left"}},"作者的电子邮件地址")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%ad"),s("td",{style:{"text-align":"left"}},"作者修订日期 (可以用|-date=|选项定制格式)")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%at"),s("td",{style:{"text-align":"left"}},"作者修订日期 (ms)")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%ar"),s("td",{style:{"text-align":"left"}},"作者修订日期,按多久以前的方式显示")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%cn"),s("td",{style:{"text-align":"left"}},"提交者(committer)的名字")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%ce"),s("td",{style:{"text-align":"left"}},"提交者的电子邮件地址")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%cd"),s("td",{style:{"text-align":"left"}},"提交日期")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%cr"),s("td",{style:{"text-align":"left"}},"提交日期,按多久以前的方式显示")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%s"),s("td",{style:{"text-align":"left"}},"提交说明")])])],-1),xn=s("h3",{id:"log-options"},[s("a",{class:"header-anchor",href:"#log-options","aria-hidden":"true"},"#"),a(" Log Options")],-1),Cn=s("table",null,[s("thead",null,[s("tr",null,[s("th",{style:{"text-align":"left"}},"选项"),s("th",{style:{"text-align":"left"}},"说明")])]),s("tbody",null,[s("tr",null,[s("td",{style:{"text-align":"left"}},"-p"),s("td",{style:{"text-align":"left"}},"打印 diff 差异信息")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"-n"),s("td",{style:{"text-align":"left"}},"n 为十进制数字,显示最近 n 次信息")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"--stat"),s("td",{style:{"text-align":"left"}},"打印简略统计信息")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"--graph"),s("td",{style:{"text-align":"left"}},"显示分支合并历史")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"--pretty="),s("td",{style:{"text-align":"left"}},"设置日志格式")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"--author="),s("td",{style:{"text-align":"left"}},"指定作者")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"--committer="),s("td",{style:{"text-align":"left"}},"指定提交者")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"--after=/--since="),s("td",{style:{"text-align":"left"}},"限制日志时间")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"--before=/--until="),s("td",{style:{"text-align":"left"}},'限制日志时间 "2008-01-15" "2 years 1 day 3 minutes ago"')]),s("tr",null,[s("td",{style:{"text-align":"left"}},"--help"),s("td",{style:{"text-align":"left"}})])])],-1),An=s("h2",{id:"reflog"},[s("a",{class:"header-anchor",href:"#reflog","aria-hidden":"true"},"#"),a(" Reflog")],-1),Gn=s("p",null,[s("code",null,"git reflog show"),a(" is an alias for "),s("code",null,"git log -g --abbrev-commit --pretty=oneline"),a(".")],-1),In=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" reflog\n"),s("span",{class:"token function"},"git"),a(" reset HEAD@"),s("span",{class:"token punctuation"},"{"),a("index"),s("span",{class:"token punctuation"},"}"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),En=s("h2",{id:"show"},[s("a",{class:"header-anchor",href:"#show","aria-hidden":"true"},"#"),a(" Show")],-1),Tn=s("ul",null,[s("li",null,"查看其他分支 或 提交点的文件状态")],-1),Nn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" show branchName/commitHash:fileName\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),On=s("h2",{id:"remote"},[s("a",{class:"header-anchor",href:"#remote","aria-hidden":"true"},"#"),a(" Remote")],-1),Rn=s("p",null,"添加与删除远程仓库源",-1),Sn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" remote "),s("span",{class:"token function"},"add"),a(),s("span",{class:"token operator"},"<"),a("shortname"),s("span",{class:"token operator"},">"),a(),s("span",{class:"token operator"},"<"),a("remote-url"),s("span",{class:"token operator"},">"),a("\n"),s("span",{class:"token function"},"git"),a(" remote "),s("span",{class:"token function"},"rm"),a(),s("span",{class:"token operator"},"<"),a("shortname"),s("span",{class:"token operator"},">"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),Hn=s("p",null,"拉取和推送变更",-1),Ln=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" pull "),s("span",{class:"token punctuation"},"["),a("remote-name"),s("span",{class:"token punctuation"},"]"),a("\n"),s("span",{class:"token function"},"git"),a(" push "),s("span",{class:"token punctuation"},"["),a("remote-name"),s("span",{class:"token punctuation"},"]"),a(),s("span",{class:"token punctuation"},"["),a("local-branch-name"),s("span",{class:"token punctuation"},"]"),a(":"),s("span",{class:"token punctuation"},"["),a("remote-branch-name"),s("span",{class:"token punctuation"},"]"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),jn=s("p",null,"显示仓库信息",-1),Dn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" remote show "),s("span",{class:"token punctuation"},"["),a("remote-name"),s("span",{class:"token punctuation"},"]"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Pn=s("p",null,"重命名仓库缩写名",-1),Bn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" remote "),s("span",{class:"token function"},"rename"),a(),s("span",{class:"token operator"},"<"),a("old"),s("span",{class:"token operator"},">"),a(),s("span",{class:"token operator"},"<"),a("new"),s("span",{class:"token operator"},">"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),_n=s("p",null,"从本地操作,删除远程仓库的分支",-1),Mn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" push origin --delete "),s("span",{class:"token punctuation"},"["),a("remote-branch-name"),s("span",{class:"token punctuation"},"]"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Fn=s("p",null,"保存推送密码",-1),Un=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" config --global credential.helper store\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),$n=s("h2",{id:"tag"},[s("a",{class:"header-anchor",href:"#tag","aria-hidden":"true"},"#"),a(" Tag")],-1),qn=s("p",null,"列出标记及其信息",-1),zn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" tag\n"),s("span",{class:"token function"},"git"),a(" tag -l "),s("span",{class:"token string"},'"v1.8-"'),a("\n"),s("span",{class:"token function"},"git"),a(" show "),s("span",{class:"token operator"},"<"),a("tagName"),s("span",{class:"token punctuation"},"("),a("v1.4"),s("span",{class:"token punctuation"},")"),s("span",{class:"token operator"},">"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br")])],-1),Wn=s("p",null,"创建标签:",-1),Yn=s("ul",null,[s("li",null,"不加-m 会调用 core.editor)"),s("li",null,"省略 commit 序列,标签添加至最新提交")],-1),Vn=s("p",null,"创建附注(annotated)标签",-1),Kn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" tag -a "),s("span",{class:"token operator"},"<"),a("tagName"),s("span",{class:"token punctuation"},"("),a("v1.4"),s("span",{class:"token punctuation"},")"),s("span",{class:"token operator"},">"),a(),s("span",{class:"token punctuation"},"["),a("commit序列"),s("span",{class:"token punctuation"},"]"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Jn=s("p",null,"创建轻量(lightweight)标签",-1),Xn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" tag "),s("span",{class:"token operator"},"<"),a("tagName"),s("span",{class:"token punctuation"},"("),a("v1.4"),s("span",{class:"token punctuation"},")"),s("span",{class:"token operator"},">"),a(),s("span",{class:"token punctuation"},"["),a("commit序列"),s("span",{class:"token punctuation"},"]"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Qn=s("p",null,"共享标签至远程库",-1),Zn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" push "),s("span",{class:"token punctuation"},"["),a("remote-name"),s("span",{class:"token punctuation"},"]"),a(),s("span",{class:"token operator"},"<"),a("tagName"),s("span",{class:"token operator"},">"),a("\n"),s("span",{class:"token function"},"git"),a(" push "),s("span",{class:"token punctuation"},"["),a("remote-name"),s("span",{class:"token punctuation"},"]"),a(" --tags\n"),s("span",{class:"token function"},"git"),a(" push --follow-tags\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br")])],-1),ne=s("h2",{id:"alias"},[s("a",{class:"header-anchor",href:"#alias","aria-hidden":"true"},"#"),a(" Alias")],-1),ee=s("ul",null,[s("li",null,"!: 执行外部命令")],-1),se=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" config --global alias.co checkout\n"),s("span",{class:"token function"},"git"),a(" config --global alias.br branch\n"),s("span",{class:"token function"},"git"),a(" config --global alias.ci commit\n"),s("span",{class:"token function"},"git"),a(" config --global alias.st status\n\n"),s("span",{class:"token function"},"git"),a(" config --global alias.unstage "),s("span",{class:"token string"},"'reset HEAD --'"),a("\n"),s("span",{class:"token function"},"git"),a(" config --global alias.last "),s("span",{class:"token string"},"'log -1 HEAD'"),a("\n\n"),s("span",{class:"token function"},"git"),a(" config --global alias.visual "),s("span",{class:"token string"},"'!gitk'"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br"),s("span",{class:"line-number"},"9"),s("br")])],-1),ae=s("h2",{id:"merge"},[s("a",{class:"header-anchor",href:"#merge","aria-hidden":"true"},"#"),a(" Merge")],-1),le=s("p",null,"合并的结果是生成一个新的快照(并提交)(新的提交对象)",-1),te=s("h2",{id:"rebase"},[s("a",{class:"header-anchor",href:"#rebase","aria-hidden":"true"},"#"),a(" Rebase")],-1),ie=s("p",null,"切换到工作分支,编码开发新特性",-1),re=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" checkout feature-branch\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),oe=s("p",null,"新特性开发完毕,变基操作以简洁提交历史",-1),ce=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" rebase master\n\n"),s("span",{class:"token function"},"git"),a(" rebase "),s("span",{class:"token punctuation"},"["),a("baseBranch"),s("span",{class:"token punctuation"},"]"),a(),s("span",{class:"token punctuation"},"["),a("topicBranch"),s("span",{class:"token punctuation"},"]"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br")])],-1),ue=s("p",null,"切换到主分支,合并特性分支",-1),pe=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" checkout master\n"),s("span",{class:"token function"},"git"),a(" merge feature-branch\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),be=s("p",null,"pull with auto rebase and auto stash",-1),de=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" pull --rebase --autostash\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),me=s("h2",{id:"branch"},[s("a",{class:"header-anchor",href:"#branch","aria-hidden":"true"},"#"),a(" Branch")],-1),he=s("h3",{id:"basic-workflow-commands"},[s("a",{class:"header-anchor",href:"#basic-workflow-commands","aria-hidden":"true"},"#"),a(" Basic Workflow Commands")],-1),ge=s("h4",{id:"basic-branch"},[s("a",{class:"header-anchor",href:"#basic-branch","aria-hidden":"true"},"#"),a(" Basic Branch")],-1),ke=s("p",null,"创建新分支",-1),fe=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" branch "),s("span",{class:"token operator"},"<"),a("new-branch-name"),s("span",{class:"token operator"},">"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),ve=s("p",null,"删除分支",-1),we=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" branch -d "),s("span",{class:"token operator"},"<"),a("branch-name"),s("span",{class:"token operator"},">"),a("\n"),s("span",{class:"token function"},"git"),a(" push origin --delete "),s("span",{class:"token operator"},"<"),a("remote-branch-name"),s("span",{class:"token operator"},">"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),ye=s("p",null,"切换分支",-1),xe=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" checkout "),s("span",{class:"token operator"},"<"),a("branch-name"),s("span",{class:"token operator"},">"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Ce=s("p",null,"切换到新分支",-1),Ae=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" checkout -b "),s("span",{class:"token operator"},"<"),a("new-branch-name"),s("span",{class:"token operator"},">"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Ge=s("p",null,"打印分支信息",-1),Ie=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" branch -v"),s("span",{class:"token punctuation"},"("),a("详细信息"),s("span",{class:"token punctuation"},")"),a(" -vv"),s("span",{class:"token punctuation"},"("),a("详细远程信息"),s("span",{class:"token punctuation"},")"),a(" --merged"),s("span",{class:"token punctuation"},"("),a("显示合并至当前分支的分支"),s("span",{class:"token punctuation"},")"),a(" --no-merged"),s("span",{class:"token punctuation"},"("),a("显示未合并至当前分支的分支"),s("span",{class:"token punctuation"},")"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Ee=s("h4",{id:"remote-branch"},[s("a",{class:"header-anchor",href:"#remote-branch","aria-hidden":"true"},"#"),a(" Remote Branch")],-1),Te=s("ul",null,[s("li",null,"Show all remote branch:")],-1),Ne=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" branch -r\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Oe=s("p",null,"本地分支跟踪远程分支(在此本地分支上运行 git pull 自动抓取), 2 种方式:",-1),Re=s("ul",null,[s("li",null,"设置当前所在本地分支跟踪某一远程分支")],-1),Se=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" branch -u "),s("span",{class:"token punctuation"},"["),a("remoteName"),s("span",{class:"token punctuation"},"]"),a("/"),s("span",{class:"token punctuation"},"["),a("branch"),s("span",{class:"token punctuation"},"]"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),He=s("ul",null,[s("li",null,[a("创建并切换至新的本地分支(跟踪某一远程分支) "),s("ul",null,[s("li",null,"--track: 本地分支由 git 自动命名"),s("li",null,"-b: 本地分支由创建者命名")])])],-1),Le=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" checkout --track "),s("span",{class:"token punctuation"},"["),a("new-local-branch"),s("span",{class:"token punctuation"},"]"),a("\n\n"),s("span",{class:"token function"},"git"),a(" checkout -b "),s("span",{class:"token punctuation"},"["),a("new-local-branch"),s("span",{class:"token punctuation"},"]"),a(),s("span",{class:"token punctuation"},"["),a("remoteName"),s("span",{class:"token punctuation"},"]"),a("/"),s("span",{class:"token punctuation"},"["),a("branch"),s("span",{class:"token punctuation"},"]"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br")])],-1),je=s("ul",null,[s("li",null,"Delete remote branch")],-1),De=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" push --delete origin "),s("span",{class:"token punctuation"},"["),a("remote-branch-name"),s("span",{class:"token punctuation"},"]"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Pe=s("h3",{id:"advanced-branch-workflow"},[s("a",{class:"header-anchor",href:"#advanced-branch-workflow","aria-hidden":"true"},"#"),a(" Advanced Branch Workflow")],-1),Be=s("p",null,[s("a",{href:"https://github.com/nvie/gitflow",target:"_blank",rel:"noopener noreferrer"},"Git Flow Extension"),a(":")],-1),_e=s("ol",null,[s("li",null,"master 类型分支,名为?|master 或 master,其中?为开发代号"),s("li",null,"develop 类型分支,名为?|develop 或 develop,其中?为开发代号"),s("li",null,[a("feature 类型分支,名为 feature/"),s("em",null,"或?|feature/"),a(",其中*为特征描述")]),s("li",null,[a("release 类型分支,名为 release-"),s("em",null,"或?|release-"),a(",其中*为要发布的版本号")]),s("li",null,[a("hotfix 类型分支,名为 hotfix-"),s("em",null,"或?|hotfix-"),a(",其中*为要发布的版本号")]),s("li",null,[a("issues 类型分支,名为 issues/"),s("em",null,"或?|issues/"),a(",其中*为问题描述")]),s("li",null,"trials 类型分支,名为?%trials.*,?为此分支的父分支,*为描述的名称(或直接为?%trials)"),s("li",null,"basedOn 类型分支,名为 basedOn 或?|basedOn,?为其来源的 master 分支的开发代号"),s("li",null,[a("work 类型分支,名为 work.**"),s("em",null,"/basedOn-?-"),a(",***代表此描述此 work 的名称, ?为其所基于的分支的开发代号,最后一个*代表其在?|basedOn 上所基于的分支的版本号或状态名")])],-1),Me=s("p",null,"下面介绍模型中的约定,并定义 gg-*这样的抽象动作来完成约定中的行为",-1),Fe=s("h4",{id:"master-branch-and-develop-branch"},[s("a",{class:"header-anchor",href:"#master-branch-and-develop-branch","aria-hidden":"true"},"#"),a(" Master Branch and Develop Branch")],-1),Ue=s("p",null,[s("em",null,"多长期分支模式"),a(": master 分支与 develop 分支都是长期分支,区别在于分支的"),s("strong",null,"稳定性等级"),a(" - master > develop")],-1),$e=s("p",null,"e.g master/develop/next",-1),qe=s("ul",null,[s("li",null,"每一次的提交都必须有意义")],-1),ze=s("p",null,"git 在每次提交的时候要求输入对此提交的概括,这个概括不能为空。",-1),We=s("p",null,"正确的提交概括:更新了程序 doc 错误的提交概括:updates",-1),Ye=s("ul",null,[s("li",null,"开发型任务中的 master 类型与 develop 类型分支必须成对出现, master 分支的推进只能来源与 release 分支和 hotfix 分支的合并,禁止在 master 分支上直接提交")],-1),Ve=s("blockquote",null,[s("p",null,"master 分支上只有我们推送上去的稳定版本的程序,develop 分支上的程序一直处于开发状态,不稳定。 在开发型任务中使用 gg-init 进行版本控制的初始化,建立配套的 master ~ develop 分支对。 在使用型任务中使用 gg-work-init 进行版本控制的初始化, 拉取需要使用的稳定版本程序的 master 分支,并初始化对应的 basedOn 分支(见 9).")],-1),Ke=s("h4",{id:"feature-branch"},[s("a",{class:"header-anchor",href:"#feature-branch","aria-hidden":"true"},"#"),a(" Feature Branch")],-1),Je=s("ol",null,[s("li",null,"只能从 develop 类型分支上创建"),s("li",null,"最终必须合并到 develop 类型分支"),s("li",null,"最终分支被删除")],-1),Xe=s("blockquote",null,[s("p",null,"每当有新特性需要加入的时候,我们应该从 develop 类型分支上新建一个 feature 类型分支,完成新特性的开发和测试后将特性合并到 develop 类型分支上。 在 develop 类型分支上使用 gg-feature-open featureName 建立并转向一个名为 feature/featureName 的新分支 在一个 feature 类型分支上使用 gg-feature-close 把这个分支的工作合并到 develop 类型分支上,删除此分支,完成一个特性的开发")],-1),Qe=s("h4",{id:"release-branch"},[s("a",{class:"header-anchor",href:"#release-branch","aria-hidden":"true"},"#"),a(" Release Branch")],-1),Ze=s("ol",null,[s("li",null,"只能从 develop 类型分支上创建"),s("li",null,"最终必须同时合并到 master 类型分支(发布新的版本)和 develop 类型分支(基于新版本的进一步开发)"),s("li",null,"最终分支被删除")],-1),ns=s("blockquote",null,[s("p",null,"每当工作进入到一个较为稳定阶段的时候,可以使用 gg-release-open versionNum 建立一个名为 release-versionNum 的临时分支, 在这个分支上允许进行小的改动(比如修改一下 readme 文件中的版本号), 然后使用 gg-release-close 将此版本合并(发布)到 master 类型分支上,同时合并到 develop 类型分支上,然后删除此分支.")],-1),es=s("h4",{id:"hotfix-branch"},[s("a",{class:"header-anchor",href:"#hotfix-branch","aria-hidden":"true"},"#"),a(" Hotfix Branch")],-1),ss=s("ol",null,[s("li",null,"只能从 master 类型分支上创建"),s("li",null,"最终必须同时合并到 master 类型分支(发布新的热补丁版本)和 develop 类型分支(基于新版本的进一步开发)"),s("li",null,"最终分支被删除")],-1),as=s("blockquote",null,[s("p",null,"当新版本发布后发现必须马上解决的严重 bug 时,使用 gg-hotfix-open versionNum 建立名为 hotfix-versionNum 的临时分支, 在这个分支上完成 bug 的修复,然后使用 gg-hotfix-close 将此版本合并(发布)到 master 类型分支上,同时合并到 develop 类型分支上,然后删除此分支.")],-1),ls=s("h4",{id:"issues-branch"},[s("a",{class:"header-anchor",href:"#issues-branch","aria-hidden":"true"},"#"),a(" Issues Branch")],-1),ts=s("ol",null,[s("li",null,"只能从 develop 类型分支上创建"),s("li",null,"最终必须合并到 develop 类型分支"),s("li",null,"最终分支被删除")],-1),is=s("blockquote",null,[s("p",null,"注解:每当有(比较复杂的)问题需要解决的时候,应该从 develop 类型分支上新建一个 issues 类型分支,完成问题的调试后合并到 develop 类型分支上。 在 develop 类型分支上使用 gg-issues-open featureName 建立并转向一个名为 issues/issuesName 的新分支 在一个 issues 类型分支上使用 gg-issues-close 把这个分支的工作合并到 develop 类型分支上,然后删除此分支,解决了一个复杂的问题 issues 类型和 feature 类型的实现方式一模一样,仅仅有名字上面的差别。")],-1),rs=s("h4",{id:"trials-branch"},[s("a",{class:"header-anchor",href:"#trials-branch","aria-hidden":"true"},"#"),a(" Trials Branch")],-1),os=s("ul",null,[s("li",null,"可以从除了 release 类型分支以外的任何类型分支上创建"),s("li",null,[a("在这个分支上请发挥想象力大胆实验 "),s("ul",null,[s("li",null,"接受实验结果,把实验过程并入父分支,称为 good-close"),s("li",null,"实验结果不理想,放弃实验结果,从实验开始前重新来过,称为 bad-close")])]),s("li",null,"最终分支被删除")],-1),cs=s("blockquote",null,[s("p",null,"在满足条件的分支 A 上工作,时不时会冒出一些大胆的想法 这个时候使用 gg-trials-open trialsName 创建并转向一个名为 A/trials.trialsName 的实验分支,在这个分支上进行疯狂的实验")],-1),us=s("h4",{id:"basedon-branch"},[s("a",{class:"header-anchor",href:"#basedon-branch","aria-hidden":"true"},"#"),a(" BasedOn Branch")],-1),ps=s("ol",null,[s("li",null,"从 name|master 建立并初始化为 name|basedOn"),s("li",null,"只能从对应的 master 分支 fork 到此分支"),s("li",null,"禁止在这个分支上提交")],-1),bs=s("blockquote",null,[s("p",null,"这个分支是一个为了使工作流程更为清晰的缓存分支, 分支上只有从 master 稳定分支上挑选出来的自己在工作中将要(尝试)使用的稳定版本。 在 basedOn 类型分支上使用 gg-select 版本号 从对应的 master 分支上选出一个稳定版本或使用 gg-select-the-latest 从对应的 master 分支上选择最新的版本, fork 到这个分支,并加上 inUse-versionNum 的标签 从 master 到此分支的行为是 fork, 即有可能此分支的 log 为 (init)v1.0===>v0.9=====>v0.8======>v1.3, 这个分支上的 commit 来源于 master,但是其分支提交历史与 master 分支无关")],-1),ds=s("h4",{id:"work-branch"},[s("a",{class:"header-anchor",href:"#work-branch","aria-hidden":"true"},"#"),a(" Work Branch")],-1),ms=s("ol",null,[s("li",null,"只能从 basedOn 类型分支上创建"),s("li",null,"可以借助 basedOn 分支升级")],-1),hs=s("h2",{id:"git-inside"},[s("a",{class:"header-anchor",href:"#git-inside","aria-hidden":"true"},"#"),a(" Git Inside")],-1),gs=s("h3",{id:"add-inside"},[s("a",{class:"header-anchor",href:"#add-inside","aria-hidden":"true"},"#"),a(" Add Inside")],-1),ks=s("ul",null,[s("li",null,"create blob objects: contains content of files"),s("li",null,"add files to index list (.git/index)")],-1),fs=s("h3",{id:"commit-inside"},[s("a",{class:"header-anchor",href:"#commit-inside","aria-hidden":"true"},"#"),a(" Commit Inside")],-1),vs=s("ul",null,[s("li",null,"create tree objects: each object represent a directory, contains blob object refs in this directory"),s("li",null,"create commit object: contains root tree object hash number and parent commit object hash number")],-1),ws=s("h3",{id:"checkout-inside"},[s("a",{class:"header-anchor",href:"#checkout-inside","aria-hidden":"true"},"#"),a(" Checkout Inside")],-1),ys=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" checkout "),s("span",{class:"token operator"},"<"),a("commit-hash-id"),s("span",{class:"token operator"},">"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),xs=s("ul",null,[s("li",null,"get commit object by commit hash id"),s("li",null,"get root tree object in commit object"),s("li",null,"write file entries by root tree object (tree graph)"),s("li",null,"write .git/index"),s("li",null,"set HEAD to that commit (detached HEAD state)")],-1),Cs=s("div",{class:"language-js line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token comment"},"// Get file commit history"),a("\n"),s("span",{class:"token keyword"},"const"),a(" Git "),s("span",{class:"token operator"},"="),a(),s("span",{class:"token function"},"require"),s("span",{class:"token punctuation"},"("),s("span",{class:"token string"},"'nodegit'"),s("span",{class:"token punctuation"},")"),s("span",{class:"token punctuation"},";"),a("\n"),s("span",{class:"token keyword"},"let"),a(" repo"),s("span",{class:"token punctuation"},";"),a("\n\nGit"),s("span",{class:"token punctuation"},"."),a("Repository"),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"open"),s("span",{class:"token punctuation"},"("),a("path"),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"resolve"),s("span",{class:"token punctuation"},"("),s("span",{class:"token string"},"'./.git'"),s("span",{class:"token punctuation"},")"),s("span",{class:"token punctuation"},")"),a("\n "),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"then"),s("span",{class:"token punctuation"},"("),s("span",{class:"token keyword"},"function"),a(),s("span",{class:"token punctuation"},"("),s("span",{class:"token parameter"},"r"),s("span",{class:"token punctuation"},")"),a(),s("span",{class:"token punctuation"},"{"),a("\n repo "),s("span",{class:"token operator"},"="),a(" r"),s("span",{class:"token punctuation"},";"),a("\n "),s("span",{class:"token keyword"},"return"),a(" repo"),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"getMasterCommit"),s("span",{class:"token punctuation"},"("),s("span",{class:"token punctuation"},")"),s("span",{class:"token punctuation"},";"),a("\n "),s("span",{class:"token punctuation"},"}"),s("span",{class:"token punctuation"},")"),a("\n "),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"then"),s("span",{class:"token punctuation"},"("),s("span",{class:"token keyword"},"function"),a(),s("span",{class:"token punctuation"},"("),s("span",{class:"token parameter"},"firstCommitOnMaster"),s("span",{class:"token punctuation"},")"),a(),s("span",{class:"token punctuation"},"{"),a("\n "),s("span",{class:"token keyword"},"const"),a(" walker "),s("span",{class:"token operator"},"="),a(" repo"),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"createRevWalk"),s("span",{class:"token punctuation"},"("),s("span",{class:"token punctuation"},")"),s("span",{class:"token punctuation"},";"),a("\n walker"),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"push"),s("span",{class:"token punctuation"},"("),a("firstCommitOnMaster"),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"sha"),s("span",{class:"token punctuation"},"("),s("span",{class:"token punctuation"},")"),s("span",{class:"token punctuation"},")"),s("span",{class:"token punctuation"},";"),a("\n walker"),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"sorting"),s("span",{class:"token punctuation"},"("),a("Git"),s("span",{class:"token punctuation"},"."),a("Revwalk"),s("span",{class:"token punctuation"},"."),s("span",{class:"token constant"},"SORT"),s("span",{class:"token punctuation"},"."),a("Time"),s("span",{class:"token punctuation"},")"),s("span",{class:"token punctuation"},";"),a("\n\n "),s("span",{class:"token keyword"},"return"),a(" walker"),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"fileHistoryWalk"),s("span",{class:"token punctuation"},"("),a("historyFile"),s("span",{class:"token punctuation"},","),a(),s("span",{class:"token number"},"2"),s("span",{class:"token punctuation"},")"),s("span",{class:"token punctuation"},";"),a("\n "),s("span",{class:"token punctuation"},"}"),s("span",{class:"token punctuation"},")"),a("\n "),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"then"),s("span",{class:"token punctuation"},"("),s("span",{class:"token punctuation"},"("),s("span",{class:"token parameter"},"resultingArrayOfCommits"),s("span",{class:"token punctuation"},")"),a(),s("span",{class:"token operator"},"=>"),a(),s("span",{class:"token punctuation"},"{"),a("\n "),s("span",{class:"token keyword"},"if"),a(),s("span",{class:"token punctuation"},"("),a("resultingArrayOfCommits"),s("span",{class:"token punctuation"},"."),a("length "),s("span",{class:"token operator"},">"),a(),s("span",{class:"token number"},"0"),s("span",{class:"token punctuation"},")"),a(),s("span",{class:"token punctuation"},"{"),a("\n "),s("span",{class:"token keyword"},"const"),a(" commit "),s("span",{class:"token operator"},"="),a(" resultingArrayOfCommits"),s("span",{class:"token punctuation"},"["),s("span",{class:"token number"},"0"),s("span",{class:"token punctuation"},"]"),s("span",{class:"token punctuation"},"."),a("commit"),s("span",{class:"token punctuation"},";"),a("\n "),s("span",{class:"token keyword"},"const"),a(" date "),s("span",{class:"token operator"},"="),a(" commit"),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"date"),s("span",{class:"token punctuation"},"("),s("span",{class:"token punctuation"},")"),s("span",{class:"token punctuation"},";"),a("\n "),s("span",{class:"token punctuation"},"}"),a("\n "),s("span",{class:"token punctuation"},"}"),s("span",{class:"token punctuation"},")"),s("span",{class:"token punctuation"},";"),a("\n\n"),s("span",{class:"token keyword"},"const"),a(),s("span",{class:"token function-variable function"},"getGitLastUpdatedTimeStamp"),a(),s("span",{class:"token operator"},"="),a(),s("span",{class:"token punctuation"},"("),s("span",{class:"token parameter"},"filePath"),s("span",{class:"token punctuation"},")"),a(),s("span",{class:"token operator"},"=>"),a(),s("span",{class:"token punctuation"},"{"),a("\n "),s("span",{class:"token keyword"},"let"),a(" lastUpdated "),s("span",{class:"token operator"},"="),a(),s("span",{class:"token number"},"0"),s("span",{class:"token punctuation"},";"),a("\n\n "),s("span",{class:"token keyword"},"try"),a(),s("span",{class:"token punctuation"},"{"),a("\n lastUpdated "),s("span",{class:"token operator"},"="),a("\n "),s("span",{class:"token function"},"parseInt"),s("span",{class:"token punctuation"},"("),a("\n spawn\n "),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"sync"),s("span",{class:"token punctuation"},"("),s("span",{class:"token string"},"'git'"),s("span",{class:"token punctuation"},","),a(),s("span",{class:"token punctuation"},"["),s("span",{class:"token string"},"'log'"),s("span",{class:"token punctuation"},","),a(),s("span",{class:"token string"},"'-1'"),s("span",{class:"token punctuation"},","),a(),s("span",{class:"token string"},"'--format=%at'"),s("span",{class:"token punctuation"},","),a(" path"),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"basename"),s("span",{class:"token punctuation"},"("),a("filePath"),s("span",{class:"token punctuation"},")"),s("span",{class:"token punctuation"},"]"),s("span",{class:"token punctuation"},","),a(),s("span",{class:"token punctuation"},"{"),a("\n cwd"),s("span",{class:"token operator"},":"),a(" path"),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"dirname"),s("span",{class:"token punctuation"},"("),a("filePath"),s("span",{class:"token punctuation"},")"),s("span",{class:"token punctuation"},","),a("\n "),s("span",{class:"token punctuation"},"}"),s("span",{class:"token punctuation"},")"),a("\n "),s("span",{class:"token punctuation"},"."),a("stdout"),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"toString"),s("span",{class:"token punctuation"},"("),s("span",{class:"token string"},"'utf-8'"),s("span",{class:"token punctuation"},")"),a("\n "),s("span",{class:"token punctuation"},")"),a(),s("span",{class:"token operator"},"*"),a(),s("span",{class:"token number"},"1000"),s("span",{class:"token punctuation"},";"),a("\n "),s("span",{class:"token punctuation"},"}"),a(),s("span",{class:"token keyword"},"catch"),a(),s("span",{class:"token punctuation"},"("),a("e"),s("span",{class:"token punctuation"},")"),a(),s("span",{class:"token punctuation"},"{"),a("\n "),s("span",{class:"token comment"},"/* do not handle for now */"),a("\n "),s("span",{class:"token punctuation"},"}"),a("\n\n "),s("span",{class:"token keyword"},"return"),a(" lastUpdated"),s("span",{class:"token punctuation"},";"),a("\n"),s("span",{class:"token punctuation"},"}"),s("span",{class:"token punctuation"},";"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br"),s("span",{class:"line-number"},"9"),s("br"),s("span",{class:"line-number"},"10"),s("br"),s("span",{class:"line-number"},"11"),s("br"),s("span",{class:"line-number"},"12"),s("br"),s("span",{class:"line-number"},"13"),s("br"),s("span",{class:"line-number"},"14"),s("br"),s("span",{class:"line-number"},"15"),s("br"),s("span",{class:"line-number"},"16"),s("br"),s("span",{class:"line-number"},"17"),s("br"),s("span",{class:"line-number"},"18"),s("br"),s("span",{class:"line-number"},"19"),s("br"),s("span",{class:"line-number"},"20"),s("br"),s("span",{class:"line-number"},"21"),s("br"),s("span",{class:"line-number"},"22"),s("br"),s("span",{class:"line-number"},"23"),s("br"),s("span",{class:"line-number"},"24"),s("br"),s("span",{class:"line-number"},"25"),s("br"),s("span",{class:"line-number"},"26"),s("br"),s("span",{class:"line-number"},"27"),s("br"),s("span",{class:"line-number"},"28"),s("br"),s("span",{class:"line-number"},"29"),s("br"),s("span",{class:"line-number"},"30"),s("br"),s("span",{class:"line-number"},"31"),s("br"),s("span",{class:"line-number"},"32"),s("br"),s("span",{class:"line-number"},"33"),s("br"),s("span",{class:"line-number"},"34"),s("br"),s("span",{class:"line-number"},"35"),s("br"),s("span",{class:"line-number"},"36"),s("br"),s("span",{class:"line-number"},"37"),s("br"),s("span",{class:"line-number"},"38"),s("br"),s("span",{class:"line-number"},"39"),s("br"),s("span",{class:"line-number"},"40"),s("br"),s("span",{class:"line-number"},"41"),s("br")])],-1),As=s("h3",{id:"merge-inside"},[s("a",{class:"header-anchor",href:"#merge-inside","aria-hidden":"true"},"#"),a(" Merge Inside")],-1),Gs=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" merge "),s("span",{class:"token operator"},"<"),a("giver-branch"),s("span",{class:"token operator"},">"),a("/"),s("span",{class:"token operator"},"<"),a("giver-commit"),s("span",{class:"token operator"},">"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Is=s("ul",null,[s("li",null,[a("write giver commit hash to "),s("code",null,".git/MERGE_HEAD")]),s("li",null,"find base commit (the most recent common ancestor commit)"),s("li",null,"diff and apply according to base commit, giver commit, receiver commit"),s("li",null,[a("do what "),s("code",null,"git checkout"),a(" do")]),s("li",null,[a("remove "),s("code",null,".git/MERGE_HEAD")])],-1),Es=s("h3",{id:"fetch-inside"},[s("a",{class:"header-anchor",href:"#fetch-inside","aria-hidden":"true"},"#"),a(" Fetch Inside")],-1),Ts=s("ul",null,[s("li",null,"get hash of remote commit and its root tree object"),s("li",null,"copy all diff objects in tree graph into .git/objects"),s("li",null,[a("update "),s("code",null,".git/refs/remotes/origin/"),a(", set "),s("code",null,".git/FETCH_HEAD"),a(" to it")])],-1),Ns=s("h3",{id:"clone-inside"},[s("a",{class:"header-anchor",href:"#clone-inside","aria-hidden":"true"},"#"),a(" Clone Inside")],-1),Os=s("p",null,[s("code",null,"git init"),a(" + "),s("code",null,"git remote add origin "),a(" + "),s("code",null,"git pull origin")],-1),Rs=s("h3",{id:"push-inside"},[s("a",{class:"header-anchor",href:"#push-inside","aria-hidden":"true"},"#"),a(" Push Inside")],-1),Ss=s("ul",null,[s("li",null,"apply commit to remote repo"),s("li",null,[a("update remote repo "),s("code",null,".git/refs/heads/"),a(" to new commit")]),s("li",null,[a("update local repo "),s("code",null,".git/refs/remotes/origin/"),a(" to new commit")])],-1),Hs=s("h3",{id:"head-branch-inside"},[s("a",{class:"header-anchor",href:"#head-branch-inside","aria-hidden":"true"},"#"),a(" HEAD Branch Inside")],-1),Ls=s("ul",null,[s("li",null,"HEAD -> refs/heads/master -> commit object"),s("li",null,"branches are just refs, refs are just files (contain commit hash id)")],-1),js=s("h3",{id:"git-objects"},[s("a",{class:"header-anchor",href:"#git-objects","aria-hidden":"true"},"#"),a(" Git Objects")],-1),Ds=s("p",null,[s("code",null,".git/objects"),a(" is immutable, "),s("code",null,".git/refs"),a(" is mutable")],-1),Ps=s("p",null,[s("code",null,"blob"),a("持有文件的内容,"),s("code",null,"树对象"),a("是一个包含"),s("code",null,"blob"),a("对象和"),s("code",null,"子树对象"),a("的目录列表. "),s("code",null,"提交对象"),a("是工作目录的一个快照, 包含了一些像时间或提交信息这样的元数据. "),s("code",null,"分支"),a("是"),s("code",null,"提交对象"),a("的命名引用. "),s("code",null,"工作目录"),a("是一个目录, 有着相应的仓库, "),s("code",null,"暂存区"),a("(索引)为下一个"),s("code",null,"提交对象"),a("持有对应的"),s("code",null,"树对象"),a(", 而仓库就是一个"),s("code",null,"提交对象"),a("的集合.")],-1),Bs=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" hash-object 创建blob对象\n"),s("span",{class:"token function"},"git"),a(" cat-file -t\n"),s("span",{class:"token function"},"git"),a(" cat-file -p\n"),s("span",{class:"token function"},"git"),a(" update-index --add --cache-info 将文件添加至暂存区\n"),s("span",{class:"token function"},"git"),a(" write-tree 创建tree对象\n"),s("span",{class:"token function"},"git"),a(" commit-tree 创建commit对象\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br")])],-1),_s=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token comment"},"# -w for write into codebase,"),a("\n"),s("span",{class:"token comment"},"# --stdin for reading from stdin not file"),a("\n"),s("span",{class:"token builtin class-name"},"echo"),a(),s("span",{class:"token string"},"'test content'"),a(),s("span",{class:"token operator"},"|"),a(),s("span",{class:"token function"},"git"),a(" hash-object -w --stdin\n"),s("span",{class:"token function"},"git"),a(" cat-file -p "),s("span",{class:"token operator"},"<"),a("object-hash-number"),s("span",{class:"token operator"},">"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br")])],-1),Ms=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token shebang important"},"#!/bin/bash"),a("\n\n"),s("span",{class:"token keyword"},"function"),a(),s("span",{class:"token function-name function"},"separator"),s("span",{class:"token punctuation"},"("),s("span",{class:"token punctuation"},")"),a(),s("span",{class:"token punctuation"},"{"),a("\n "),s("span",{class:"token keyword"},"for"),a(),s("span",{class:"token for-or-select variable"},"i"),a(),s("span",{class:"token keyword"},"in"),a(),s("span",{class:"token punctuation"},"{"),s("span",{class:"token number"},"1"),s("span",{class:"token punctuation"},".."),s("span",{class:"token number"},"20"),s("span",{class:"token punctuation"},"}"),a("\n "),s("span",{class:"token keyword"},"do"),a("\n "),s("span",{class:"token builtin class-name"},"printf"),a(),s("span",{class:"token string"},'"-"'),a("\n "),s("span",{class:"token keyword"},"done"),a("\n "),s("span",{class:"token builtin class-name"},"printf"),a(),s("span",{class:"token variable"},"$1"),a("\n "),s("span",{class:"token keyword"},"for"),a(),s("span",{class:"token for-or-select variable"},"i"),a(),s("span",{class:"token keyword"},"in"),a(),s("span",{class:"token punctuation"},"{"),s("span",{class:"token number"},"1"),s("span",{class:"token punctuation"},".."),s("span",{class:"token number"},"20"),s("span",{class:"token punctuation"},"}"),a("\n "),s("span",{class:"token keyword"},"do"),a("\n "),s("span",{class:"token builtin class-name"},"printf"),a(),s("span",{class:"token string"},'"-"'),a("\n "),s("span",{class:"token keyword"},"done"),a("\n "),s("span",{class:"token builtin class-name"},"printf"),a(),s("span",{class:"token string"},[a('"'),s("span",{class:"token entity",title:"\\n"},"\\n"),a('"')]),a("\n"),s("span",{class:"token punctuation"},"}"),a("\n\n"),s("span",{class:"token keyword"},"function"),a(),s("span",{class:"token function-name function"},"git_object_type"),s("span",{class:"token punctuation"},"("),s("span",{class:"token punctuation"},")"),a(),s("span",{class:"token punctuation"},"{"),a("\n "),s("span",{class:"token builtin class-name"},"printf"),a(),s("span",{class:"token string"},'"type => "'),a("\n "),s("span",{class:"token function"},"git"),a(" cat-file -t "),s("span",{class:"token variable"},"$1"),a("\n "),s("span",{class:"token keyword"},"for"),a(),s("span",{class:"token for-or-select variable"},"i"),a(),s("span",{class:"token keyword"},"in"),a(),s("span",{class:"token punctuation"},"{"),s("span",{class:"token number"},"1"),s("span",{class:"token punctuation"},".."),s("span",{class:"token number"},"40"),s("span",{class:"token punctuation"},"}"),a("\n "),s("span",{class:"token keyword"},"do"),a("\n "),s("span",{class:"token builtin class-name"},"printf"),a(),s("span",{class:"token string"},'"-"'),a("\n "),s("span",{class:"token keyword"},"done"),a("\n "),s("span",{class:"token builtin class-name"},"printf"),a(),s("span",{class:"token string"},[a('"'),s("span",{class:"token entity",title:"\\n"},"\\n"),a('"')]),a("\n"),s("span",{class:"token punctuation"},"}"),a("\n\n"),s("span",{class:"token keyword"},"function"),a(),s("span",{class:"token function-name function"},"git_object_content"),s("span",{class:"token punctuation"},"("),s("span",{class:"token punctuation"},")"),a(),s("span",{class:"token punctuation"},"{"),a("\n "),s("span",{class:"token function"},"git"),a(" cat-file -p "),s("span",{class:"token variable"},"$1"),a("\n"),s("span",{class:"token punctuation"},"}"),a("\n\n"),s("span",{class:"token keyword"},"function"),a(),s("span",{class:"token function-name function"},"print_git_objects"),s("span",{class:"token punctuation"},"("),s("span",{class:"token punctuation"},")"),a(),s("span",{class:"token punctuation"},"{"),a("\n "),s("span",{class:"token assign-left variable"},"files"),s("span",{class:"token operator"},"="),s("span",{class:"token variable"},[s("span",{class:"token variable"},"$("),s("span",{class:"token function"},"git"),a(" rev-list --parents --objects HEAD "),s("span",{class:"token operator"},"|"),a(),s("span",{class:"token function"},"awk"),a(),s("span",{class:"token string"},"'{print $1}'"),s("span",{class:"token variable"},")")]),a("\n "),s("span",{class:"token assign-left variable"},"index"),s("span",{class:"token operator"},"="),s("span",{class:"token number"},"0"),a("\n\n "),s("span",{class:"token keyword"},"for"),a(),s("span",{class:"token for-or-select variable"},"file"),a(),s("span",{class:"token keyword"},"in"),a(),s("span",{class:"token variable"},"$files"),a("\n "),s("span",{class:"token keyword"},"do"),a("\n "),s("span",{class:"token assign-left variable"},"len"),s("span",{class:"token operator"},"="),s("span",{class:"token variable"},[s("span",{class:"token variable"},"$("),s("span",{class:"token function"},"expr"),a(" length "),s("span",{class:"token string"},[a('"'),s("span",{class:"token variable"},"$file"),a('"')]),s("span",{class:"token variable"},")")]),a("\n\n "),s("span",{class:"token keyword"},"if"),a(),s("span",{class:"token punctuation"},"["),a(),s("span",{class:"token variable"},"$len"),a(" -gt "),s("span",{class:"token number"},"30"),a(),s("span",{class:"token punctuation"},"]"),a("\n "),s("span",{class:"token keyword"},"then"),a("\n "),s("span",{class:"token assign-left variable"},"index"),s("span",{class:"token operator"},"="),s("span",{class:"token variable"},[s("span",{class:"token variable"},"$("),s("span",{class:"token function"},"expr"),a(" $index + "),s("span",{class:"token number"},"1"),s("span",{class:"token variable"},")")]),a("\n separator "),s("span",{class:"token variable"},"$index"),a("\n "),s("span",{class:"token builtin class-name"},"echo"),a(),s("span",{class:"token variable"},"$file"),a("\n git_object_type "),s("span",{class:"token variable"},"$file"),a("\n git_object_content "),s("span",{class:"token variable"},"$file"),a("\n "),s("span",{class:"token keyword"},"fi"),a("\n "),s("span",{class:"token keyword"},"done"),a("\n"),s("span",{class:"token punctuation"},"}"),a("\n\nprint_git_objects\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br"),s("span",{class:"line-number"},"9"),s("br"),s("span",{class:"line-number"},"10"),s("br"),s("span",{class:"line-number"},"11"),s("br"),s("span",{class:"line-number"},"12"),s("br"),s("span",{class:"line-number"},"13"),s("br"),s("span",{class:"line-number"},"14"),s("br"),s("span",{class:"line-number"},"15"),s("br"),s("span",{class:"line-number"},"16"),s("br"),s("span",{class:"line-number"},"17"),s("br"),s("span",{class:"line-number"},"18"),s("br"),s("span",{class:"line-number"},"19"),s("br"),s("span",{class:"line-number"},"20"),s("br"),s("span",{class:"line-number"},"21"),s("br"),s("span",{class:"line-number"},"22"),s("br"),s("span",{class:"line-number"},"23"),s("br"),s("span",{class:"line-number"},"24"),s("br"),s("span",{class:"line-number"},"25"),s("br"),s("span",{class:"line-number"},"26"),s("br"),s("span",{class:"line-number"},"27"),s("br"),s("span",{class:"line-number"},"28"),s("br"),s("span",{class:"line-number"},"29"),s("br"),s("span",{class:"line-number"},"30"),s("br"),s("span",{class:"line-number"},"31"),s("br"),s("span",{class:"line-number"},"32"),s("br"),s("span",{class:"line-number"},"33"),s("br"),s("span",{class:"line-number"},"34"),s("br"),s("span",{class:"line-number"},"35"),s("br"),s("span",{class:"line-number"},"36"),s("br"),s("span",{class:"line-number"},"37"),s("br"),s("span",{class:"line-number"},"38"),s("br"),s("span",{class:"line-number"},"39"),s("br"),s("span",{class:"line-number"},"40"),s("br"),s("span",{class:"line-number"},"41"),s("br"),s("span",{class:"line-number"},"42"),s("br"),s("span",{class:"line-number"},"43"),s("br"),s("span",{class:"line-number"},"44"),s("br"),s("span",{class:"line-number"},"45"),s("br"),s("span",{class:"line-number"},"46"),s("br"),s("span",{class:"line-number"},"47"),s("br"),s("span",{class:"line-number"},"48"),s("br"),s("span",{class:"line-number"},"49"),s("br")])],-1),Fs=s("h2",{id:"github"},[s("a",{class:"header-anchor",href:"#github","aria-hidden":"true"},"#"),a(" GitHub")],-1),Us=s("h3",{id:"gpg-usage"},[s("a",{class:"header-anchor",href:"#gpg-usage","aria-hidden":"true"},"#"),a(" GPG Usage")],-1),$s=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token comment"},"# Generate GPG key"),a("\ngpg --full-generate-key\n"),s("span",{class:"token comment"},"# List GPG keys"),a("\ngpg --list-keys\n\n"),s("span",{class:"token comment"},"# Generate GPG public key string"),a("\ngpg --armor --export "),s("span",{class:"token operator"},"<"),a("pub-keyID"),s("span",{class:"token operator"},">"),a("\n"),s("span",{class:"token comment"},"# Copy output to GitHub GPG textarea"),a("\n\n"),s("span",{class:"token comment"},"# Git global configuration for GPG signature commits"),a("\n"),s("span",{class:"token function"},"git"),a(" config --global user.signingkey "),s("span",{class:"token operator"},"<"),a("pub-keyID"),s("span",{class:"token operator"},">"),a("\n"),s("span",{class:"token function"},"git"),a(" config --global commit.gpgsign "),s("span",{class:"token boolean"},"true"),a("\n\n"),s("span",{class:"token comment"},"# Single signature commit"),a("\n"),s("span",{class:"token function"},"git"),a(" commit -S -m "),s("span",{class:"token string"},'"..."'),a("\n\n"),s("span",{class:"token comment"},"# Import GitHub signature"),a("\n"),s("span",{class:"token function"},"curl"),a(" https://github.com/web-flow.gpg "),s("span",{class:"token operator"},"|"),a(" gpg --import\ngpg --sign-key "),s("span",{class:"token operator"},"<"),a("GitHub-keyID"),s("span",{class:"token operator"},">"),a("\n\n"),s("span",{class:"token comment"},"# Log git signature"),a("\n"),s("span",{class:"token function"},"git"),a(" log --show-signature\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br"),s("span",{class:"line-number"},"9"),s("br"),s("span",{class:"line-number"},"10"),s("br"),s("span",{class:"line-number"},"11"),s("br"),s("span",{class:"line-number"},"12"),s("br"),s("span",{class:"line-number"},"13"),s("br"),s("span",{class:"line-number"},"14"),s("br"),s("span",{class:"line-number"},"15"),s("br"),s("span",{class:"line-number"},"16"),s("br"),s("span",{class:"line-number"},"17"),s("br"),s("span",{class:"line-number"},"18"),s("br"),s("span",{class:"line-number"},"19"),s("br"),s("span",{class:"line-number"},"20"),s("br"),s("span",{class:"line-number"},"21"),s("br"),s("span",{class:"line-number"},"22"),s("br")])],-1),qs=s("h3",{id:"license"},[s("a",{class:"header-anchor",href:"#license","aria-hidden":"true"},"#"),a(" LICENSE")],-1),zs=s("h4",{id:"popular-license"},[s("a",{class:"header-anchor",href:"#popular-license","aria-hidden":"true"},"#"),a(" Popular LICENSE")],-1),Ws=s("div",{class:"language-mermaid line-numbers-mode"},[s("pre",null,[s("code",null,"graph TD\nLicense --\x3e A{Open Source}\nA --\x3e|Yes| B{Same License}\nA --\x3e|No| D{List Copyright on Changed}\nB --\x3e|Yes| GPL\nB --\x3e|No| C{Change Docs}\nC --\x3e|Yes| Mozilla\nC --\x3e|No| LGPL\nD --\x3e|Yes| Apache\nD --\x3e|No| E{Enterprise}\nE --\x3e|Yes| MIT\nE --\x3e|No| BSD\n")]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br"),s("span",{class:"line-number"},"9"),s("br"),s("span",{class:"line-number"},"10"),s("br"),s("span",{class:"line-number"},"11"),s("br"),s("span",{class:"line-number"},"12"),s("br")])],-1),Ys=s("p",null,[s("img",{src:"/awesome-notes/assets/6_free_software_licenses.344bcf8c.png",alt:"Free Software License"})],-1),Vs=s("h4",{id:"unique-license"},[s("a",{class:"header-anchor",href:"#unique-license","aria-hidden":"true"},"#"),a(" Unique LICENSE")],-1),Ks=s("ul",null,[s("li",null,"CC BY-NC-SA 3.0 License")],-1),Js=s("div",{class:"language-html line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token tag"},[s("span",{class:"token tag"},[s("span",{class:"token punctuation"},"<"),a("a")]),a(),s("span",{class:"token attr-name"},"rel"),s("span",{class:"token attr-value"},[s("span",{class:"token punctuation attr-equals"},"="),s("span",{class:"token punctuation"},'"'),a("license"),s("span",{class:"token punctuation"},'"')]),a(),s("span",{class:"token attr-name"},"href"),s("span",{class:"token attr-value"},[s("span",{class:"token punctuation attr-equals"},"="),s("span",{class:"token punctuation"},'"'),a("http://creativecommons.org/licenses/by-nc-sa/3.0/"),s("span",{class:"token punctuation"},'"')]),a("\n "),s("span",{class:"token punctuation"},">")]),s("span",{class:"token tag"},[s("span",{class:"token tag"},[s("span",{class:"token punctuation"},"<"),a("img")]),a("\n "),s("span",{class:"token attr-name"},"alt"),s("span",{class:"token attr-value"},[s("span",{class:"token punctuation attr-equals"},"="),s("span",{class:"token punctuation"},'"'),a("Creative\nCommons License"),s("span",{class:"token punctuation"},'"')]),a("\n "),s("span",{class:"token special-attr"},[s("span",{class:"token attr-name"},"style"),s("span",{class:"token attr-value"},[s("span",{class:"token punctuation attr-equals"},"="),s("span",{class:"token punctuation"},'"'),s("span",{class:"token value css language-css"},[s("span",{class:"token property"},"border-width"),s("span",{class:"token punctuation"},":"),a("0")]),s("span",{class:"token punctuation"},'"')])]),a("\n "),s("span",{class:"token attr-name"},"src"),s("span",{class:"token attr-value"},[s("span",{class:"token punctuation attr-equals"},"="),s("span",{class:"token punctuation"},'"'),a("https://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png"),s("span",{class:"token punctuation"},'"')]),a(),s("span",{class:"token punctuation"},"/>")]),s("span",{class:"token tag"},[s("span",{class:"token tag"},[s("span",{class:"token punctuation"},"")]),s("span",{class:"token tag"},[s("span",{class:"token tag"},[s("span",{class:"token punctuation"},"<"),a("br")]),a(),s("span",{class:"token punctuation"},"/>")]),a("This work is licensed under a\n"),s("span",{class:"token tag"},[s("span",{class:"token tag"},[s("span",{class:"token punctuation"},"<"),a("a")]),a(),s("span",{class:"token attr-name"},"rel"),s("span",{class:"token attr-value"},[s("span",{class:"token punctuation attr-equals"},"="),s("span",{class:"token punctuation"},'"'),a("license"),s("span",{class:"token punctuation"},'"')]),a(),s("span",{class:"token attr-name"},"href"),s("span",{class:"token attr-value"},[s("span",{class:"token punctuation attr-equals"},"="),s("span",{class:"token punctuation"},'"'),a("http://creativecommons.org/licenses/by-nc-sa/3.0/"),s("span",{class:"token punctuation"},'"')]),a("\n "),s("span",{class:"token punctuation"},">")]),a("Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License"),s("span",{class:"token tag"},[s("span",{class:"token tag"},[s("span",{class:"token punctuation"},"")]),a(".\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br"),s("span",{class:"line-number"},"9"),s("br"),s("span",{class:"line-number"},"10"),s("br")])],-1),Xs=s("div",{class:"language-markdown line-numbers-mode"},[s("pre",null,[s("code",null,[a("\\*\\*\n"),s("span",{class:"token bold"},[s("span",{class:"token punctuation"},"**"),s("span",{class:"token content"}," May you do good and not evil.\n"),s("span",{class:"token punctuation"},"**")]),a(" May you find forgiveness for yourself and forgive others.\n"),s("span",{class:"token bold"},[s("span",{class:"token punctuation"},"**"),s("span",{class:"token content"}," May you share freely, never taking more than you give.\n"),s("span",{class:"token punctuation"},"**")]),a("\n\\*\\*\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br")])],-1),Qs=s("div",{class:"language-markdown line-numbers-mode"},[s("pre",null,[s("code",null,"DBAD : DON'T BE A DICK PUBLIC LICENSE:\n\nDo whatever you like with the original work, just don't be a dick.\n\nBeing a dick includes - but is not limited to - the following instances:\n\n1a. Outright copyright infringement - Don't just copy this and change the name.\n1b. Selling the unmodified original with no work done what-so-ever,\nthat's REALLY being a dick.\n1c. Modifying the original work to contain hidden harmful content.\nThat would make you a PROPER dick.\n\nIf you become rich through modifications, related work services, or supporting\nthe original work, share the love. Only a dick would make loads off this work\nand not buy the original works creator(s) a pint.Code is provided with no\nwarranty. Using somebody else's code and bitching when it goes wrong makes\nyou a DONKEY dick. Fix the problem yourself. A non-dick would submit the fix\nback.\n")]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br"),s("span",{class:"line-number"},"9"),s("br"),s("span",{class:"line-number"},"10"),s("br"),s("span",{class:"line-number"},"11"),s("br"),s("span",{class:"line-number"},"12"),s("br"),s("span",{class:"line-number"},"13"),s("br"),s("span",{class:"line-number"},"14"),s("br"),s("span",{class:"line-number"},"15"),s("br"),s("span",{class:"line-number"},"16"),s("br"),s("span",{class:"line-number"},"17"),s("br"),s("span",{class:"line-number"},"18"),s("br")])],-1),Zs=s("div",{class:"language-markdown line-numbers-mode"},[s("pre",null,[s("code",null,"Homework Public License(HPL)\n\nCopyright (c) 2016 Yilong Liu\n\nThis is for your reference only,not for your cheating - Just don't be a dick.\n\nBeing a dick includes - but is not limited to - the following instances:\n\n1a. Outright copyright infringement - Don't just copy this and change the name.\n1b. Reserve a copy of this project and tell your teacher\nthat it is your own homework - Plagiarism is shame.\n\nIf you become rich through modifications, related work services,\nor supporting the original work, share the love. Only a dick would make loads\noff this work and not buy the original works creator(s) a pint.Code is\nprovided with no warranty. Using somebody else's code and bitching when it\ngoes wrong makes you a DONKEY dick. Fix the problem yourself. A non-dick\nwould submit the fix back.\n")]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br"),s("span",{class:"line-number"},"9"),s("br"),s("span",{class:"line-number"},"10"),s("br"),s("span",{class:"line-number"},"11"),s("br"),s("span",{class:"line-number"},"12"),s("br"),s("span",{class:"line-number"},"13"),s("br"),s("span",{class:"line-number"},"14"),s("br"),s("span",{class:"line-number"},"15"),s("br"),s("span",{class:"line-number"},"16"),s("br"),s("span",{class:"line-number"},"17"),s("br"),s("span",{class:"line-number"},"18"),s("br")])],-1),na=s("div",{class:"language-markdown line-numbers-mode"},[s("pre",null,[s("code",null,[a('The Star And Thank Author License (SATA)\n\nCopyright (c) 2016 sabertazimi(sabertazimi@gmail.com)\n\nProject Url: https://github.com/sabertazimi/Awesome-Notes\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the "Software"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nAnd wait, the most important, you shall star/+1/like the project(s) in project url\nsection above first, and then thank the author(s) in Copyright section.\n\nHere are some suggested ways:\n\n'),s("span",{class:"token list punctuation"},"-"),a(" Email the authors a thank-you letter, and make friends with him/her/them.\n"),s("span",{class:"token list punctuation"},"-"),a(" Report bugs or issues.\n"),s("span",{class:"token list punctuation"},"-"),a(" Tell friends what a wonderful project this is.\n"),s("span",{class:"token list punctuation"},"-"),a(' And, sure, you can just express thanks in your mind without telling the world.\n\nContributors of this project by forking have the option to add his/her name and\nforked project url at copyright and project url sections, but shall not delete\nor modify anything else in these two sections.\n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n')])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br"),s("span",{class:"line-number"},"9"),s("br"),s("span",{class:"line-number"},"10"),s("br"),s("span",{class:"line-number"},"11"),s("br"),s("span",{class:"line-number"},"12"),s("br"),s("span",{class:"line-number"},"13"),s("br"),s("span",{class:"line-number"},"14"),s("br"),s("span",{class:"line-number"},"15"),s("br"),s("span",{class:"line-number"},"16"),s("br"),s("span",{class:"line-number"},"17"),s("br"),s("span",{class:"line-number"},"18"),s("br"),s("span",{class:"line-number"},"19"),s("br"),s("span",{class:"line-number"},"20"),s("br"),s("span",{class:"line-number"},"21"),s("br"),s("span",{class:"line-number"},"22"),s("br"),s("span",{class:"line-number"},"23"),s("br"),s("span",{class:"line-number"},"24"),s("br"),s("span",{class:"line-number"},"25"),s("br"),s("span",{class:"line-number"},"26"),s("br"),s("span",{class:"line-number"},"27"),s("br"),s("span",{class:"line-number"},"28"),s("br"),s("span",{class:"line-number"},"29"),s("br"),s("span",{class:"line-number"},"30"),s("br"),s("span",{class:"line-number"},"31"),s("br"),s("span",{class:"line-number"},"32"),s("br"),s("span",{class:"line-number"},"33"),s("br"),s("span",{class:"line-number"},"34"),s("br"),s("span",{class:"line-number"},"35"),s("br"),s("span",{class:"line-number"},"36"),s("br"),s("span",{class:"line-number"},"37"),s("br")])],-1),ea=s("h3",{id:"teamwork"},[s("a",{class:"header-anchor",href:"#teamwork","aria-hidden":"true"},"#"),a(" Teamwork")],-1),sa=s("p",null,"如果在组织的托管空间创建版本库,一定要要为版本库指派一个拥有 Push 权限的团队,以免以“Fork + Pull”模式工作时,Pull Request 没有人响应。",-1),aa=s("h4",{id:"pull-request-work-flow"},[s("a",{class:"header-anchor",href:"#pull-request-work-flow","aria-hidden":"true"},"#"),a(" Pull Request Work Flow")],-1),la=s("ol",null,[s("li",null,"Fork it."),s("li",null,[a("Create your feature branch ("),s("code",null,"git checkout -b my-new-feature"),a(").")]),s("li",null,"Ensure tests are passing."),s("li",null,[a("Commit changes ("),s("code",null,"git commit -am 'Add some feature'"),a(").")]),s("li",null,[a("Push to the branch ("),s("code",null,"git push origin my-new-feature"),a(").")]),s("li",null,"Create new Pull Request.")],-1),ta=s("h3",{id:"github-cli-tool"},[s("a",{class:"header-anchor",href:"#github-cli-tool","aria-hidden":"true"},"#"),a(" GitHub CLI Tool")],-1),ia=s("h4",{id:"cli-installation"},[s("a",{class:"header-anchor",href:"#cli-installation","aria-hidden":"true"},"#"),a(" CLI Installation")],-1),ra=s("p",null,[a("Install "),s("code",null,"gh"),a(" by "),s("code",null,"apt"),a(", according of "),s("a",{href:"https://github.com/cli/cli/blob/trunk/docs/install_linux.md",target:"_blank",rel:"noopener noreferrer"},"official introduction"),a(".")],-1),oa=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,"gh auth login\n")]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),ca=s("h4",{id:"gh-issue-usage"},[s("a",{class:"header-anchor",href:"#gh-issue-usage","aria-hidden":"true"},"#"),a(" GH Issue Usage")],-1),ua=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,"gh issue create\ngh issue close\ngh issue status\ngh issue list\n")]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br")])],-1),pa=s("h4",{id:"gh-pr-usage"},[s("a",{class:"header-anchor",href:"#gh-pr-usage","aria-hidden":"true"},"#"),a(" GH PR Usage")],-1),ba=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[a("gh "),s("span",{class:"token function"},"pr"),a(" checkout\ngh "),s("span",{class:"token function"},"pr"),a(" create\ngh "),s("span",{class:"token function"},"pr"),a(" close\ngh "),s("span",{class:"token function"},"pr"),a(" merge\ngh "),s("span",{class:"token function"},"pr"),a(" status\ngh "),s("span",{class:"token function"},"pr"),a(" list\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br")])],-1),da=s("h4",{id:"gh-repo-usage"},[s("a",{class:"header-anchor",href:"#gh-repo-usage","aria-hidden":"true"},"#"),a(" GH Repo Usage")],-1),ma=s("p",null,"Clone repo:",-1),ha=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[a("gh repo clone cli/cli\n\n"),s("span",{class:"token comment"},"# fastest way to clone authorized user repos"),a("\ngh "),s("span",{class:"token builtin class-name"},"alias"),a(),s("span",{class:"token builtin class-name"},"set"),a(" rc "),s("span",{class:"token string"},"'repo clone'"),a("\ngh rc dragon\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br")])],-1),ga=s("p",null,"Create repo:",-1),ka=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token comment"},"# create a repository under your account using the current directory name"),a("\n$ "),s("span",{class:"token function"},"git"),a(" init my-project\n$ "),s("span",{class:"token builtin class-name"},"cd"),a(" my-project\n$ gh repo create\n\n"),s("span",{class:"token comment"},"# create a repository with a specific name"),a("\n$ gh repo create my-project\n\n"),s("span",{class:"token comment"},"# create a repository in an organization"),a("\n$ gh repo create cli/my-project\n\n"),s("span",{class:"token comment"},"# disable issues and wiki"),a("\n$ gh repo create --enable-issues"),s("span",{class:"token operator"},"="),a("false --enable-wiki"),s("span",{class:"token operator"},"="),a("false\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br"),s("span",{class:"line-number"},"9"),s("br"),s("span",{class:"line-number"},"10"),s("br"),s("span",{class:"line-number"},"11"),s("br"),s("span",{class:"line-number"},"12"),s("br"),s("span",{class:"line-number"},"13"),s("br")])],-1),fa=s("p",null,"Push repo:",-1),va=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" init\n\n"),s("span",{class:"token builtin class-name"},"echo"),a(),s("span",{class:"token string"},'"# RepoName"'),a(),s("span",{class:"token operator"},">>"),a(" README.md\n"),s("span",{class:"token function"},"git"),a(),s("span",{class:"token function"},"add"),a(" README.md\n"),s("span",{class:"token function"},"git"),a(" commit -m "),s("span",{class:"token string"},'"Initial commit"'),a("\n\n"),s("span",{class:"token function"},"git"),a(" remote "),s("span",{class:"token function"},"add"),a(" origin git@github.com:username/RepoName.git\n"),s("span",{class:"token function"},"git"),a(" push -u origin master\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br")])],-1),wa=s("p",null,"List repo:",-1),ya=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,"gh repo list sabertazimi\n")]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),xa=s("h3",{id:"wiki"},[s("a",{class:"header-anchor",href:"#wiki","aria-hidden":"true"},"#"),a(" Wiki")],-1),Ca=s("h4",{id:"wiki-git-access"},[s("a",{class:"header-anchor",href:"#wiki-git-access","aria-hidden":"true"},"#"),a(" Wiki Git Access")],-1),Aa=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" clone git@github.com:user/repo.wiki.git\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Ga=s("h3",{id:"shorten-github-url"},[s("a",{class:"header-anchor",href:"#shorten-github-url","aria-hidden":"true"},"#"),a(" Shorten GitHub URL")],-1),Ia=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"curl"),a(" -i http://git.io -F "),s("span",{class:"token string"},'"url=https://github.com/technoweenie"'),a(" -F "),s("span",{class:"token string"},'"code=t"'),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Ea=s("h3",{id:"github-flavored-markdown"},[s("a",{class:"header-anchor",href:"#github-flavored-markdown","aria-hidden":"true"},"#"),a(" GitHub Flavored Markdown")],-1),Ta=s("h4",{id:"link"},[s("a",{class:"header-anchor",href:"#link","aria-hidden":"true"},"#"),a(" Link")],-1),Na=s("h5",{id:"tooltip-of-link"},[s("a",{class:"header-anchor",href:"#tooltip-of-link","aria-hidden":"true"},"#"),a(" Tooltip of Link")],-1),Oa=s("div",{class:"language-md line-numbers-mode"},[s("pre",null,[s("code",null,"This is a [link to a web page](https://url.com 'This title will appear as a tooltip').\n")]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Ra=s("div",{class:"language-md line-numbers-mode"},[s("pre",null,[s("code",null,"![Alt text](https://imageurl.com 'This is a title')\n")]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Sa=s("h5",{id:"label-of-link"},[s("a",{class:"header-anchor",href:"#label-of-link","aria-hidden":"true"},"#"),a(" Label of Link")],-1),Ha=s("div",{class:"language-md line-numbers-mode"},[s("pre",null,[s("code",null,[a("This is a "),s("span",{class:"token url"},[a("["),s("span",{class:"token content"},"link to a web page"),a("]["),s("span",{class:"token variable"},"mylabel"),a("]")]),a(".\n\nThen at the end of the document …\n\n"),s("span",{class:"token url-reference url"},[s("span",{class:"token punctuation"},"["),s("span",{class:"token variable"},"mylabel"),s("span",{class:"token punctuation"},"]"),s("span",{class:"token punctuation"},":"),a(" https://url.com "),s("span",{class:"token string"},"'Optional title'")]),a("\n"),s("span",{class:"token url-reference url"},[s("span",{class:"token punctuation"},"["),s("span",{class:"token variable"},"mylabel"),s("span",{class:"token punctuation"},"]"),s("span",{class:"token punctuation"},":"),a(" https://url.com "),s("span",{class:"token string"},"'Optional title'")]),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br")])],-1),La=s("div",{class:"language-md line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token url"},[s("span",{class:"token operator"},"!"),a("["),s("span",{class:"token content"},"Alt text"),a("]["),s("span",{class:"token variable"},"mylabel"),a("]")]),a("\n\n"),s("span",{class:"token url-reference url"},[s("span",{class:"token punctuation"},"["),s("span",{class:"token variable"},"mylabel"),s("span",{class:"token punctuation"},"]"),s("span",{class:"token punctuation"},":"),a(" https://imageurl.com "),s("span",{class:"token string"},"'This is a title'")]),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br")])],-1),ja=s("h3",{id:"github-pages"},[s("a",{class:"header-anchor",href:"#github-pages","aria-hidden":"true"},"#"),a(" GitHub Pages")],-1),Da=s("p",null,[a("In "),s("code",null,"https://github.com///settings/pages"),a(", setup "),s("code",null,"source"),a(" of pages and "),s("code",null,"Enforce HTTPS"),a(".")],-1),Pa=s("h2",{id:"git-tools"},[s("a",{class:"header-anchor",href:"#git-tools","aria-hidden":"true"},"#"),a(" Git Tools")],-1),Ba=s("h3",{id:"diff-and-patch"},[s("a",{class:"header-anchor",href:"#diff-and-patch","aria-hidden":"true"},"#"),a(" Diff and Patch")],-1),_a=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"diff"),a(" -u "),s("span",{class:"token operator"},"<"),a("src"),s("span",{class:"token operator"},">"),a(),s("span",{class:"token operator"},"<"),a("dist"),s("span",{class:"token operator"},">"),a("\n"),s("span",{class:"token function"},"diff"),a(" -Nur "),s("span",{class:"token operator"},"<"),a("src_dir"),s("span",{class:"token operator"},">"),a(),s("span",{class:"token operator"},"<"),a("dist_dir"),s("span",{class:"token operator"},">"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),Ma=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[a("patch -p"),s("span",{class:"token punctuation"},"["),a("num"),s("span",{class:"token punctuation"},"]"),a(),s("span",{class:"token operator"},"<"),a(" patchFile\npatch -dry -run -p"),s("span",{class:"token punctuation"},"["),a("num"),s("span",{class:"token punctuation"},"]"),a(),s("span",{class:"token operator"},"<"),a(" patchFile\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),Fa=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"diff"),a(" -Nur program_1.0 program_2.0 "),s("span",{class:"token operator"},">"),a(" program_2.0.patch\npatch -p1 "),s("span",{class:"token operator"},"<"),s("span",{class:"token punctuation"},".."),a("/program_2.0.patch\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),Ua=s("h3",{id:"semantic-git-commit-message"},[s("a",{class:"header-anchor",href:"#semantic-git-commit-message","aria-hidden":"true"},"#"),a(" Semantic Git Commit Message")],-1),$a=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/commitizen/cz-cli",target:"_blank",rel:"noopener noreferrer"},"cz-cli")]),s("li",null,[s("a",{href:"https://github.com/commitizen/cz-conventional-changelog",target:"_blank",rel:"noopener noreferrer"},"cz-conventional-changelog")]),s("li",null,[s("a",{href:"https://github.com/conventional-changelog/commitlint",target:"_blank",rel:"noopener noreferrer"},"Commit Linter")])],-1),qa=s("h3",{id:"changelog-generator"},[s("a",{class:"header-anchor",href:"#changelog-generator","aria-hidden":"true"},"#"),a(" Changelog Generator")],-1),za=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/conventional-changelog/standard-version",target:"_blank",rel:"noopener noreferrer"},"standard-version")])],-1),Wa=s("h3",{id:"purge-tool"},[s("a",{class:"header-anchor",href:"#purge-tool","aria-hidden":"true"},"#"),a(" Purge Tool")],-1),Ya=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" rev-list --objects --all\n"),s("span",{class:"token punctuation"},"\\"),a(),s("span",{class:"token operator"},"|"),a(),s("span",{class:"token function"},"grep"),a(),s("span",{class:"token string"},[a('"'),s("span",{class:"token variable"},[s("span",{class:"token variable"},"$("),s("span",{class:"token function"},"git"),a(" verify-pack -v .git/objects/pack/*.idx\n"),s("span",{class:"token punctuation"},"\\"),a(),s("span",{class:"token operator"},"|"),a(),s("span",{class:"token function"},"sort"),a(" -k "),s("span",{class:"token number"},"3"),a(" -n "),s("span",{class:"token operator"},"|"),a(),s("span",{class:"token function"},"tail"),a(" -5 "),s("span",{class:"token operator"},"|"),a(),s("span",{class:"token function"},"awk"),a(),s("span",{class:"token string"},"'{print$1}'"),s("span",{class:"token variable"},")")]),a('"')]),a("\n"),s("span",{class:"token function"},"git"),a(" filter-branch -f --prune-empty --index-filter\n"),s("span",{class:"token punctuation"},"\\"),a(),s("span",{class:"token string"},"'git rm -rf --cached --ignore-unmatch your-file-name'"),a("\n"),s("span",{class:"token punctuation"},"\\"),a(" --tag-name-filter "),s("span",{class:"token function"},"cat"),a(" -- --all\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br")])],-1),Va=s("h2",{id:"commands-list"},[s("a",{class:"header-anchor",href:"#commands-list","aria-hidden":"true"},"#"),a(" Commands List")],-1),Ka=s("h3",{id:"basic-commands"},[s("a",{class:"header-anchor",href:"#basic-commands","aria-hidden":"true"},"#"),a(" Basic Commands")],-1),Ja=s("h4",{id:"git-config"},[s("a",{class:"header-anchor",href:"#git-config","aria-hidden":"true"},"#"),a(" git config")],-1),Xa=s("h4",{id:"git-help"},[s("a",{class:"header-anchor",href:"#git-help","aria-hidden":"true"},"#"),a(" git help")],-1),Qa=s("h4",{id:"git-init"},[s("a",{class:"header-anchor",href:"#git-init","aria-hidden":"true"},"#"),a(" git init")],-1),Za=s("h4",{id:"git-clone"},[s("a",{class:"header-anchor",href:"#git-clone","aria-hidden":"true"},"#"),a(" git clone")],-1),nl=s("p",null,"clone specific branch",-1),el=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" clone -b branch_name repo_url\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),sl=s("h4",{id:"git-add"},[s("a",{class:"header-anchor",href:"#git-add","aria-hidden":"true"},"#"),a(" git add")],-1),al=s("h4",{id:"git-status"},[s("a",{class:"header-anchor",href:"#git-status","aria-hidden":"true"},"#"),a(" git status")],-1),ll=s("h4",{id:"git-diff"},[s("a",{class:"header-anchor",href:"#git-diff","aria-hidden":"true"},"#"),a(" git diff")],-1),tl=s("h4",{id:"git-difftool"},[s("a",{class:"header-anchor",href:"#git-difftool","aria-hidden":"true"},"#"),a(" git difftool")],-1),il=s("p",null,"外置 diff 工具",-1),rl=s("h4",{id:"git-commit"},[s("a",{class:"header-anchor",href:"#git-commit","aria-hidden":"true"},"#"),a(" git commit")],-1),ol=s("h4",{id:"git-reset"},[s("a",{class:"header-anchor",href:"#git-reset","aria-hidden":"true"},"#"),a(" git reset")],-1),cl=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" reset "),s("span",{class:"token variable"},[s("span",{class:"token variable"},"$("),s("span",{class:"token function"},"git"),a(" merge-base master "),s("span",{class:"token punctuation"},"$("),a("git rev-parse --abbrev-ref HEAD"),s("span",{class:"token punctuation"},")"),s("span",{class:"token variable"},")")]),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),ul=s("ul",null,[s("li",null,[s("code",null,"git rev-parse --abbrev-rev HEAD"),a(" will return the name of the branch currently on")]),s("li",null,[s("code",null,"git merge-base master $(name of your branch)"),a(" will find the best common ancestor between master and current branch")]),s("li",null,[s("code",null,"git reset $(hash of the branch creation)"),a(" will undo all the commits, merges, rebase (preserving changes to the code)")])],-1),pl=s("h4",{id:"git-rm"},[s("a",{class:"header-anchor",href:"#git-rm","aria-hidden":"true"},"#"),a(" git rm")],-1),bl=s("h4",{id:"git-mv"},[s("a",{class:"header-anchor",href:"#git-mv","aria-hidden":"true"},"#"),a(" git mv")],-1),dl=s("h4",{id:"git-clean"},[s("a",{class:"header-anchor",href:"#git-clean","aria-hidden":"true"},"#"),a(" git clean")],-1),ml=s("p",null,"从工作区中移除不想要的文件。可以是编译的临时文件或者合并冲突的文件。",-1),hl=s("h4",{id:"git-branch"},[s("a",{class:"header-anchor",href:"#git-branch","aria-hidden":"true"},"#"),a(" git branch")],-1),gl=s("h4",{id:"git-checkout"},[s("a",{class:"header-anchor",href:"#git-checkout","aria-hidden":"true"},"#"),a(" git checkout")],-1),kl=s("h4",{id:"git-merge"},[s("a",{class:"header-anchor",href:"#git-merge","aria-hidden":"true"},"#"),a(" git merge")],-1),fl=s("h4",{id:"git-mergetool"},[s("a",{class:"header-anchor",href:"#git-mergetool","aria-hidden":"true"},"#"),a(" git mergetool")],-1),vl=s("p",null,"外置 merge 工具",-1),wl=s("h4",{id:"git-log"},[s("a",{class:"header-anchor",href:"#git-log","aria-hidden":"true"},"#"),a(" git log")],-1),yl=s("h4",{id:"git-stash"},[s("a",{class:"header-anchor",href:"#git-stash","aria-hidden":"true"},"#"),a(" git stash")],-1),xl=s("p",null,"临时地保存一些还没有提交的工作,以便在分支上不需要提交未完成工作就可以清理工作目录。",-1),Cl=s("h4",{id:"git-tag"},[s("a",{class:"header-anchor",href:"#git-tag","aria-hidden":"true"},"#"),a(" git tag")],-1),Al=s("h4",{id:"git-fetch"},[s("a",{class:"header-anchor",href:"#git-fetch","aria-hidden":"true"},"#"),a(" git fetch")],-1),Gl=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" fetch "),s("span",{class:"token operator"},"<"),a("repo_name"),s("span",{class:"token operator"},">"),a(),s("span",{class:"token operator"},"<"),a("branch_name"),s("span",{class:"token operator"},">"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Il=s("h4",{id:"git-pull"},[s("a",{class:"header-anchor",href:"#git-pull","aria-hidden":"true"},"#"),a(" git pull")],-1),El=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" pull --rebase\n"),s("span",{class:"token function"},"git"),a(" pull --allow-unrelated-histories\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),Tl=s("h4",{id:"git-push"},[s("a",{class:"header-anchor",href:"#git-push","aria-hidden":"true"},"#"),a(" git push")],-1),Nl=s("h4",{id:"git-remote"},[s("a",{class:"header-anchor",href:"#git-remote","aria-hidden":"true"},"#"),a(" git remote")],-1),Ol=s("h4",{id:"git-archive"},[s("a",{class:"header-anchor",href:"#git-archive","aria-hidden":"true"},"#"),a(" git archive")],-1),Rl=s("p",null,"创建项目一个指定快照的归档文件",-1),Sl=s("h4",{id:"git-submodule"},[s("a",{class:"header-anchor",href:"#git-submodule","aria-hidden":"true"},"#"),a(" git submodule")],-1),Hl=s("p",null,"管理一个仓库的其他外部仓库。 它可以被用在库或者其他类型的共 享资源上.submodule 命令有几个子命令, 如( add 、 update 、 sync 等等)用来管理这些 资源.",-1),Ll=s("ul",null,[s("li",null,"add submodule")],-1),jl=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" submodule "),s("span",{class:"token function"},"add"),a(" git://github.com/rack/rack.git ./lib/rack\n"),s("span",{class:"token function"},"cat"),a(" .gitmodules\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),Dl=s("ul",null,[s("li",null,"get submodule")],-1),Pl=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" submodule init\n"),s("span",{class:"token function"},"git"),a(" submodule update\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),Bl=s("ul",null,[s("li",null,"sync submodule")],-1),_l=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" pull origin/master --rebase\n"),s("span",{class:"token function"},"git"),a(" submodule update\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),Ml=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" submodule update --init --force --remote\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Fl=s("h3",{id:"检查与比较"},[s("a",{class:"header-anchor",href:"#检查与比较","aria-hidden":"true"},"#"),a(" 检查与比较")],-1),Ul=s("h4",{id:"git-show"},[s("a",{class:"header-anchor",href:"#git-show","aria-hidden":"true"},"#"),a(" git show")],-1),$l=s("h4",{id:"git-shortlog"},[s("a",{class:"header-anchor",href:"#git-shortlog","aria-hidden":"true"},"#"),a(" git shortlog")],-1),ql=s("p",null,"创建一个漂亮的 changelog 文件",-1),zl=s("h4",{id:"git-describe"},[s("a",{class:"header-anchor",href:"#git-describe","aria-hidden":"true"},"#"),a(" git describe")],-1),Wl=s("p",null,"接受任何可以解析成一个提交的东西,然后生成一个人类可读的字符串且不可变。 这是一种获得一个提交的描述的方式,它跟一个提交的 SHA-1 值一样是无歧义,但是更具可读性。",-1),Yl=s("h3",{id:"调试"},[s("a",{class:"header-anchor",href:"#调试","aria-hidden":"true"},"#"),a(" 调试")],-1),Vl=s("h4",{id:"git-bisect"},[s("a",{class:"header-anchor",href:"#git-bisect","aria-hidden":"true"},"#"),a(" git bisect")],-1),Kl=s("p",null,"通过自动进行一个二分查找来找到哪一个特定的提交是导致 bug 或者问题的第一个提交。",-1),Jl=s("h4",{id:"git-blame"},[s("a",{class:"header-anchor",href:"#git-blame","aria-hidden":"true"},"#"),a(" git blame")],-1),Xl=s("h4",{id:"git-grep"},[s("a",{class:"header-anchor",href:"#git-grep","aria-hidden":"true"},"#"),a(" git grep")],-1),Ql=s("p",null,"查找任何字符串或者正则表达式",-1),Zl=s("h3",{id:"补丁"},[s("a",{class:"header-anchor",href:"#补丁","aria-hidden":"true"},"#"),a(" 补丁")],-1),nt=s("h4",{id:"git-cherry-pick"},[s("a",{class:"header-anchor",href:"#git-cherry-pick","aria-hidden":"true"},"#"),a(" git cherry-pick")],-1),et=s("p",null,"获得在单个提交中引入的变更,然后尝试将作为一个新的提交引入到你当前分支上",-1),st=s("h4",{id:"git-rebase"},[s("a",{class:"header-anchor",href:"#git-rebase","aria-hidden":"true"},"#"),a(" git rebase")],-1),at=s("h4",{id:"git-revert"},[s("a",{class:"header-anchor",href:"#git-revert","aria-hidden":"true"},"#"),a(" git revert")],-1),lt=s("h3",{id:"邮件"},[s("a",{class:"header-anchor",href:"#邮件","aria-hidden":"true"},"#"),a(" 邮件")],-1),tt=s("h4",{id:"git-apply"},[s("a",{class:"header-anchor",href:"#git-apply","aria-hidden":"true"},"#"),a(" git apply")],-1),it=s("p",null,"应用一个通过 git diff 或者甚至使用 GNU diff 命令创建的补丁",-1),rt=s("h4",{id:"git-am"},[s("a",{class:"header-anchor",href:"#git-am","aria-hidden":"true"},"#"),a(" git am")],-1),ot=s("p",null,"应用来自邮箱的补丁",-1),ct=s("h4",{id:"git-format-patch"},[s("a",{class:"header-anchor",href:"#git-format-patch","aria-hidden":"true"},"#"),a(" git format-patch")],-1),ut=s("p",null,"mailbox 的格式来生成一系列的补丁以便你可以发送到一个邮件列表中",-1),pt=s("h4",{id:"git-imap-send"},[s("a",{class:"header-anchor",href:"#git-imap-send","aria-hidden":"true"},"#"),a(" git imap-send")],-1),bt=s("p",null,"将一个由 git format-patch 生成的邮箱上传至 IMAP 草稿文件夹",-1),dt=s("h4",{id:"git-send-email"},[s("a",{class:"header-anchor",href:"#git-send-email","aria-hidden":"true"},"#"),a(" git send-email")],-1),mt=s("p",null,"通过邮件发送那些使用 git format-patch 生成的补丁",-1),ht=s("h4",{id:"git-request-pull"},[s("a",{class:"header-anchor",href:"#git-request-pull","aria-hidden":"true"},"#"),a(" git request-pull")],-1),gt=s("h3",{id:"外部系统"},[s("a",{class:"header-anchor",href:"#外部系统","aria-hidden":"true"},"#"),a(" 外部系统")],-1),kt=s("h4",{id:"git-svn"},[s("a",{class:"header-anchor",href:"#git-svn","aria-hidden":"true"},"#"),a(" git svn")],-1),ft=s("h4",{id:"git-fast-import"},[s("a",{class:"header-anchor",href:"#git-fast-import","aria-hidden":"true"},"#"),a(" git fast-import")],-1),vt=s("p",null,"对于其他版本控制系统或者从其他任何的格式导入,你可以使用 git fast-import 快速地将其他格式映射到 Git 可以轻松记录的格式",-1),wt=s("h3",{id:"管理"},[s("a",{class:"header-anchor",href:"#管理","aria-hidden":"true"},"#"),a(" 管理")],-1),yt=s("h4",{id:"git-gc"},[s("a",{class:"header-anchor",href:"#git-gc","aria-hidden":"true"},"#"),a(" git gc")],-1),xt=s("p",null,"在你的仓库中执行 ``garbage collection'' ,删除数据库中不需要的文件和将其他文件打包成一种更有效的格式",-1),Ct=s("h4",{id:"git-fsck"},[s("a",{class:"header-anchor",href:"#git-fsck","aria-hidden":"true"},"#"),a(" git fsck")],-1),At=s("p",null,"检查内部数据库的问题或者不一致性",-1),Gt=s("h4",{id:"git-reflog"},[s("a",{class:"header-anchor",href:"#git-reflog","aria-hidden":"true"},"#"),a(" git reflog")],-1),It=s("p",null,"分析你所有分支的头指针的日志来查找出你在重写历史上可能丢失的提交",-1),Et=s("h4",{id:"git-filter-branch"},[s("a",{class:"header-anchor",href:"#git-filter-branch","aria-hidden":"true"},"#"),a(" git filter-branch")],-1),Tt=s("p",null,"根据某些规则来重写大量的提交记录,例如从任何地方删除文件,或者通过过滤一个仓库中的一个单独的子目录以提取出一个项目",-1),Nt=s("h4",{id:"git-note"},[s("a",{class:"header-anchor",href:"#git-note","aria-hidden":"true"},"#"),a(" git-note")],-1),Ot=s("p",null,"为特定 commit 添加 note,一个 commit 只能有一个 note",-1);t.render=function(s,a,l,t,Rt,St){return n(),e("div",null,[i,r,o,c,u,p,b,d,m,h,g,k,f,v,w,y,x,C,A,G,I,E,T,N,O,R,S,H,L,j,D,P,B,_,M,F,U,$,q,z,W,Y,V,K,J,X,Q,Z,nn,en,sn,an,ln,tn,rn,on,cn,un,pn,bn,dn,mn,hn,gn,kn,fn,vn,wn,yn,xn,Cn,An,Gn,In,En,Tn,Nn,On,Rn,Sn,Hn,Ln,jn,Dn,Pn,Bn,_n,Mn,Fn,Un,$n,qn,zn,Wn,Yn,Vn,Kn,Jn,Xn,Qn,Zn,ne,ee,se,ae,le,te,ie,re,oe,ce,ue,pe,be,de,me,he,ge,ke,fe,ve,we,ye,xe,Ce,Ae,Ge,Ie,Ee,Te,Ne,Oe,Re,Se,He,Le,je,De,Pe,Be,_e,Me,Fe,Ue,$e,qe,ze,We,Ye,Ve,Ke,Je,Xe,Qe,Ze,ns,es,ss,as,ls,ts,is,rs,os,cs,us,ps,bs,ds,ms,hs,gs,ks,fs,vs,ws,ys,xs,Cs,As,Gs,Is,Es,Ts,Ns,Os,Rs,Ss,Hs,Ls,js,Ds,Ps,Bs,_s,Ms,Fs,Us,$s,qs,zs,Ws,Ys,Vs,Ks,Js,Xs,Qs,Zs,na,ea,sa,aa,la,ta,ia,ra,oa,ca,ua,pa,ba,da,ma,ha,ga,ka,fa,va,wa,ya,xa,Ca,Aa,Ga,Ia,Ea,Ta,Na,Oa,Ra,Sa,Ha,La,ja,Da,Pa,Ba,_a,Ma,Fa,Ua,$a,qa,za,Wa,Ya,Va,Ka,Ja,Xa,Qa,Za,nl,el,sl,al,ll,tl,il,rl,ol,cl,ul,pl,bl,dl,ml,hl,gl,kl,fl,vl,wl,yl,xl,Cl,Al,Gl,Il,El,Tl,Nl,Ol,Rl,Sl,Hl,Ll,jl,Dl,Pl,Bl,_l,Ml,Fl,Ul,$l,ql,zl,Wl,Yl,Vl,Kl,Jl,Xl,Ql,Zl,nt,et,st,at,lt,tt,it,rt,ot,ct,ut,pt,bt,dt,mt,ht,gt,kt,ft,vt,wt,yt,xt,Ct,At,Gt,It,Et,Tt,Nt,Ot])};export default t;export{l as __pageData}; diff --git a/assets/programming_tools_git_gitBasicNotes.md.abd5ba70.lean.js b/assets/programming_tools_git_gitBasicNotes.md.abd5ba70.lean.js new file mode 100644 index 00000000000..07d85e20c30 --- /dev/null +++ b/assets/programming_tools_git_gitBasicNotes.md.abd5ba70.lean.js @@ -0,0 +1 @@ +import{o as n,c as e,b as s,d as a}from"./app.6dd2a1b7.js";const l='{"title":"Git Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Git Configuration","slug":"git-configuration"},{"level":3,"title":"Basic Configuration","slug":"basic-configuration"},{"level":3,"title":"Proxy Configuration","slug":"proxy-configuration"},{"level":3,"title":"List and Help","slug":"list-and-help"},{"level":2,"title":"File State","slug":"file-state"},{"level":2,"title":"Git Ignore File","slug":"git-ignore-file"},{"level":2,"title":"Diff","slug":"diff"},{"level":2,"title":"Add","slug":"add"},{"level":2,"title":"Commit","slug":"commit"},{"level":3,"title":"Commit Style Guide","slug":"commit-style-guide"},{"level":2,"title":"Stash","slug":"stash"},{"level":2,"title":"Revert","slug":"revert"},{"level":2,"title":"Remove","slug":"remove"},{"level":2,"title":"Move","slug":"move"},{"level":2,"title":"Log","slug":"log"},{"level":3,"title":"Pretty Format","slug":"pretty-format"},{"level":3,"title":"Log Options","slug":"log-options"},{"level":2,"title":"Reflog","slug":"reflog"},{"level":2,"title":"Show","slug":"show"},{"level":2,"title":"Remote","slug":"remote"},{"level":2,"title":"Tag","slug":"tag"},{"level":2,"title":"Alias","slug":"alias"},{"level":2,"title":"Merge","slug":"merge"},{"level":2,"title":"Rebase","slug":"rebase"},{"level":2,"title":"Branch","slug":"branch"},{"level":3,"title":"Basic Workflow Commands","slug":"basic-workflow-commands"},{"level":3,"title":"Advanced Branch Workflow","slug":"advanced-branch-workflow"},{"level":2,"title":"Git Inside","slug":"git-inside"},{"level":3,"title":"Add Inside","slug":"add-inside"},{"level":3,"title":"Commit Inside","slug":"commit-inside"},{"level":3,"title":"Checkout Inside","slug":"checkout-inside"},{"level":3,"title":"Merge Inside","slug":"merge-inside"},{"level":3,"title":"Fetch Inside","slug":"fetch-inside"},{"level":3,"title":"Clone Inside","slug":"clone-inside"},{"level":3,"title":"Push Inside","slug":"push-inside"},{"level":3,"title":"HEAD Branch Inside","slug":"head-branch-inside"},{"level":3,"title":"Git Objects","slug":"git-objects"},{"level":2,"title":"GitHub","slug":"github"},{"level":3,"title":"GPG Usage","slug":"gpg-usage"},{"level":3,"title":"LICENSE","slug":"license"},{"level":3,"title":"Teamwork","slug":"teamwork"},{"level":3,"title":"GitHub CLI Tool","slug":"github-cli-tool"},{"level":3,"title":"Wiki","slug":"wiki"},{"level":3,"title":"Shorten GitHub URL","slug":"shorten-github-url"},{"level":3,"title":"GitHub Flavored Markdown","slug":"github-flavored-markdown"},{"level":3,"title":"GitHub Pages","slug":"github-pages"},{"level":2,"title":"Git Tools","slug":"git-tools"},{"level":3,"title":"Diff and Patch","slug":"diff-and-patch"},{"level":3,"title":"Semantic Git Commit Message","slug":"semantic-git-commit-message"},{"level":3,"title":"Changelog Generator","slug":"changelog-generator"},{"level":3,"title":"Purge Tool","slug":"purge-tool"},{"level":2,"title":"Commands List","slug":"commands-list"},{"level":3,"title":"Basic Commands","slug":"basic-commands"},{"level":3,"title":"检查与比较","slug":"检查与比较"},{"level":3,"title":"调试","slug":"调试"},{"level":3,"title":"补丁","slug":"补丁"},{"level":3,"title":"邮件","slug":"邮件"},{"level":3,"title":"外部系统","slug":"外部系统"},{"level":3,"title":"管理","slug":"管理"}],"relativePath":"programming/tools/git/gitBasicNotes.md","lastUpdated":1627953616000}',t={},i=s("h1",{id:"git-basic-notes"},[s("a",{class:"header-anchor",href:"#git-basic-notes","aria-hidden":"true"},"#"),a(" Git Basic Notes")],-1),r=s("p",null,[s("div",{class:"table-of-contents"},[s("ul",null,[s("li",null,[s("a",{href:"#git-basic-notes"},"Git Basic Notes"),s("ul",null,[s("li",null,[s("a",{href:"#git-configuration"},"Git Configuration")]),s("li",null,[s("a",{href:"#file-state"},"File State")]),s("li",null,[s("a",{href:"#git-ignore-file"},"Git Ignore File")]),s("li",null,[s("a",{href:"#diff"},"Diff")]),s("li",null,[s("a",{href:"#add"},"Add")]),s("li",null,[s("a",{href:"#commit"},"Commit")]),s("li",null,[s("a",{href:"#stash"},"Stash")]),s("li",null,[s("a",{href:"#revert"},"Revert")]),s("li",null,[s("a",{href:"#remove"},"Remove")]),s("li",null,[s("a",{href:"#move"},"Move")]),s("li",null,[s("a",{href:"#log"},"Log")]),s("li",null,[s("a",{href:"#reflog"},"Reflog")]),s("li",null,[s("a",{href:"#show"},"Show")]),s("li",null,[s("a",{href:"#remote"},"Remote")]),s("li",null,[s("a",{href:"#tag"},"Tag")]),s("li",null,[s("a",{href:"#alias"},"Alias")]),s("li",null,[s("a",{href:"#merge"},"Merge")]),s("li",null,[s("a",{href:"#rebase"},"Rebase")]),s("li",null,[s("a",{href:"#branch"},"Branch")]),s("li",null,[s("a",{href:"#git-inside"},"Git Inside")]),s("li",null,[s("a",{href:"#github"},"GitHub")]),s("li",null,[s("a",{href:"#git-tools"},"Git Tools")]),s("li",null,[s("a",{href:"#commands-list"},"Commands List")])])])])])],-1),o=s("h2",{id:"git-configuration"},[s("a",{class:"header-anchor",href:"#git-configuration","aria-hidden":"true"},"#"),a(" Git Configuration")],-1),c=s("ul",null,[s("li",null,"/etc/gitconfig"),s("li",null,"~/.gitconfig 或 ~/.config/git/config"),s("li",null,"repo/.git/config")],-1),u=s("h3",{id:"basic-configuration"},[s("a",{class:"header-anchor",href:"#basic-configuration","aria-hidden":"true"},"#"),a(" Basic Configuration")],-1),p=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" config --global user.name "),s("span",{class:"token string"},'"sabertazimi"'),a("\n"),s("span",{class:"token function"},"git"),a(" config --global user.email sabertazimi@gmail.com\n"),s("span",{class:"token function"},"git"),a(" config --global core.editor "),s("span",{class:"token function"},"vim"),a("\n"),s("span",{class:"token function"},"git"),a(" config --global credential.helper store\n"),s("span",{class:"token function"},"git"),a(" config --global color.ui "),s("span",{class:"token boolean"},"true"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br")])],-1),b=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" config --global commit.template "),s("span",{class:"token environment constant"},"$HOME"),a("/.GitCommit.md\n"),s("span",{class:"token function"},"git"),a(" config --global commit.gpgsign "),s("span",{class:"token boolean"},"true"),a("\n"),s("span",{class:"token function"},"git"),a(" config --global user.signingkey "),s("span",{class:"token operator"},"<"),a("pub-keyID"),s("span",{class:"token operator"},">"),a("\n\n"),s("span",{class:"token function"},"git"),a(" config --global push.default simple\n"),s("span",{class:"token function"},"git"),a(" config --global merge.conflictstyle "),s("span",{class:"token function"},"diff3"),a("\n"),s("span",{class:"token function"},"git"),a(" config --global pull.rebase "),s("span",{class:"token boolean"},"true"),a("\n"),s("span",{class:"token function"},"git"),a(" config --global rebase.autoStash "),s("span",{class:"token boolean"},"true"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br")])],-1),d=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token comment"},"# after 1s, git auto correct wrong command"),a("\n"),s("span",{class:"token function"},"git"),a(" config --global help.autocorrect "),s("span",{class:"token number"},"10"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),m=s("h3",{id:"proxy-configuration"},[s("a",{class:"header-anchor",href:"#proxy-configuration","aria-hidden":"true"},"#"),a(" Proxy Configuration")],-1),h=s("ul",null,[s("li",null,[s("a",{href:"http://github.com.cnpmjs.org",target:"_blank",rel:"noopener noreferrer"},"github.com.cnpmjs.org")]),s("li",null,[s("a",{href:"http://hub.fastgit.org",target:"_blank",rel:"noopener noreferrer"},"hub.fastgit.org")]),s("li",null,[s("a",{href:"http://raw.fastgit.org",target:"_blank",rel:"noopener noreferrer"},"raw.fastgit.org")])],-1),g=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token comment"},"# speed up by cnpmjs"),a("\n"),s("span",{class:"token comment"},"# git clone/push/pull works"),a("\n"),s("span",{class:"token function"},"git"),a(" config --global url."),s("span",{class:"token string"},'"https://github.com.cnpmjs.org/"'),a(".insteadOf "),s("span",{class:"token string"},'"https://github.com/"'),a("\n\n"),s("span",{class:"token comment"},"# post buffer config"),a("\n"),s("span",{class:"token function"},"git"),a(" config --global http.postbuffer "),s("span",{class:"token number"},"524288000"),a("\n"),s("span",{class:"token function"},"git"),a(" config --global http.postbuffer "),s("span",{class:"token number"},"1048576000"),a("\n\n"),s("span",{class:"token comment"},"# proxy"),a("\n"),s("span",{class:"token function"},"git"),a(" config --global http.proxy "),s("span",{class:"token string"},"'socks5://127.0.0.1:1080'"),a("\n"),s("span",{class:"token function"},"git"),a(" config --global https.proxy "),s("span",{class:"token string"},"'socks5://127.0.0.1:1080'"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br"),s("span",{class:"line-number"},"9"),s("br"),s("span",{class:"line-number"},"10"),s("br"),s("span",{class:"line-number"},"11"),s("br")])],-1),k=s("h3",{id:"list-and-help"},[s("a",{class:"header-anchor",href:"#list-and-help","aria-hidden":"true"},"#"),a(" List and Help")],-1),f=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" config --list\n"),s("span",{class:"token function"},"git"),a(" --help\n"),s("span",{class:"token function"},"man"),a(" git-\n"),s("span",{class:"token function"},"git"),a(),s("span",{class:"token builtin class-name"},"help"),a("\n"),s("span",{class:"token function"},"git"),a(),s("span",{class:"token builtin class-name"},"help"),a(" config\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br")])],-1),v=s("h2",{id:"file-state"},[s("a",{class:"header-anchor",href:"#file-state","aria-hidden":"true"},"#"),a(" File State")],-1),w=s("ul",null,[s("li",null,"Untracked"),s("li",null,[a("Unmodified("),s("strong",null,"Stable State"),a(")")]),s("li",null,"Modified"),s("li",null,"Staged")],-1),y=s("h2",{id:"git-ignore-file"},[s("a",{class:"header-anchor",href:"#git-ignore-file","aria-hidden":"true"},"#"),a(" Git Ignore File")],-1),x=s("p",null,"文件 .gitignore 的格式规范如下:",-1),C=s("ul",null,[s("li",null,"所有空行或者以 # 开头的行都会被 Git 忽略"),s("li",null,"可以使用标准的 glob 模式(简化正则表达式)匹配"),s("li",null,"匹配模式可以以( / )开头防止递归"),s("li",null,"匹配模式可以以( / )结尾指定目录"),s("li",null,"要跟踪指定模式以外的文件或目录,可以在模式前加上惊叹号( ! )取反"),s("li",null,[s("a",{href:"https://github.com/github/gitignore",target:"_blank",rel:"noopener noreferrer"},"GitHub gitignore Style")])],-1),A=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token comment"},"# no .a files"),a("\n*.a\n\n"),s("span",{class:"token comment"},"# but do track lib.a, even though you're ignoring .a files above"),a("\n"),s("span",{class:"token operator"},"!"),a("lib.a\n\n"),s("span",{class:"token comment"},"# only ignore the TODO file in the current directory, not subDir/TODO"),a("\n/TODO\n\n"),s("span",{class:"token comment"},"# ignore all files in the build/ directory"),a("\nbuild/\n\n"),s("span",{class:"token comment"},"# ignore doc/notes.txt, but not doc/server/arch.txt"),a("\ndoc/*.txt\n\n"),s("span",{class:"token comment"},"# ignore all .pdf files in the doc/ directory"),a("\ndoc/**/*.pdf\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br"),s("span",{class:"line-number"},"9"),s("br"),s("span",{class:"line-number"},"10"),s("br"),s("span",{class:"line-number"},"11"),s("br"),s("span",{class:"line-number"},"12"),s("br"),s("span",{class:"line-number"},"13"),s("br"),s("span",{class:"line-number"},"14"),s("br"),s("span",{class:"line-number"},"15"),s("br"),s("span",{class:"line-number"},"16"),s("br"),s("span",{class:"line-number"},"17"),s("br")])],-1),G=s("h2",{id:"diff"},[s("a",{class:"header-anchor",href:"#diff","aria-hidden":"true"},"#"),a(" Diff")],-1),I=s("p",null,"查看未暂存(un-staged)差异",-1),E=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(),s("span",{class:"token function"},"diff"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),T=s("p",null,"查看已暂存(staged)差异",-1),N=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(),s("span",{class:"token function"},"diff"),a(" --staged\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),O=s("p",null,"显示空白字符错误(space/tab/return)",-1),R=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(),s("span",{class:"token function"},"diff"),a(" --check\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),S=s("h2",{id:"add"},[s("a",{class:"header-anchor",href:"#add","aria-hidden":"true"},"#"),a(" Add")],-1),H=s("ul",null,[s("li",null,"交互式的选择 add 特定部分")],-1),L=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(),s("span",{class:"token function"},"add"),a(" -p\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),j=s("h2",{id:"commit"},[s("a",{class:"header-anchor",href:"#commit","aria-hidden":"true"},"#"),a(" Commit")],-1),D=s("ul",null,[s("li",null,"-a: 跳过暂存阶段(git add)"),s("li",null,"-v: 显示详细 diff 信息")],-1),P=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" commit -a -v\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),B=s("p",null,"重新提交",-1),_=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" commit --amend -a -v\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),M=s("h3",{id:"commit-style-guide"},[s("a",{class:"header-anchor",href:"#commit-style-guide","aria-hidden":"true"},"#"),a(" Commit Style Guide")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/conventional-commits/conventionalcommits.org",target:"_blank",rel:"noopener noreferrer"},"Conventional Commits Specification")]),s("li",null,[s("a",{href:"https://github.com/conventional-changelog/commitlint",target:"_blank",rel:"noopener noreferrer"},"Commit Lint")]),s("li",null,[s("a",{href:"https://github.com/commitizen/cz-cli",target:"_blank",rel:"noopener noreferrer"},"Commitizen: Conventional commits CLI tool")]),s("li",null,[s("a",{href:"https://github.com/conventional-changelog/standard-version",target:"_blank",rel:"noopener noreferrer"},"Standard Version: Automate versioning and CHANGELOG generation")])],-1),U=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"npm"),a(" i -D standard-version\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),$=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,"npx commitizen init cz-conventional-changelog --save-dev --save-exact\n")]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),q=s("div",{class:"language-md line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token tag"},[s("span",{class:"token tag"},[s("span",{class:"token punctuation"},"<"),a("type")]),s("span",{class:"token punctuation"},">")]),a("("),s("span",{class:"token tag"},[s("span",{class:"token tag"},[s("span",{class:"token punctuation"},"<"),a("scope")]),s("span",{class:"token punctuation"},">")]),a("): "),s("span",{class:"token tag"},[s("span",{class:"token tag"},[s("span",{class:"token punctuation"},"<"),a("subject")]),s("span",{class:"token punctuation"},">")]),a("\n(emptyLine)\n\n"),s("span",{class:"token tag"},[s("span",{class:"token tag"},[s("span",{class:"token punctuation"},"<"),a("body")]),s("span",{class:"token punctuation"},">")]),a("\n (emptyLine)\n"),s("span",{class:"token tag"},[s("span",{class:"token tag"},[s("span",{class:"token punctuation"},"<"),a("footer")]),s("span",{class:"token punctuation"},">")]),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br")])],-1),z=s("h4",{id:"message-subject"},[s("a",{class:"header-anchor",href:"#message-subject","aria-hidden":"true"},"#"),a(" Message Subject")],-1),W=s("p",null,"no more than 50 characters",-1),Y=s("h4",{id:"commit-type"},[s("a",{class:"header-anchor",href:"#commit-type","aria-hidden":"true"},"#"),a(" Commit Type")],-1),V=s("ul",null,[s("li",null,"feat: 新增了一个功能 (MINOR Version)."),s("li",null,"fix: 修复了一个 bug (PATCH Version)."),s("li",null,"docs: 只是更改文档."),s("li",null,"style: 不影响代码含义的变化 (空白、格式化、缺少分号等)."),s("li",null,"refactor: 代码重构, 既不修复错误也不添加功能."),s("li",null,"perf: 改进性能的代码更改."),s("li",null,"test: 添加确实测试或更正现有的测试."),s("li",null,"build: 影响构建系统或外部依赖关系的更改 (示例范围: gulp, broccoli, NPM)."),s("li",null,"ci: 更改持续集成文件和脚本 (示例范围: Travis, Circle, BrowserStack, SauceLabs)."),s("li",null,[a("chore: 其他不修改 src 或 test 文件 e.g "),s("code",null,"chore(release)"),a(".")]),s("li",null,"revert: commit 回退.")],-1),K=s("h4",{id:"scope-values"},[s("a",{class:"header-anchor",href:"#scope-values","aria-hidden":"true"},"#"),a(" Scope Values")],-1),J=s("ul",null,[s("li",null,"init"),s("li",null,"runner"),s("li",null,"watcher"),s("li",null,"config"),s("li",null,"web-server"),s("li",null,"proxy"),s("li",null,"empty")],-1),X=s("h4",{id:"message-body"},[s("a",{class:"header-anchor",href:"#message-body","aria-hidden":"true"},"#"),a(" Message Body")],-1),Q=s("ul",null,[s("li",null,"uses the imperative, present tense: “change” not “changed” nor “changes”"),s("li",null,[a("includes "),s("strong",null,"motivation"),a(" for the change and contrasts with previous behavior")])],-1),Z=s("h4",{id:"message-footer"},[s("a",{class:"header-anchor",href:"#message-footer","aria-hidden":"true"},"#"),a(" Message Footer")],-1),nn=s("ul",null,[s("li",null,"referencing issues e.g. close #666, #888"),s("li",null,[a("BREAKING CHANGE ("),s("code",null,"!"),a(") (MAJOR Version) e.g."),s("code",null,"port-runner"),a(" command line option has changed to "),s("code",null,"runner-port"),a(", so that it is consistent with the configuration file syntax. To migrate your project, change all the commands, where you use "),s("code",null,"--port-runner"),a(" to "),s("code",null,"--runner-port"),a(".")])],-1),en=s("h2",{id:"stash"},[s("a",{class:"header-anchor",href:"#stash","aria-hidden":"true"},"#"),a(" Stash")],-1),sn=s("ul",null,[s("li",null,"git stash: 备份当前的工作区的内容,将当前的工作区内容保存到 Git 栈"),s("li",null,"git stash apply/pop: 从 Git 栈中读取最近一次保存的内容,恢复工作区的相关内容"),s("li",null,[a("git stash branch "),s("code",null,""),a(": 新建分支,并在该分支上恢复储藏内容")]),s("li",null,"git stash list: 显示 Git 栈内的所有备份"),s("li",null,"git stash clear: 清空 Git 栈")],-1),an=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token comment"},"# git stash popup"),a("\n"),s("span",{class:"token function"},"git"),a(" stash show -p stash@"),s("span",{class:"token punctuation"},"{"),s("span",{class:"token number"},"0"),s("span",{class:"token punctuation"},"}"),a(),s("span",{class:"token operator"},"|"),a(),s("span",{class:"token function"},"git"),a(" apply -R\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),ln=s("p",null,"Pop a single file:",-1),tn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" restore -s stash@"),s("span",{class:"token punctuation"},"{"),s("span",{class:"token number"},"0"),s("span",{class:"token punctuation"},"}"),a(" -- "),s("span",{class:"token operator"},"<"),a("filename"),s("span",{class:"token operator"},">"),a("\n"),s("span",{class:"token function"},"git"),a(" checkout stash@"),s("span",{class:"token punctuation"},"{"),s("span",{class:"token number"},"0"),s("span",{class:"token punctuation"},"}"),a(" -- "),s("span",{class:"token operator"},"<"),a("filename"),s("span",{class:"token operator"},">"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),rn=s("h2",{id:"revert"},[s("a",{class:"header-anchor",href:"#revert","aria-hidden":"true"},"#"),a(" Revert")],-1),on=s("ul",null,[s("li",null,"重新提交前 n 次的 commit")],-1),cn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" revert -n\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),un=s("h2",{id:"remove"},[s("a",{class:"header-anchor",href:"#remove","aria-hidden":"true"},"#"),a(" Remove")],-1),pn=s("p",null,"完全删除文件",-1),bn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(),s("span",{class:"token function"},"rm"),a(" filename\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),dn=s("p",null,"--cached: 保留磁盘文件(仅从 git 库移除文件)",-1),mn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(),s("span",{class:"token function"},"rm"),a(" --cached filename\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),hn=s("h2",{id:"move"},[s("a",{class:"header-anchor",href:"#move","aria-hidden":"true"},"#"),a(" Move")],-1),gn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(),s("span",{class:"token function"},"mv"),a(" old_path new_path\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),kn=s("h2",{id:"log"},[s("a",{class:"header-anchor",href:"#log","aria-hidden":"true"},"#"),a(" Log")],-1),fn=s("ul",null,[s("li",null,"-p: 打印 diff 差异信息"),s("li",null,"-n: n 为十进制数字,显示最近 n 次信息"),s("li",null,"--stat: 打印简略统计信息"),s("li",null,"--graph: 显示分支合并历史"),s("li",null,"--pretty=: 设置日志格式"),s("li",null,"--author=: 指定作者"),s("li",null,"--committer=: 指定提交者"),s("li",null,"--after=/--since=: 限制日志时间"),s("li",null,'--before=/--until=: 限制日志时间 "2008-01-15" "2 years 1 day 3 minutes ago"'),s("li",null,"--decorate: 查看各个分支当前所指的对象(commit object)"),s("li",null,"--help")],-1),vn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" log -p --stat --graph --pretty"),s("span",{class:"token operator"},"="),a("format:"),s("span",{class:"token string"},'"%h - %an, %ar : %s"'),a(" --since"),s("span",{class:"token operator"},"="),s("span",{class:"token number"},"2"),a(".weeks path_name\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),wn=s("h3",{id:"pretty-format"},[s("a",{class:"header-anchor",href:"#pretty-format","aria-hidden":"true"},"#"),a(" Pretty Format")],-1),yn=s("table",null,[s("thead",null,[s("tr",null,[s("th",{style:{"text-align":"left"}},"选项"),s("th",{style:{"text-align":"left"}},"说明")])]),s("tbody",null,[s("tr",null,[s("td",{style:{"text-align":"left"}},"%H"),s("td",{style:{"text-align":"left"}},"提交对象(commit)的完整哈希字串")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%h"),s("td",{style:{"text-align":"left"}},"提交对象的简短哈希字串")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%T"),s("td",{style:{"text-align":"left"}},"树对象(tree)的完整哈希字串")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%t"),s("td",{style:{"text-align":"left"}},"树对象的简短哈希字串")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%P"),s("td",{style:{"text-align":"left"}},"父对象(parent)的完整哈希字串")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%p"),s("td",{style:{"text-align":"left"}},"父对象的简短哈希字串")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%an"),s("td",{style:{"text-align":"left"}},"作者(author)的名字")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%ae"),s("td",{style:{"text-align":"left"}},"作者的电子邮件地址")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%ad"),s("td",{style:{"text-align":"left"}},"作者修订日期 (可以用|-date=|选项定制格式)")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%at"),s("td",{style:{"text-align":"left"}},"作者修订日期 (ms)")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%ar"),s("td",{style:{"text-align":"left"}},"作者修订日期,按多久以前的方式显示")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%cn"),s("td",{style:{"text-align":"left"}},"提交者(committer)的名字")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%ce"),s("td",{style:{"text-align":"left"}},"提交者的电子邮件地址")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%cd"),s("td",{style:{"text-align":"left"}},"提交日期")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%cr"),s("td",{style:{"text-align":"left"}},"提交日期,按多久以前的方式显示")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"%s"),s("td",{style:{"text-align":"left"}},"提交说明")])])],-1),xn=s("h3",{id:"log-options"},[s("a",{class:"header-anchor",href:"#log-options","aria-hidden":"true"},"#"),a(" Log Options")],-1),Cn=s("table",null,[s("thead",null,[s("tr",null,[s("th",{style:{"text-align":"left"}},"选项"),s("th",{style:{"text-align":"left"}},"说明")])]),s("tbody",null,[s("tr",null,[s("td",{style:{"text-align":"left"}},"-p"),s("td",{style:{"text-align":"left"}},"打印 diff 差异信息")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"-n"),s("td",{style:{"text-align":"left"}},"n 为十进制数字,显示最近 n 次信息")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"--stat"),s("td",{style:{"text-align":"left"}},"打印简略统计信息")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"--graph"),s("td",{style:{"text-align":"left"}},"显示分支合并历史")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"--pretty="),s("td",{style:{"text-align":"left"}},"设置日志格式")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"--author="),s("td",{style:{"text-align":"left"}},"指定作者")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"--committer="),s("td",{style:{"text-align":"left"}},"指定提交者")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"--after=/--since="),s("td",{style:{"text-align":"left"}},"限制日志时间")]),s("tr",null,[s("td",{style:{"text-align":"left"}},"--before=/--until="),s("td",{style:{"text-align":"left"}},'限制日志时间 "2008-01-15" "2 years 1 day 3 minutes ago"')]),s("tr",null,[s("td",{style:{"text-align":"left"}},"--help"),s("td",{style:{"text-align":"left"}})])])],-1),An=s("h2",{id:"reflog"},[s("a",{class:"header-anchor",href:"#reflog","aria-hidden":"true"},"#"),a(" Reflog")],-1),Gn=s("p",null,[s("code",null,"git reflog show"),a(" is an alias for "),s("code",null,"git log -g --abbrev-commit --pretty=oneline"),a(".")],-1),In=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" reflog\n"),s("span",{class:"token function"},"git"),a(" reset HEAD@"),s("span",{class:"token punctuation"},"{"),a("index"),s("span",{class:"token punctuation"},"}"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),En=s("h2",{id:"show"},[s("a",{class:"header-anchor",href:"#show","aria-hidden":"true"},"#"),a(" Show")],-1),Tn=s("ul",null,[s("li",null,"查看其他分支 或 提交点的文件状态")],-1),Nn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" show branchName/commitHash:fileName\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),On=s("h2",{id:"remote"},[s("a",{class:"header-anchor",href:"#remote","aria-hidden":"true"},"#"),a(" Remote")],-1),Rn=s("p",null,"添加与删除远程仓库源",-1),Sn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" remote "),s("span",{class:"token function"},"add"),a(),s("span",{class:"token operator"},"<"),a("shortname"),s("span",{class:"token operator"},">"),a(),s("span",{class:"token operator"},"<"),a("remote-url"),s("span",{class:"token operator"},">"),a("\n"),s("span",{class:"token function"},"git"),a(" remote "),s("span",{class:"token function"},"rm"),a(),s("span",{class:"token operator"},"<"),a("shortname"),s("span",{class:"token operator"},">"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),Hn=s("p",null,"拉取和推送变更",-1),Ln=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" pull "),s("span",{class:"token punctuation"},"["),a("remote-name"),s("span",{class:"token punctuation"},"]"),a("\n"),s("span",{class:"token function"},"git"),a(" push "),s("span",{class:"token punctuation"},"["),a("remote-name"),s("span",{class:"token punctuation"},"]"),a(),s("span",{class:"token punctuation"},"["),a("local-branch-name"),s("span",{class:"token punctuation"},"]"),a(":"),s("span",{class:"token punctuation"},"["),a("remote-branch-name"),s("span",{class:"token punctuation"},"]"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),jn=s("p",null,"显示仓库信息",-1),Dn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" remote show "),s("span",{class:"token punctuation"},"["),a("remote-name"),s("span",{class:"token punctuation"},"]"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Pn=s("p",null,"重命名仓库缩写名",-1),Bn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" remote "),s("span",{class:"token function"},"rename"),a(),s("span",{class:"token operator"},"<"),a("old"),s("span",{class:"token operator"},">"),a(),s("span",{class:"token operator"},"<"),a("new"),s("span",{class:"token operator"},">"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),_n=s("p",null,"从本地操作,删除远程仓库的分支",-1),Mn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" push origin --delete "),s("span",{class:"token punctuation"},"["),a("remote-branch-name"),s("span",{class:"token punctuation"},"]"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Fn=s("p",null,"保存推送密码",-1),Un=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" config --global credential.helper store\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),$n=s("h2",{id:"tag"},[s("a",{class:"header-anchor",href:"#tag","aria-hidden":"true"},"#"),a(" Tag")],-1),qn=s("p",null,"列出标记及其信息",-1),zn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" tag\n"),s("span",{class:"token function"},"git"),a(" tag -l "),s("span",{class:"token string"},'"v1.8-"'),a("\n"),s("span",{class:"token function"},"git"),a(" show "),s("span",{class:"token operator"},"<"),a("tagName"),s("span",{class:"token punctuation"},"("),a("v1.4"),s("span",{class:"token punctuation"},")"),s("span",{class:"token operator"},">"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br")])],-1),Wn=s("p",null,"创建标签:",-1),Yn=s("ul",null,[s("li",null,"不加-m 会调用 core.editor)"),s("li",null,"省略 commit 序列,标签添加至最新提交")],-1),Vn=s("p",null,"创建附注(annotated)标签",-1),Kn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" tag -a "),s("span",{class:"token operator"},"<"),a("tagName"),s("span",{class:"token punctuation"},"("),a("v1.4"),s("span",{class:"token punctuation"},")"),s("span",{class:"token operator"},">"),a(),s("span",{class:"token punctuation"},"["),a("commit序列"),s("span",{class:"token punctuation"},"]"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Jn=s("p",null,"创建轻量(lightweight)标签",-1),Xn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" tag "),s("span",{class:"token operator"},"<"),a("tagName"),s("span",{class:"token punctuation"},"("),a("v1.4"),s("span",{class:"token punctuation"},")"),s("span",{class:"token operator"},">"),a(),s("span",{class:"token punctuation"},"["),a("commit序列"),s("span",{class:"token punctuation"},"]"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Qn=s("p",null,"共享标签至远程库",-1),Zn=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" push "),s("span",{class:"token punctuation"},"["),a("remote-name"),s("span",{class:"token punctuation"},"]"),a(),s("span",{class:"token operator"},"<"),a("tagName"),s("span",{class:"token operator"},">"),a("\n"),s("span",{class:"token function"},"git"),a(" push "),s("span",{class:"token punctuation"},"["),a("remote-name"),s("span",{class:"token punctuation"},"]"),a(" --tags\n"),s("span",{class:"token function"},"git"),a(" push --follow-tags\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br")])],-1),ne=s("h2",{id:"alias"},[s("a",{class:"header-anchor",href:"#alias","aria-hidden":"true"},"#"),a(" Alias")],-1),ee=s("ul",null,[s("li",null,"!: 执行外部命令")],-1),se=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" config --global alias.co checkout\n"),s("span",{class:"token function"},"git"),a(" config --global alias.br branch\n"),s("span",{class:"token function"},"git"),a(" config --global alias.ci commit\n"),s("span",{class:"token function"},"git"),a(" config --global alias.st status\n\n"),s("span",{class:"token function"},"git"),a(" config --global alias.unstage "),s("span",{class:"token string"},"'reset HEAD --'"),a("\n"),s("span",{class:"token function"},"git"),a(" config --global alias.last "),s("span",{class:"token string"},"'log -1 HEAD'"),a("\n\n"),s("span",{class:"token function"},"git"),a(" config --global alias.visual "),s("span",{class:"token string"},"'!gitk'"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br"),s("span",{class:"line-number"},"9"),s("br")])],-1),ae=s("h2",{id:"merge"},[s("a",{class:"header-anchor",href:"#merge","aria-hidden":"true"},"#"),a(" Merge")],-1),le=s("p",null,"合并的结果是生成一个新的快照(并提交)(新的提交对象)",-1),te=s("h2",{id:"rebase"},[s("a",{class:"header-anchor",href:"#rebase","aria-hidden":"true"},"#"),a(" Rebase")],-1),ie=s("p",null,"切换到工作分支,编码开发新特性",-1),re=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" checkout feature-branch\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),oe=s("p",null,"新特性开发完毕,变基操作以简洁提交历史",-1),ce=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" rebase master\n\n"),s("span",{class:"token function"},"git"),a(" rebase "),s("span",{class:"token punctuation"},"["),a("baseBranch"),s("span",{class:"token punctuation"},"]"),a(),s("span",{class:"token punctuation"},"["),a("topicBranch"),s("span",{class:"token punctuation"},"]"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br")])],-1),ue=s("p",null,"切换到主分支,合并特性分支",-1),pe=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" checkout master\n"),s("span",{class:"token function"},"git"),a(" merge feature-branch\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),be=s("p",null,"pull with auto rebase and auto stash",-1),de=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" pull --rebase --autostash\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),me=s("h2",{id:"branch"},[s("a",{class:"header-anchor",href:"#branch","aria-hidden":"true"},"#"),a(" Branch")],-1),he=s("h3",{id:"basic-workflow-commands"},[s("a",{class:"header-anchor",href:"#basic-workflow-commands","aria-hidden":"true"},"#"),a(" Basic Workflow Commands")],-1),ge=s("h4",{id:"basic-branch"},[s("a",{class:"header-anchor",href:"#basic-branch","aria-hidden":"true"},"#"),a(" Basic Branch")],-1),ke=s("p",null,"创建新分支",-1),fe=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" branch "),s("span",{class:"token operator"},"<"),a("new-branch-name"),s("span",{class:"token operator"},">"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),ve=s("p",null,"删除分支",-1),we=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" branch -d "),s("span",{class:"token operator"},"<"),a("branch-name"),s("span",{class:"token operator"},">"),a("\n"),s("span",{class:"token function"},"git"),a(" push origin --delete "),s("span",{class:"token operator"},"<"),a("remote-branch-name"),s("span",{class:"token operator"},">"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),ye=s("p",null,"切换分支",-1),xe=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" checkout "),s("span",{class:"token operator"},"<"),a("branch-name"),s("span",{class:"token operator"},">"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Ce=s("p",null,"切换到新分支",-1),Ae=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" checkout -b "),s("span",{class:"token operator"},"<"),a("new-branch-name"),s("span",{class:"token operator"},">"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Ge=s("p",null,"打印分支信息",-1),Ie=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" branch -v"),s("span",{class:"token punctuation"},"("),a("详细信息"),s("span",{class:"token punctuation"},")"),a(" -vv"),s("span",{class:"token punctuation"},"("),a("详细远程信息"),s("span",{class:"token punctuation"},")"),a(" --merged"),s("span",{class:"token punctuation"},"("),a("显示合并至当前分支的分支"),s("span",{class:"token punctuation"},")"),a(" --no-merged"),s("span",{class:"token punctuation"},"("),a("显示未合并至当前分支的分支"),s("span",{class:"token punctuation"},")"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Ee=s("h4",{id:"remote-branch"},[s("a",{class:"header-anchor",href:"#remote-branch","aria-hidden":"true"},"#"),a(" Remote Branch")],-1),Te=s("ul",null,[s("li",null,"Show all remote branch:")],-1),Ne=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" branch -r\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Oe=s("p",null,"本地分支跟踪远程分支(在此本地分支上运行 git pull 自动抓取), 2 种方式:",-1),Re=s("ul",null,[s("li",null,"设置当前所在本地分支跟踪某一远程分支")],-1),Se=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" branch -u "),s("span",{class:"token punctuation"},"["),a("remoteName"),s("span",{class:"token punctuation"},"]"),a("/"),s("span",{class:"token punctuation"},"["),a("branch"),s("span",{class:"token punctuation"},"]"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),He=s("ul",null,[s("li",null,[a("创建并切换至新的本地分支(跟踪某一远程分支) "),s("ul",null,[s("li",null,"--track: 本地分支由 git 自动命名"),s("li",null,"-b: 本地分支由创建者命名")])])],-1),Le=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" checkout --track "),s("span",{class:"token punctuation"},"["),a("new-local-branch"),s("span",{class:"token punctuation"},"]"),a("\n\n"),s("span",{class:"token function"},"git"),a(" checkout -b "),s("span",{class:"token punctuation"},"["),a("new-local-branch"),s("span",{class:"token punctuation"},"]"),a(),s("span",{class:"token punctuation"},"["),a("remoteName"),s("span",{class:"token punctuation"},"]"),a("/"),s("span",{class:"token punctuation"},"["),a("branch"),s("span",{class:"token punctuation"},"]"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br")])],-1),je=s("ul",null,[s("li",null,"Delete remote branch")],-1),De=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" push --delete origin "),s("span",{class:"token punctuation"},"["),a("remote-branch-name"),s("span",{class:"token punctuation"},"]"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Pe=s("h3",{id:"advanced-branch-workflow"},[s("a",{class:"header-anchor",href:"#advanced-branch-workflow","aria-hidden":"true"},"#"),a(" Advanced Branch Workflow")],-1),Be=s("p",null,[s("a",{href:"https://github.com/nvie/gitflow",target:"_blank",rel:"noopener noreferrer"},"Git Flow Extension"),a(":")],-1),_e=s("ol",null,[s("li",null,"master 类型分支,名为?|master 或 master,其中?为开发代号"),s("li",null,"develop 类型分支,名为?|develop 或 develop,其中?为开发代号"),s("li",null,[a("feature 类型分支,名为 feature/"),s("em",null,"或?|feature/"),a(",其中*为特征描述")]),s("li",null,[a("release 类型分支,名为 release-"),s("em",null,"或?|release-"),a(",其中*为要发布的版本号")]),s("li",null,[a("hotfix 类型分支,名为 hotfix-"),s("em",null,"或?|hotfix-"),a(",其中*为要发布的版本号")]),s("li",null,[a("issues 类型分支,名为 issues/"),s("em",null,"或?|issues/"),a(",其中*为问题描述")]),s("li",null,"trials 类型分支,名为?%trials.*,?为此分支的父分支,*为描述的名称(或直接为?%trials)"),s("li",null,"basedOn 类型分支,名为 basedOn 或?|basedOn,?为其来源的 master 分支的开发代号"),s("li",null,[a("work 类型分支,名为 work.**"),s("em",null,"/basedOn-?-"),a(",***代表此描述此 work 的名称, ?为其所基于的分支的开发代号,最后一个*代表其在?|basedOn 上所基于的分支的版本号或状态名")])],-1),Me=s("p",null,"下面介绍模型中的约定,并定义 gg-*这样的抽象动作来完成约定中的行为",-1),Fe=s("h4",{id:"master-branch-and-develop-branch"},[s("a",{class:"header-anchor",href:"#master-branch-and-develop-branch","aria-hidden":"true"},"#"),a(" Master Branch and Develop Branch")],-1),Ue=s("p",null,[s("em",null,"多长期分支模式"),a(": master 分支与 develop 分支都是长期分支,区别在于分支的"),s("strong",null,"稳定性等级"),a(" - master > develop")],-1),$e=s("p",null,"e.g master/develop/next",-1),qe=s("ul",null,[s("li",null,"每一次的提交都必须有意义")],-1),ze=s("p",null,"git 在每次提交的时候要求输入对此提交的概括,这个概括不能为空。",-1),We=s("p",null,"正确的提交概括:更新了程序 doc 错误的提交概括:updates",-1),Ye=s("ul",null,[s("li",null,"开发型任务中的 master 类型与 develop 类型分支必须成对出现, master 分支的推进只能来源与 release 分支和 hotfix 分支的合并,禁止在 master 分支上直接提交")],-1),Ve=s("blockquote",null,[s("p",null,"master 分支上只有我们推送上去的稳定版本的程序,develop 分支上的程序一直处于开发状态,不稳定。 在开发型任务中使用 gg-init 进行版本控制的初始化,建立配套的 master ~ develop 分支对。 在使用型任务中使用 gg-work-init 进行版本控制的初始化, 拉取需要使用的稳定版本程序的 master 分支,并初始化对应的 basedOn 分支(见 9).")],-1),Ke=s("h4",{id:"feature-branch"},[s("a",{class:"header-anchor",href:"#feature-branch","aria-hidden":"true"},"#"),a(" Feature Branch")],-1),Je=s("ol",null,[s("li",null,"只能从 develop 类型分支上创建"),s("li",null,"最终必须合并到 develop 类型分支"),s("li",null,"最终分支被删除")],-1),Xe=s("blockquote",null,[s("p",null,"每当有新特性需要加入的时候,我们应该从 develop 类型分支上新建一个 feature 类型分支,完成新特性的开发和测试后将特性合并到 develop 类型分支上。 在 develop 类型分支上使用 gg-feature-open featureName 建立并转向一个名为 feature/featureName 的新分支 在一个 feature 类型分支上使用 gg-feature-close 把这个分支的工作合并到 develop 类型分支上,删除此分支,完成一个特性的开发")],-1),Qe=s("h4",{id:"release-branch"},[s("a",{class:"header-anchor",href:"#release-branch","aria-hidden":"true"},"#"),a(" Release Branch")],-1),Ze=s("ol",null,[s("li",null,"只能从 develop 类型分支上创建"),s("li",null,"最终必须同时合并到 master 类型分支(发布新的版本)和 develop 类型分支(基于新版本的进一步开发)"),s("li",null,"最终分支被删除")],-1),ns=s("blockquote",null,[s("p",null,"每当工作进入到一个较为稳定阶段的时候,可以使用 gg-release-open versionNum 建立一个名为 release-versionNum 的临时分支, 在这个分支上允许进行小的改动(比如修改一下 readme 文件中的版本号), 然后使用 gg-release-close 将此版本合并(发布)到 master 类型分支上,同时合并到 develop 类型分支上,然后删除此分支.")],-1),es=s("h4",{id:"hotfix-branch"},[s("a",{class:"header-anchor",href:"#hotfix-branch","aria-hidden":"true"},"#"),a(" Hotfix Branch")],-1),ss=s("ol",null,[s("li",null,"只能从 master 类型分支上创建"),s("li",null,"最终必须同时合并到 master 类型分支(发布新的热补丁版本)和 develop 类型分支(基于新版本的进一步开发)"),s("li",null,"最终分支被删除")],-1),as=s("blockquote",null,[s("p",null,"当新版本发布后发现必须马上解决的严重 bug 时,使用 gg-hotfix-open versionNum 建立名为 hotfix-versionNum 的临时分支, 在这个分支上完成 bug 的修复,然后使用 gg-hotfix-close 将此版本合并(发布)到 master 类型分支上,同时合并到 develop 类型分支上,然后删除此分支.")],-1),ls=s("h4",{id:"issues-branch"},[s("a",{class:"header-anchor",href:"#issues-branch","aria-hidden":"true"},"#"),a(" Issues Branch")],-1),ts=s("ol",null,[s("li",null,"只能从 develop 类型分支上创建"),s("li",null,"最终必须合并到 develop 类型分支"),s("li",null,"最终分支被删除")],-1),is=s("blockquote",null,[s("p",null,"注解:每当有(比较复杂的)问题需要解决的时候,应该从 develop 类型分支上新建一个 issues 类型分支,完成问题的调试后合并到 develop 类型分支上。 在 develop 类型分支上使用 gg-issues-open featureName 建立并转向一个名为 issues/issuesName 的新分支 在一个 issues 类型分支上使用 gg-issues-close 把这个分支的工作合并到 develop 类型分支上,然后删除此分支,解决了一个复杂的问题 issues 类型和 feature 类型的实现方式一模一样,仅仅有名字上面的差别。")],-1),rs=s("h4",{id:"trials-branch"},[s("a",{class:"header-anchor",href:"#trials-branch","aria-hidden":"true"},"#"),a(" Trials Branch")],-1),os=s("ul",null,[s("li",null,"可以从除了 release 类型分支以外的任何类型分支上创建"),s("li",null,[a("在这个分支上请发挥想象力大胆实验 "),s("ul",null,[s("li",null,"接受实验结果,把实验过程并入父分支,称为 good-close"),s("li",null,"实验结果不理想,放弃实验结果,从实验开始前重新来过,称为 bad-close")])]),s("li",null,"最终分支被删除")],-1),cs=s("blockquote",null,[s("p",null,"在满足条件的分支 A 上工作,时不时会冒出一些大胆的想法 这个时候使用 gg-trials-open trialsName 创建并转向一个名为 A/trials.trialsName 的实验分支,在这个分支上进行疯狂的实验")],-1),us=s("h4",{id:"basedon-branch"},[s("a",{class:"header-anchor",href:"#basedon-branch","aria-hidden":"true"},"#"),a(" BasedOn Branch")],-1),ps=s("ol",null,[s("li",null,"从 name|master 建立并初始化为 name|basedOn"),s("li",null,"只能从对应的 master 分支 fork 到此分支"),s("li",null,"禁止在这个分支上提交")],-1),bs=s("blockquote",null,[s("p",null,"这个分支是一个为了使工作流程更为清晰的缓存分支, 分支上只有从 master 稳定分支上挑选出来的自己在工作中将要(尝试)使用的稳定版本。 在 basedOn 类型分支上使用 gg-select 版本号 从对应的 master 分支上选出一个稳定版本或使用 gg-select-the-latest 从对应的 master 分支上选择最新的版本, fork 到这个分支,并加上 inUse-versionNum 的标签 从 master 到此分支的行为是 fork, 即有可能此分支的 log 为 (init)v1.0===>v0.9=====>v0.8======>v1.3, 这个分支上的 commit 来源于 master,但是其分支提交历史与 master 分支无关")],-1),ds=s("h4",{id:"work-branch"},[s("a",{class:"header-anchor",href:"#work-branch","aria-hidden":"true"},"#"),a(" Work Branch")],-1),ms=s("ol",null,[s("li",null,"只能从 basedOn 类型分支上创建"),s("li",null,"可以借助 basedOn 分支升级")],-1),hs=s("h2",{id:"git-inside"},[s("a",{class:"header-anchor",href:"#git-inside","aria-hidden":"true"},"#"),a(" Git Inside")],-1),gs=s("h3",{id:"add-inside"},[s("a",{class:"header-anchor",href:"#add-inside","aria-hidden":"true"},"#"),a(" Add Inside")],-1),ks=s("ul",null,[s("li",null,"create blob objects: contains content of files"),s("li",null,"add files to index list (.git/index)")],-1),fs=s("h3",{id:"commit-inside"},[s("a",{class:"header-anchor",href:"#commit-inside","aria-hidden":"true"},"#"),a(" Commit Inside")],-1),vs=s("ul",null,[s("li",null,"create tree objects: each object represent a directory, contains blob object refs in this directory"),s("li",null,"create commit object: contains root tree object hash number and parent commit object hash number")],-1),ws=s("h3",{id:"checkout-inside"},[s("a",{class:"header-anchor",href:"#checkout-inside","aria-hidden":"true"},"#"),a(" Checkout Inside")],-1),ys=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" checkout "),s("span",{class:"token operator"},"<"),a("commit-hash-id"),s("span",{class:"token operator"},">"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),xs=s("ul",null,[s("li",null,"get commit object by commit hash id"),s("li",null,"get root tree object in commit object"),s("li",null,"write file entries by root tree object (tree graph)"),s("li",null,"write .git/index"),s("li",null,"set HEAD to that commit (detached HEAD state)")],-1),Cs=s("div",{class:"language-js line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token comment"},"// Get file commit history"),a("\n"),s("span",{class:"token keyword"},"const"),a(" Git "),s("span",{class:"token operator"},"="),a(),s("span",{class:"token function"},"require"),s("span",{class:"token punctuation"},"("),s("span",{class:"token string"},"'nodegit'"),s("span",{class:"token punctuation"},")"),s("span",{class:"token punctuation"},";"),a("\n"),s("span",{class:"token keyword"},"let"),a(" repo"),s("span",{class:"token punctuation"},";"),a("\n\nGit"),s("span",{class:"token punctuation"},"."),a("Repository"),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"open"),s("span",{class:"token punctuation"},"("),a("path"),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"resolve"),s("span",{class:"token punctuation"},"("),s("span",{class:"token string"},"'./.git'"),s("span",{class:"token punctuation"},")"),s("span",{class:"token punctuation"},")"),a("\n "),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"then"),s("span",{class:"token punctuation"},"("),s("span",{class:"token keyword"},"function"),a(),s("span",{class:"token punctuation"},"("),s("span",{class:"token parameter"},"r"),s("span",{class:"token punctuation"},")"),a(),s("span",{class:"token punctuation"},"{"),a("\n repo "),s("span",{class:"token operator"},"="),a(" r"),s("span",{class:"token punctuation"},";"),a("\n "),s("span",{class:"token keyword"},"return"),a(" repo"),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"getMasterCommit"),s("span",{class:"token punctuation"},"("),s("span",{class:"token punctuation"},")"),s("span",{class:"token punctuation"},";"),a("\n "),s("span",{class:"token punctuation"},"}"),s("span",{class:"token punctuation"},")"),a("\n "),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"then"),s("span",{class:"token punctuation"},"("),s("span",{class:"token keyword"},"function"),a(),s("span",{class:"token punctuation"},"("),s("span",{class:"token parameter"},"firstCommitOnMaster"),s("span",{class:"token punctuation"},")"),a(),s("span",{class:"token punctuation"},"{"),a("\n "),s("span",{class:"token keyword"},"const"),a(" walker "),s("span",{class:"token operator"},"="),a(" repo"),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"createRevWalk"),s("span",{class:"token punctuation"},"("),s("span",{class:"token punctuation"},")"),s("span",{class:"token punctuation"},";"),a("\n walker"),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"push"),s("span",{class:"token punctuation"},"("),a("firstCommitOnMaster"),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"sha"),s("span",{class:"token punctuation"},"("),s("span",{class:"token punctuation"},")"),s("span",{class:"token punctuation"},")"),s("span",{class:"token punctuation"},";"),a("\n walker"),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"sorting"),s("span",{class:"token punctuation"},"("),a("Git"),s("span",{class:"token punctuation"},"."),a("Revwalk"),s("span",{class:"token punctuation"},"."),s("span",{class:"token constant"},"SORT"),s("span",{class:"token punctuation"},"."),a("Time"),s("span",{class:"token punctuation"},")"),s("span",{class:"token punctuation"},";"),a("\n\n "),s("span",{class:"token keyword"},"return"),a(" walker"),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"fileHistoryWalk"),s("span",{class:"token punctuation"},"("),a("historyFile"),s("span",{class:"token punctuation"},","),a(),s("span",{class:"token number"},"2"),s("span",{class:"token punctuation"},")"),s("span",{class:"token punctuation"},";"),a("\n "),s("span",{class:"token punctuation"},"}"),s("span",{class:"token punctuation"},")"),a("\n "),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"then"),s("span",{class:"token punctuation"},"("),s("span",{class:"token punctuation"},"("),s("span",{class:"token parameter"},"resultingArrayOfCommits"),s("span",{class:"token punctuation"},")"),a(),s("span",{class:"token operator"},"=>"),a(),s("span",{class:"token punctuation"},"{"),a("\n "),s("span",{class:"token keyword"},"if"),a(),s("span",{class:"token punctuation"},"("),a("resultingArrayOfCommits"),s("span",{class:"token punctuation"},"."),a("length "),s("span",{class:"token operator"},">"),a(),s("span",{class:"token number"},"0"),s("span",{class:"token punctuation"},")"),a(),s("span",{class:"token punctuation"},"{"),a("\n "),s("span",{class:"token keyword"},"const"),a(" commit "),s("span",{class:"token operator"},"="),a(" resultingArrayOfCommits"),s("span",{class:"token punctuation"},"["),s("span",{class:"token number"},"0"),s("span",{class:"token punctuation"},"]"),s("span",{class:"token punctuation"},"."),a("commit"),s("span",{class:"token punctuation"},";"),a("\n "),s("span",{class:"token keyword"},"const"),a(" date "),s("span",{class:"token operator"},"="),a(" commit"),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"date"),s("span",{class:"token punctuation"},"("),s("span",{class:"token punctuation"},")"),s("span",{class:"token punctuation"},";"),a("\n "),s("span",{class:"token punctuation"},"}"),a("\n "),s("span",{class:"token punctuation"},"}"),s("span",{class:"token punctuation"},")"),s("span",{class:"token punctuation"},";"),a("\n\n"),s("span",{class:"token keyword"},"const"),a(),s("span",{class:"token function-variable function"},"getGitLastUpdatedTimeStamp"),a(),s("span",{class:"token operator"},"="),a(),s("span",{class:"token punctuation"},"("),s("span",{class:"token parameter"},"filePath"),s("span",{class:"token punctuation"},")"),a(),s("span",{class:"token operator"},"=>"),a(),s("span",{class:"token punctuation"},"{"),a("\n "),s("span",{class:"token keyword"},"let"),a(" lastUpdated "),s("span",{class:"token operator"},"="),a(),s("span",{class:"token number"},"0"),s("span",{class:"token punctuation"},";"),a("\n\n "),s("span",{class:"token keyword"},"try"),a(),s("span",{class:"token punctuation"},"{"),a("\n lastUpdated "),s("span",{class:"token operator"},"="),a("\n "),s("span",{class:"token function"},"parseInt"),s("span",{class:"token punctuation"},"("),a("\n spawn\n "),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"sync"),s("span",{class:"token punctuation"},"("),s("span",{class:"token string"},"'git'"),s("span",{class:"token punctuation"},","),a(),s("span",{class:"token punctuation"},"["),s("span",{class:"token string"},"'log'"),s("span",{class:"token punctuation"},","),a(),s("span",{class:"token string"},"'-1'"),s("span",{class:"token punctuation"},","),a(),s("span",{class:"token string"},"'--format=%at'"),s("span",{class:"token punctuation"},","),a(" path"),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"basename"),s("span",{class:"token punctuation"},"("),a("filePath"),s("span",{class:"token punctuation"},")"),s("span",{class:"token punctuation"},"]"),s("span",{class:"token punctuation"},","),a(),s("span",{class:"token punctuation"},"{"),a("\n cwd"),s("span",{class:"token operator"},":"),a(" path"),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"dirname"),s("span",{class:"token punctuation"},"("),a("filePath"),s("span",{class:"token punctuation"},")"),s("span",{class:"token punctuation"},","),a("\n "),s("span",{class:"token punctuation"},"}"),s("span",{class:"token punctuation"},")"),a("\n "),s("span",{class:"token punctuation"},"."),a("stdout"),s("span",{class:"token punctuation"},"."),s("span",{class:"token function"},"toString"),s("span",{class:"token punctuation"},"("),s("span",{class:"token string"},"'utf-8'"),s("span",{class:"token punctuation"},")"),a("\n "),s("span",{class:"token punctuation"},")"),a(),s("span",{class:"token operator"},"*"),a(),s("span",{class:"token number"},"1000"),s("span",{class:"token punctuation"},";"),a("\n "),s("span",{class:"token punctuation"},"}"),a(),s("span",{class:"token keyword"},"catch"),a(),s("span",{class:"token punctuation"},"("),a("e"),s("span",{class:"token punctuation"},")"),a(),s("span",{class:"token punctuation"},"{"),a("\n "),s("span",{class:"token comment"},"/* do not handle for now */"),a("\n "),s("span",{class:"token punctuation"},"}"),a("\n\n "),s("span",{class:"token keyword"},"return"),a(" lastUpdated"),s("span",{class:"token punctuation"},";"),a("\n"),s("span",{class:"token punctuation"},"}"),s("span",{class:"token punctuation"},";"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br"),s("span",{class:"line-number"},"9"),s("br"),s("span",{class:"line-number"},"10"),s("br"),s("span",{class:"line-number"},"11"),s("br"),s("span",{class:"line-number"},"12"),s("br"),s("span",{class:"line-number"},"13"),s("br"),s("span",{class:"line-number"},"14"),s("br"),s("span",{class:"line-number"},"15"),s("br"),s("span",{class:"line-number"},"16"),s("br"),s("span",{class:"line-number"},"17"),s("br"),s("span",{class:"line-number"},"18"),s("br"),s("span",{class:"line-number"},"19"),s("br"),s("span",{class:"line-number"},"20"),s("br"),s("span",{class:"line-number"},"21"),s("br"),s("span",{class:"line-number"},"22"),s("br"),s("span",{class:"line-number"},"23"),s("br"),s("span",{class:"line-number"},"24"),s("br"),s("span",{class:"line-number"},"25"),s("br"),s("span",{class:"line-number"},"26"),s("br"),s("span",{class:"line-number"},"27"),s("br"),s("span",{class:"line-number"},"28"),s("br"),s("span",{class:"line-number"},"29"),s("br"),s("span",{class:"line-number"},"30"),s("br"),s("span",{class:"line-number"},"31"),s("br"),s("span",{class:"line-number"},"32"),s("br"),s("span",{class:"line-number"},"33"),s("br"),s("span",{class:"line-number"},"34"),s("br"),s("span",{class:"line-number"},"35"),s("br"),s("span",{class:"line-number"},"36"),s("br"),s("span",{class:"line-number"},"37"),s("br"),s("span",{class:"line-number"},"38"),s("br"),s("span",{class:"line-number"},"39"),s("br"),s("span",{class:"line-number"},"40"),s("br"),s("span",{class:"line-number"},"41"),s("br")])],-1),As=s("h3",{id:"merge-inside"},[s("a",{class:"header-anchor",href:"#merge-inside","aria-hidden":"true"},"#"),a(" Merge Inside")],-1),Gs=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" merge "),s("span",{class:"token operator"},"<"),a("giver-branch"),s("span",{class:"token operator"},">"),a("/"),s("span",{class:"token operator"},"<"),a("giver-commit"),s("span",{class:"token operator"},">"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Is=s("ul",null,[s("li",null,[a("write giver commit hash to "),s("code",null,".git/MERGE_HEAD")]),s("li",null,"find base commit (the most recent common ancestor commit)"),s("li",null,"diff and apply according to base commit, giver commit, receiver commit"),s("li",null,[a("do what "),s("code",null,"git checkout"),a(" do")]),s("li",null,[a("remove "),s("code",null,".git/MERGE_HEAD")])],-1),Es=s("h3",{id:"fetch-inside"},[s("a",{class:"header-anchor",href:"#fetch-inside","aria-hidden":"true"},"#"),a(" Fetch Inside")],-1),Ts=s("ul",null,[s("li",null,"get hash of remote commit and its root tree object"),s("li",null,"copy all diff objects in tree graph into .git/objects"),s("li",null,[a("update "),s("code",null,".git/refs/remotes/origin/"),a(", set "),s("code",null,".git/FETCH_HEAD"),a(" to it")])],-1),Ns=s("h3",{id:"clone-inside"},[s("a",{class:"header-anchor",href:"#clone-inside","aria-hidden":"true"},"#"),a(" Clone Inside")],-1),Os=s("p",null,[s("code",null,"git init"),a(" + "),s("code",null,"git remote add origin "),a(" + "),s("code",null,"git pull origin")],-1),Rs=s("h3",{id:"push-inside"},[s("a",{class:"header-anchor",href:"#push-inside","aria-hidden":"true"},"#"),a(" Push Inside")],-1),Ss=s("ul",null,[s("li",null,"apply commit to remote repo"),s("li",null,[a("update remote repo "),s("code",null,".git/refs/heads/"),a(" to new commit")]),s("li",null,[a("update local repo "),s("code",null,".git/refs/remotes/origin/"),a(" to new commit")])],-1),Hs=s("h3",{id:"head-branch-inside"},[s("a",{class:"header-anchor",href:"#head-branch-inside","aria-hidden":"true"},"#"),a(" HEAD Branch Inside")],-1),Ls=s("ul",null,[s("li",null,"HEAD -> refs/heads/master -> commit object"),s("li",null,"branches are just refs, refs are just files (contain commit hash id)")],-1),js=s("h3",{id:"git-objects"},[s("a",{class:"header-anchor",href:"#git-objects","aria-hidden":"true"},"#"),a(" Git Objects")],-1),Ds=s("p",null,[s("code",null,".git/objects"),a(" is immutable, "),s("code",null,".git/refs"),a(" is mutable")],-1),Ps=s("p",null,[s("code",null,"blob"),a("持有文件的内容,"),s("code",null,"树对象"),a("是一个包含"),s("code",null,"blob"),a("对象和"),s("code",null,"子树对象"),a("的目录列表. "),s("code",null,"提交对象"),a("是工作目录的一个快照, 包含了一些像时间或提交信息这样的元数据. "),s("code",null,"分支"),a("是"),s("code",null,"提交对象"),a("的命名引用. "),s("code",null,"工作目录"),a("是一个目录, 有着相应的仓库, "),s("code",null,"暂存区"),a("(索引)为下一个"),s("code",null,"提交对象"),a("持有对应的"),s("code",null,"树对象"),a(", 而仓库就是一个"),s("code",null,"提交对象"),a("的集合.")],-1),Bs=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" hash-object 创建blob对象\n"),s("span",{class:"token function"},"git"),a(" cat-file -t\n"),s("span",{class:"token function"},"git"),a(" cat-file -p\n"),s("span",{class:"token function"},"git"),a(" update-index --add --cache-info 将文件添加至暂存区\n"),s("span",{class:"token function"},"git"),a(" write-tree 创建tree对象\n"),s("span",{class:"token function"},"git"),a(" commit-tree 创建commit对象\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br")])],-1),_s=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token comment"},"# -w for write into codebase,"),a("\n"),s("span",{class:"token comment"},"# --stdin for reading from stdin not file"),a("\n"),s("span",{class:"token builtin class-name"},"echo"),a(),s("span",{class:"token string"},"'test content'"),a(),s("span",{class:"token operator"},"|"),a(),s("span",{class:"token function"},"git"),a(" hash-object -w --stdin\n"),s("span",{class:"token function"},"git"),a(" cat-file -p "),s("span",{class:"token operator"},"<"),a("object-hash-number"),s("span",{class:"token operator"},">"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br")])],-1),Ms=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token shebang important"},"#!/bin/bash"),a("\n\n"),s("span",{class:"token keyword"},"function"),a(),s("span",{class:"token function-name function"},"separator"),s("span",{class:"token punctuation"},"("),s("span",{class:"token punctuation"},")"),a(),s("span",{class:"token punctuation"},"{"),a("\n "),s("span",{class:"token keyword"},"for"),a(),s("span",{class:"token for-or-select variable"},"i"),a(),s("span",{class:"token keyword"},"in"),a(),s("span",{class:"token punctuation"},"{"),s("span",{class:"token number"},"1"),s("span",{class:"token punctuation"},".."),s("span",{class:"token number"},"20"),s("span",{class:"token punctuation"},"}"),a("\n "),s("span",{class:"token keyword"},"do"),a("\n "),s("span",{class:"token builtin class-name"},"printf"),a(),s("span",{class:"token string"},'"-"'),a("\n "),s("span",{class:"token keyword"},"done"),a("\n "),s("span",{class:"token builtin class-name"},"printf"),a(),s("span",{class:"token variable"},"$1"),a("\n "),s("span",{class:"token keyword"},"for"),a(),s("span",{class:"token for-or-select variable"},"i"),a(),s("span",{class:"token keyword"},"in"),a(),s("span",{class:"token punctuation"},"{"),s("span",{class:"token number"},"1"),s("span",{class:"token punctuation"},".."),s("span",{class:"token number"},"20"),s("span",{class:"token punctuation"},"}"),a("\n "),s("span",{class:"token keyword"},"do"),a("\n "),s("span",{class:"token builtin class-name"},"printf"),a(),s("span",{class:"token string"},'"-"'),a("\n "),s("span",{class:"token keyword"},"done"),a("\n "),s("span",{class:"token builtin class-name"},"printf"),a(),s("span",{class:"token string"},[a('"'),s("span",{class:"token entity",title:"\\n"},"\\n"),a('"')]),a("\n"),s("span",{class:"token punctuation"},"}"),a("\n\n"),s("span",{class:"token keyword"},"function"),a(),s("span",{class:"token function-name function"},"git_object_type"),s("span",{class:"token punctuation"},"("),s("span",{class:"token punctuation"},")"),a(),s("span",{class:"token punctuation"},"{"),a("\n "),s("span",{class:"token builtin class-name"},"printf"),a(),s("span",{class:"token string"},'"type => "'),a("\n "),s("span",{class:"token function"},"git"),a(" cat-file -t "),s("span",{class:"token variable"},"$1"),a("\n "),s("span",{class:"token keyword"},"for"),a(),s("span",{class:"token for-or-select variable"},"i"),a(),s("span",{class:"token keyword"},"in"),a(),s("span",{class:"token punctuation"},"{"),s("span",{class:"token number"},"1"),s("span",{class:"token punctuation"},".."),s("span",{class:"token number"},"40"),s("span",{class:"token punctuation"},"}"),a("\n "),s("span",{class:"token keyword"},"do"),a("\n "),s("span",{class:"token builtin class-name"},"printf"),a(),s("span",{class:"token string"},'"-"'),a("\n "),s("span",{class:"token keyword"},"done"),a("\n "),s("span",{class:"token builtin class-name"},"printf"),a(),s("span",{class:"token string"},[a('"'),s("span",{class:"token entity",title:"\\n"},"\\n"),a('"')]),a("\n"),s("span",{class:"token punctuation"},"}"),a("\n\n"),s("span",{class:"token keyword"},"function"),a(),s("span",{class:"token function-name function"},"git_object_content"),s("span",{class:"token punctuation"},"("),s("span",{class:"token punctuation"},")"),a(),s("span",{class:"token punctuation"},"{"),a("\n "),s("span",{class:"token function"},"git"),a(" cat-file -p "),s("span",{class:"token variable"},"$1"),a("\n"),s("span",{class:"token punctuation"},"}"),a("\n\n"),s("span",{class:"token keyword"},"function"),a(),s("span",{class:"token function-name function"},"print_git_objects"),s("span",{class:"token punctuation"},"("),s("span",{class:"token punctuation"},")"),a(),s("span",{class:"token punctuation"},"{"),a("\n "),s("span",{class:"token assign-left variable"},"files"),s("span",{class:"token operator"},"="),s("span",{class:"token variable"},[s("span",{class:"token variable"},"$("),s("span",{class:"token function"},"git"),a(" rev-list --parents --objects HEAD "),s("span",{class:"token operator"},"|"),a(),s("span",{class:"token function"},"awk"),a(),s("span",{class:"token string"},"'{print $1}'"),s("span",{class:"token variable"},")")]),a("\n "),s("span",{class:"token assign-left variable"},"index"),s("span",{class:"token operator"},"="),s("span",{class:"token number"},"0"),a("\n\n "),s("span",{class:"token keyword"},"for"),a(),s("span",{class:"token for-or-select variable"},"file"),a(),s("span",{class:"token keyword"},"in"),a(),s("span",{class:"token variable"},"$files"),a("\n "),s("span",{class:"token keyword"},"do"),a("\n "),s("span",{class:"token assign-left variable"},"len"),s("span",{class:"token operator"},"="),s("span",{class:"token variable"},[s("span",{class:"token variable"},"$("),s("span",{class:"token function"},"expr"),a(" length "),s("span",{class:"token string"},[a('"'),s("span",{class:"token variable"},"$file"),a('"')]),s("span",{class:"token variable"},")")]),a("\n\n "),s("span",{class:"token keyword"},"if"),a(),s("span",{class:"token punctuation"},"["),a(),s("span",{class:"token variable"},"$len"),a(" -gt "),s("span",{class:"token number"},"30"),a(),s("span",{class:"token punctuation"},"]"),a("\n "),s("span",{class:"token keyword"},"then"),a("\n "),s("span",{class:"token assign-left variable"},"index"),s("span",{class:"token operator"},"="),s("span",{class:"token variable"},[s("span",{class:"token variable"},"$("),s("span",{class:"token function"},"expr"),a(" $index + "),s("span",{class:"token number"},"1"),s("span",{class:"token variable"},")")]),a("\n separator "),s("span",{class:"token variable"},"$index"),a("\n "),s("span",{class:"token builtin class-name"},"echo"),a(),s("span",{class:"token variable"},"$file"),a("\n git_object_type "),s("span",{class:"token variable"},"$file"),a("\n git_object_content "),s("span",{class:"token variable"},"$file"),a("\n "),s("span",{class:"token keyword"},"fi"),a("\n "),s("span",{class:"token keyword"},"done"),a("\n"),s("span",{class:"token punctuation"},"}"),a("\n\nprint_git_objects\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br"),s("span",{class:"line-number"},"9"),s("br"),s("span",{class:"line-number"},"10"),s("br"),s("span",{class:"line-number"},"11"),s("br"),s("span",{class:"line-number"},"12"),s("br"),s("span",{class:"line-number"},"13"),s("br"),s("span",{class:"line-number"},"14"),s("br"),s("span",{class:"line-number"},"15"),s("br"),s("span",{class:"line-number"},"16"),s("br"),s("span",{class:"line-number"},"17"),s("br"),s("span",{class:"line-number"},"18"),s("br"),s("span",{class:"line-number"},"19"),s("br"),s("span",{class:"line-number"},"20"),s("br"),s("span",{class:"line-number"},"21"),s("br"),s("span",{class:"line-number"},"22"),s("br"),s("span",{class:"line-number"},"23"),s("br"),s("span",{class:"line-number"},"24"),s("br"),s("span",{class:"line-number"},"25"),s("br"),s("span",{class:"line-number"},"26"),s("br"),s("span",{class:"line-number"},"27"),s("br"),s("span",{class:"line-number"},"28"),s("br"),s("span",{class:"line-number"},"29"),s("br"),s("span",{class:"line-number"},"30"),s("br"),s("span",{class:"line-number"},"31"),s("br"),s("span",{class:"line-number"},"32"),s("br"),s("span",{class:"line-number"},"33"),s("br"),s("span",{class:"line-number"},"34"),s("br"),s("span",{class:"line-number"},"35"),s("br"),s("span",{class:"line-number"},"36"),s("br"),s("span",{class:"line-number"},"37"),s("br"),s("span",{class:"line-number"},"38"),s("br"),s("span",{class:"line-number"},"39"),s("br"),s("span",{class:"line-number"},"40"),s("br"),s("span",{class:"line-number"},"41"),s("br"),s("span",{class:"line-number"},"42"),s("br"),s("span",{class:"line-number"},"43"),s("br"),s("span",{class:"line-number"},"44"),s("br"),s("span",{class:"line-number"},"45"),s("br"),s("span",{class:"line-number"},"46"),s("br"),s("span",{class:"line-number"},"47"),s("br"),s("span",{class:"line-number"},"48"),s("br"),s("span",{class:"line-number"},"49"),s("br")])],-1),Fs=s("h2",{id:"github"},[s("a",{class:"header-anchor",href:"#github","aria-hidden":"true"},"#"),a(" GitHub")],-1),Us=s("h3",{id:"gpg-usage"},[s("a",{class:"header-anchor",href:"#gpg-usage","aria-hidden":"true"},"#"),a(" GPG Usage")],-1),$s=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token comment"},"# Generate GPG key"),a("\ngpg --full-generate-key\n"),s("span",{class:"token comment"},"# List GPG keys"),a("\ngpg --list-keys\n\n"),s("span",{class:"token comment"},"# Generate GPG public key string"),a("\ngpg --armor --export "),s("span",{class:"token operator"},"<"),a("pub-keyID"),s("span",{class:"token operator"},">"),a("\n"),s("span",{class:"token comment"},"# Copy output to GitHub GPG textarea"),a("\n\n"),s("span",{class:"token comment"},"# Git global configuration for GPG signature commits"),a("\n"),s("span",{class:"token function"},"git"),a(" config --global user.signingkey "),s("span",{class:"token operator"},"<"),a("pub-keyID"),s("span",{class:"token operator"},">"),a("\n"),s("span",{class:"token function"},"git"),a(" config --global commit.gpgsign "),s("span",{class:"token boolean"},"true"),a("\n\n"),s("span",{class:"token comment"},"# Single signature commit"),a("\n"),s("span",{class:"token function"},"git"),a(" commit -S -m "),s("span",{class:"token string"},'"..."'),a("\n\n"),s("span",{class:"token comment"},"# Import GitHub signature"),a("\n"),s("span",{class:"token function"},"curl"),a(" https://github.com/web-flow.gpg "),s("span",{class:"token operator"},"|"),a(" gpg --import\ngpg --sign-key "),s("span",{class:"token operator"},"<"),a("GitHub-keyID"),s("span",{class:"token operator"},">"),a("\n\n"),s("span",{class:"token comment"},"# Log git signature"),a("\n"),s("span",{class:"token function"},"git"),a(" log --show-signature\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br"),s("span",{class:"line-number"},"9"),s("br"),s("span",{class:"line-number"},"10"),s("br"),s("span",{class:"line-number"},"11"),s("br"),s("span",{class:"line-number"},"12"),s("br"),s("span",{class:"line-number"},"13"),s("br"),s("span",{class:"line-number"},"14"),s("br"),s("span",{class:"line-number"},"15"),s("br"),s("span",{class:"line-number"},"16"),s("br"),s("span",{class:"line-number"},"17"),s("br"),s("span",{class:"line-number"},"18"),s("br"),s("span",{class:"line-number"},"19"),s("br"),s("span",{class:"line-number"},"20"),s("br"),s("span",{class:"line-number"},"21"),s("br"),s("span",{class:"line-number"},"22"),s("br")])],-1),qs=s("h3",{id:"license"},[s("a",{class:"header-anchor",href:"#license","aria-hidden":"true"},"#"),a(" LICENSE")],-1),zs=s("h4",{id:"popular-license"},[s("a",{class:"header-anchor",href:"#popular-license","aria-hidden":"true"},"#"),a(" Popular LICENSE")],-1),Ws=s("div",{class:"language-mermaid line-numbers-mode"},[s("pre",null,[s("code",null,"graph TD\nLicense --\x3e A{Open Source}\nA --\x3e|Yes| B{Same License}\nA --\x3e|No| D{List Copyright on Changed}\nB --\x3e|Yes| GPL\nB --\x3e|No| C{Change Docs}\nC --\x3e|Yes| Mozilla\nC --\x3e|No| LGPL\nD --\x3e|Yes| Apache\nD --\x3e|No| E{Enterprise}\nE --\x3e|Yes| MIT\nE --\x3e|No| BSD\n")]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br"),s("span",{class:"line-number"},"9"),s("br"),s("span",{class:"line-number"},"10"),s("br"),s("span",{class:"line-number"},"11"),s("br"),s("span",{class:"line-number"},"12"),s("br")])],-1),Ys=s("p",null,[s("img",{src:"/awesome-notes/assets/6_free_software_licenses.344bcf8c.png",alt:"Free Software License"})],-1),Vs=s("h4",{id:"unique-license"},[s("a",{class:"header-anchor",href:"#unique-license","aria-hidden":"true"},"#"),a(" Unique LICENSE")],-1),Ks=s("ul",null,[s("li",null,"CC BY-NC-SA 3.0 License")],-1),Js=s("div",{class:"language-html line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token tag"},[s("span",{class:"token tag"},[s("span",{class:"token punctuation"},"<"),a("a")]),a(),s("span",{class:"token attr-name"},"rel"),s("span",{class:"token attr-value"},[s("span",{class:"token punctuation attr-equals"},"="),s("span",{class:"token punctuation"},'"'),a("license"),s("span",{class:"token punctuation"},'"')]),a(),s("span",{class:"token attr-name"},"href"),s("span",{class:"token attr-value"},[s("span",{class:"token punctuation attr-equals"},"="),s("span",{class:"token punctuation"},'"'),a("http://creativecommons.org/licenses/by-nc-sa/3.0/"),s("span",{class:"token punctuation"},'"')]),a("\n "),s("span",{class:"token punctuation"},">")]),s("span",{class:"token tag"},[s("span",{class:"token tag"},[s("span",{class:"token punctuation"},"<"),a("img")]),a("\n "),s("span",{class:"token attr-name"},"alt"),s("span",{class:"token attr-value"},[s("span",{class:"token punctuation attr-equals"},"="),s("span",{class:"token punctuation"},'"'),a("Creative\nCommons License"),s("span",{class:"token punctuation"},'"')]),a("\n "),s("span",{class:"token special-attr"},[s("span",{class:"token attr-name"},"style"),s("span",{class:"token attr-value"},[s("span",{class:"token punctuation attr-equals"},"="),s("span",{class:"token punctuation"},'"'),s("span",{class:"token value css language-css"},[s("span",{class:"token property"},"border-width"),s("span",{class:"token punctuation"},":"),a("0")]),s("span",{class:"token punctuation"},'"')])]),a("\n "),s("span",{class:"token attr-name"},"src"),s("span",{class:"token attr-value"},[s("span",{class:"token punctuation attr-equals"},"="),s("span",{class:"token punctuation"},'"'),a("https://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png"),s("span",{class:"token punctuation"},'"')]),a(),s("span",{class:"token punctuation"},"/>")]),s("span",{class:"token tag"},[s("span",{class:"token tag"},[s("span",{class:"token punctuation"},"")]),s("span",{class:"token tag"},[s("span",{class:"token tag"},[s("span",{class:"token punctuation"},"<"),a("br")]),a(),s("span",{class:"token punctuation"},"/>")]),a("This work is licensed under a\n"),s("span",{class:"token tag"},[s("span",{class:"token tag"},[s("span",{class:"token punctuation"},"<"),a("a")]),a(),s("span",{class:"token attr-name"},"rel"),s("span",{class:"token attr-value"},[s("span",{class:"token punctuation attr-equals"},"="),s("span",{class:"token punctuation"},'"'),a("license"),s("span",{class:"token punctuation"},'"')]),a(),s("span",{class:"token attr-name"},"href"),s("span",{class:"token attr-value"},[s("span",{class:"token punctuation attr-equals"},"="),s("span",{class:"token punctuation"},'"'),a("http://creativecommons.org/licenses/by-nc-sa/3.0/"),s("span",{class:"token punctuation"},'"')]),a("\n "),s("span",{class:"token punctuation"},">")]),a("Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License"),s("span",{class:"token tag"},[s("span",{class:"token tag"},[s("span",{class:"token punctuation"},"")]),a(".\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br"),s("span",{class:"line-number"},"9"),s("br"),s("span",{class:"line-number"},"10"),s("br")])],-1),Xs=s("div",{class:"language-markdown line-numbers-mode"},[s("pre",null,[s("code",null,[a("\\*\\*\n"),s("span",{class:"token bold"},[s("span",{class:"token punctuation"},"**"),s("span",{class:"token content"}," May you do good and not evil.\n"),s("span",{class:"token punctuation"},"**")]),a(" May you find forgiveness for yourself and forgive others.\n"),s("span",{class:"token bold"},[s("span",{class:"token punctuation"},"**"),s("span",{class:"token content"}," May you share freely, never taking more than you give.\n"),s("span",{class:"token punctuation"},"**")]),a("\n\\*\\*\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br")])],-1),Qs=s("div",{class:"language-markdown line-numbers-mode"},[s("pre",null,[s("code",null,"DBAD : DON'T BE A DICK PUBLIC LICENSE:\n\nDo whatever you like with the original work, just don't be a dick.\n\nBeing a dick includes - but is not limited to - the following instances:\n\n1a. Outright copyright infringement - Don't just copy this and change the name.\n1b. Selling the unmodified original with no work done what-so-ever,\nthat's REALLY being a dick.\n1c. Modifying the original work to contain hidden harmful content.\nThat would make you a PROPER dick.\n\nIf you become rich through modifications, related work services, or supporting\nthe original work, share the love. Only a dick would make loads off this work\nand not buy the original works creator(s) a pint.Code is provided with no\nwarranty. Using somebody else's code and bitching when it goes wrong makes\nyou a DONKEY dick. Fix the problem yourself. A non-dick would submit the fix\nback.\n")]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br"),s("span",{class:"line-number"},"9"),s("br"),s("span",{class:"line-number"},"10"),s("br"),s("span",{class:"line-number"},"11"),s("br"),s("span",{class:"line-number"},"12"),s("br"),s("span",{class:"line-number"},"13"),s("br"),s("span",{class:"line-number"},"14"),s("br"),s("span",{class:"line-number"},"15"),s("br"),s("span",{class:"line-number"},"16"),s("br"),s("span",{class:"line-number"},"17"),s("br"),s("span",{class:"line-number"},"18"),s("br")])],-1),Zs=s("div",{class:"language-markdown line-numbers-mode"},[s("pre",null,[s("code",null,"Homework Public License(HPL)\n\nCopyright (c) 2016 Yilong Liu\n\nThis is for your reference only,not for your cheating - Just don't be a dick.\n\nBeing a dick includes - but is not limited to - the following instances:\n\n1a. Outright copyright infringement - Don't just copy this and change the name.\n1b. Reserve a copy of this project and tell your teacher\nthat it is your own homework - Plagiarism is shame.\n\nIf you become rich through modifications, related work services,\nor supporting the original work, share the love. Only a dick would make loads\noff this work and not buy the original works creator(s) a pint.Code is\nprovided with no warranty. Using somebody else's code and bitching when it\ngoes wrong makes you a DONKEY dick. Fix the problem yourself. A non-dick\nwould submit the fix back.\n")]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br"),s("span",{class:"line-number"},"9"),s("br"),s("span",{class:"line-number"},"10"),s("br"),s("span",{class:"line-number"},"11"),s("br"),s("span",{class:"line-number"},"12"),s("br"),s("span",{class:"line-number"},"13"),s("br"),s("span",{class:"line-number"},"14"),s("br"),s("span",{class:"line-number"},"15"),s("br"),s("span",{class:"line-number"},"16"),s("br"),s("span",{class:"line-number"},"17"),s("br"),s("span",{class:"line-number"},"18"),s("br")])],-1),na=s("div",{class:"language-markdown line-numbers-mode"},[s("pre",null,[s("code",null,[a('The Star And Thank Author License (SATA)\n\nCopyright (c) 2016 sabertazimi(sabertazimi@gmail.com)\n\nProject Url: https://github.com/sabertazimi/Awesome-Notes\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the "Software"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nAnd wait, the most important, you shall star/+1/like the project(s) in project url\nsection above first, and then thank the author(s) in Copyright section.\n\nHere are some suggested ways:\n\n'),s("span",{class:"token list punctuation"},"-"),a(" Email the authors a thank-you letter, and make friends with him/her/them.\n"),s("span",{class:"token list punctuation"},"-"),a(" Report bugs or issues.\n"),s("span",{class:"token list punctuation"},"-"),a(" Tell friends what a wonderful project this is.\n"),s("span",{class:"token list punctuation"},"-"),a(' And, sure, you can just express thanks in your mind without telling the world.\n\nContributors of this project by forking have the option to add his/her name and\nforked project url at copyright and project url sections, but shall not delete\nor modify anything else in these two sections.\n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n')])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br"),s("span",{class:"line-number"},"9"),s("br"),s("span",{class:"line-number"},"10"),s("br"),s("span",{class:"line-number"},"11"),s("br"),s("span",{class:"line-number"},"12"),s("br"),s("span",{class:"line-number"},"13"),s("br"),s("span",{class:"line-number"},"14"),s("br"),s("span",{class:"line-number"},"15"),s("br"),s("span",{class:"line-number"},"16"),s("br"),s("span",{class:"line-number"},"17"),s("br"),s("span",{class:"line-number"},"18"),s("br"),s("span",{class:"line-number"},"19"),s("br"),s("span",{class:"line-number"},"20"),s("br"),s("span",{class:"line-number"},"21"),s("br"),s("span",{class:"line-number"},"22"),s("br"),s("span",{class:"line-number"},"23"),s("br"),s("span",{class:"line-number"},"24"),s("br"),s("span",{class:"line-number"},"25"),s("br"),s("span",{class:"line-number"},"26"),s("br"),s("span",{class:"line-number"},"27"),s("br"),s("span",{class:"line-number"},"28"),s("br"),s("span",{class:"line-number"},"29"),s("br"),s("span",{class:"line-number"},"30"),s("br"),s("span",{class:"line-number"},"31"),s("br"),s("span",{class:"line-number"},"32"),s("br"),s("span",{class:"line-number"},"33"),s("br"),s("span",{class:"line-number"},"34"),s("br"),s("span",{class:"line-number"},"35"),s("br"),s("span",{class:"line-number"},"36"),s("br"),s("span",{class:"line-number"},"37"),s("br")])],-1),ea=s("h3",{id:"teamwork"},[s("a",{class:"header-anchor",href:"#teamwork","aria-hidden":"true"},"#"),a(" Teamwork")],-1),sa=s("p",null,"如果在组织的托管空间创建版本库,一定要要为版本库指派一个拥有 Push 权限的团队,以免以“Fork + Pull”模式工作时,Pull Request 没有人响应。",-1),aa=s("h4",{id:"pull-request-work-flow"},[s("a",{class:"header-anchor",href:"#pull-request-work-flow","aria-hidden":"true"},"#"),a(" Pull Request Work Flow")],-1),la=s("ol",null,[s("li",null,"Fork it."),s("li",null,[a("Create your feature branch ("),s("code",null,"git checkout -b my-new-feature"),a(").")]),s("li",null,"Ensure tests are passing."),s("li",null,[a("Commit changes ("),s("code",null,"git commit -am 'Add some feature'"),a(").")]),s("li",null,[a("Push to the branch ("),s("code",null,"git push origin my-new-feature"),a(").")]),s("li",null,"Create new Pull Request.")],-1),ta=s("h3",{id:"github-cli-tool"},[s("a",{class:"header-anchor",href:"#github-cli-tool","aria-hidden":"true"},"#"),a(" GitHub CLI Tool")],-1),ia=s("h4",{id:"cli-installation"},[s("a",{class:"header-anchor",href:"#cli-installation","aria-hidden":"true"},"#"),a(" CLI Installation")],-1),ra=s("p",null,[a("Install "),s("code",null,"gh"),a(" by "),s("code",null,"apt"),a(", according of "),s("a",{href:"https://github.com/cli/cli/blob/trunk/docs/install_linux.md",target:"_blank",rel:"noopener noreferrer"},"official introduction"),a(".")],-1),oa=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,"gh auth login\n")]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),ca=s("h4",{id:"gh-issue-usage"},[s("a",{class:"header-anchor",href:"#gh-issue-usage","aria-hidden":"true"},"#"),a(" GH Issue Usage")],-1),ua=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,"gh issue create\ngh issue close\ngh issue status\ngh issue list\n")]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br")])],-1),pa=s("h4",{id:"gh-pr-usage"},[s("a",{class:"header-anchor",href:"#gh-pr-usage","aria-hidden":"true"},"#"),a(" GH PR Usage")],-1),ba=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[a("gh "),s("span",{class:"token function"},"pr"),a(" checkout\ngh "),s("span",{class:"token function"},"pr"),a(" create\ngh "),s("span",{class:"token function"},"pr"),a(" close\ngh "),s("span",{class:"token function"},"pr"),a(" merge\ngh "),s("span",{class:"token function"},"pr"),a(" status\ngh "),s("span",{class:"token function"},"pr"),a(" list\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br")])],-1),da=s("h4",{id:"gh-repo-usage"},[s("a",{class:"header-anchor",href:"#gh-repo-usage","aria-hidden":"true"},"#"),a(" GH Repo Usage")],-1),ma=s("p",null,"Clone repo:",-1),ha=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[a("gh repo clone cli/cli\n\n"),s("span",{class:"token comment"},"# fastest way to clone authorized user repos"),a("\ngh "),s("span",{class:"token builtin class-name"},"alias"),a(),s("span",{class:"token builtin class-name"},"set"),a(" rc "),s("span",{class:"token string"},"'repo clone'"),a("\ngh rc dragon\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br")])],-1),ga=s("p",null,"Create repo:",-1),ka=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token comment"},"# create a repository under your account using the current directory name"),a("\n$ "),s("span",{class:"token function"},"git"),a(" init my-project\n$ "),s("span",{class:"token builtin class-name"},"cd"),a(" my-project\n$ gh repo create\n\n"),s("span",{class:"token comment"},"# create a repository with a specific name"),a("\n$ gh repo create my-project\n\n"),s("span",{class:"token comment"},"# create a repository in an organization"),a("\n$ gh repo create cli/my-project\n\n"),s("span",{class:"token comment"},"# disable issues and wiki"),a("\n$ gh repo create --enable-issues"),s("span",{class:"token operator"},"="),a("false --enable-wiki"),s("span",{class:"token operator"},"="),a("false\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br"),s("span",{class:"line-number"},"9"),s("br"),s("span",{class:"line-number"},"10"),s("br"),s("span",{class:"line-number"},"11"),s("br"),s("span",{class:"line-number"},"12"),s("br"),s("span",{class:"line-number"},"13"),s("br")])],-1),fa=s("p",null,"Push repo:",-1),va=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" init\n\n"),s("span",{class:"token builtin class-name"},"echo"),a(),s("span",{class:"token string"},'"# RepoName"'),a(),s("span",{class:"token operator"},">>"),a(" README.md\n"),s("span",{class:"token function"},"git"),a(),s("span",{class:"token function"},"add"),a(" README.md\n"),s("span",{class:"token function"},"git"),a(" commit -m "),s("span",{class:"token string"},'"Initial commit"'),a("\n\n"),s("span",{class:"token function"},"git"),a(" remote "),s("span",{class:"token function"},"add"),a(" origin git@github.com:username/RepoName.git\n"),s("span",{class:"token function"},"git"),a(" push -u origin master\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br"),s("span",{class:"line-number"},"7"),s("br"),s("span",{class:"line-number"},"8"),s("br")])],-1),wa=s("p",null,"List repo:",-1),ya=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,"gh repo list sabertazimi\n")]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),xa=s("h3",{id:"wiki"},[s("a",{class:"header-anchor",href:"#wiki","aria-hidden":"true"},"#"),a(" Wiki")],-1),Ca=s("h4",{id:"wiki-git-access"},[s("a",{class:"header-anchor",href:"#wiki-git-access","aria-hidden":"true"},"#"),a(" Wiki Git Access")],-1),Aa=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" clone git@github.com:user/repo.wiki.git\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Ga=s("h3",{id:"shorten-github-url"},[s("a",{class:"header-anchor",href:"#shorten-github-url","aria-hidden":"true"},"#"),a(" Shorten GitHub URL")],-1),Ia=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"curl"),a(" -i http://git.io -F "),s("span",{class:"token string"},'"url=https://github.com/technoweenie"'),a(" -F "),s("span",{class:"token string"},'"code=t"'),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Ea=s("h3",{id:"github-flavored-markdown"},[s("a",{class:"header-anchor",href:"#github-flavored-markdown","aria-hidden":"true"},"#"),a(" GitHub Flavored Markdown")],-1),Ta=s("h4",{id:"link"},[s("a",{class:"header-anchor",href:"#link","aria-hidden":"true"},"#"),a(" Link")],-1),Na=s("h5",{id:"tooltip-of-link"},[s("a",{class:"header-anchor",href:"#tooltip-of-link","aria-hidden":"true"},"#"),a(" Tooltip of Link")],-1),Oa=s("div",{class:"language-md line-numbers-mode"},[s("pre",null,[s("code",null,"This is a [link to a web page](https://url.com 'This title will appear as a tooltip').\n")]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Ra=s("div",{class:"language-md line-numbers-mode"},[s("pre",null,[s("code",null,"![Alt text](https://imageurl.com 'This is a title')\n")]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Sa=s("h5",{id:"label-of-link"},[s("a",{class:"header-anchor",href:"#label-of-link","aria-hidden":"true"},"#"),a(" Label of Link")],-1),Ha=s("div",{class:"language-md line-numbers-mode"},[s("pre",null,[s("code",null,[a("This is a "),s("span",{class:"token url"},[a("["),s("span",{class:"token content"},"link to a web page"),a("]["),s("span",{class:"token variable"},"mylabel"),a("]")]),a(".\n\nThen at the end of the document …\n\n"),s("span",{class:"token url-reference url"},[s("span",{class:"token punctuation"},"["),s("span",{class:"token variable"},"mylabel"),s("span",{class:"token punctuation"},"]"),s("span",{class:"token punctuation"},":"),a(" https://url.com "),s("span",{class:"token string"},"'Optional title'")]),a("\n"),s("span",{class:"token url-reference url"},[s("span",{class:"token punctuation"},"["),s("span",{class:"token variable"},"mylabel"),s("span",{class:"token punctuation"},"]"),s("span",{class:"token punctuation"},":"),a(" https://url.com "),s("span",{class:"token string"},"'Optional title'")]),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br")])],-1),La=s("div",{class:"language-md line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token url"},[s("span",{class:"token operator"},"!"),a("["),s("span",{class:"token content"},"Alt text"),a("]["),s("span",{class:"token variable"},"mylabel"),a("]")]),a("\n\n"),s("span",{class:"token url-reference url"},[s("span",{class:"token punctuation"},"["),s("span",{class:"token variable"},"mylabel"),s("span",{class:"token punctuation"},"]"),s("span",{class:"token punctuation"},":"),a(" https://imageurl.com "),s("span",{class:"token string"},"'This is a title'")]),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br")])],-1),ja=s("h3",{id:"github-pages"},[s("a",{class:"header-anchor",href:"#github-pages","aria-hidden":"true"},"#"),a(" GitHub Pages")],-1),Da=s("p",null,[a("In "),s("code",null,"https://github.com///settings/pages"),a(", setup "),s("code",null,"source"),a(" of pages and "),s("code",null,"Enforce HTTPS"),a(".")],-1),Pa=s("h2",{id:"git-tools"},[s("a",{class:"header-anchor",href:"#git-tools","aria-hidden":"true"},"#"),a(" Git Tools")],-1),Ba=s("h3",{id:"diff-and-patch"},[s("a",{class:"header-anchor",href:"#diff-and-patch","aria-hidden":"true"},"#"),a(" Diff and Patch")],-1),_a=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"diff"),a(" -u "),s("span",{class:"token operator"},"<"),a("src"),s("span",{class:"token operator"},">"),a(),s("span",{class:"token operator"},"<"),a("dist"),s("span",{class:"token operator"},">"),a("\n"),s("span",{class:"token function"},"diff"),a(" -Nur "),s("span",{class:"token operator"},"<"),a("src_dir"),s("span",{class:"token operator"},">"),a(),s("span",{class:"token operator"},"<"),a("dist_dir"),s("span",{class:"token operator"},">"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),Ma=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[a("patch -p"),s("span",{class:"token punctuation"},"["),a("num"),s("span",{class:"token punctuation"},"]"),a(),s("span",{class:"token operator"},"<"),a(" patchFile\npatch -dry -run -p"),s("span",{class:"token punctuation"},"["),a("num"),s("span",{class:"token punctuation"},"]"),a(),s("span",{class:"token operator"},"<"),a(" patchFile\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),Fa=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"diff"),a(" -Nur program_1.0 program_2.0 "),s("span",{class:"token operator"},">"),a(" program_2.0.patch\npatch -p1 "),s("span",{class:"token operator"},"<"),s("span",{class:"token punctuation"},".."),a("/program_2.0.patch\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),Ua=s("h3",{id:"semantic-git-commit-message"},[s("a",{class:"header-anchor",href:"#semantic-git-commit-message","aria-hidden":"true"},"#"),a(" Semantic Git Commit Message")],-1),$a=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/commitizen/cz-cli",target:"_blank",rel:"noopener noreferrer"},"cz-cli")]),s("li",null,[s("a",{href:"https://github.com/commitizen/cz-conventional-changelog",target:"_blank",rel:"noopener noreferrer"},"cz-conventional-changelog")]),s("li",null,[s("a",{href:"https://github.com/conventional-changelog/commitlint",target:"_blank",rel:"noopener noreferrer"},"Commit Linter")])],-1),qa=s("h3",{id:"changelog-generator"},[s("a",{class:"header-anchor",href:"#changelog-generator","aria-hidden":"true"},"#"),a(" Changelog Generator")],-1),za=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/conventional-changelog/standard-version",target:"_blank",rel:"noopener noreferrer"},"standard-version")])],-1),Wa=s("h3",{id:"purge-tool"},[s("a",{class:"header-anchor",href:"#purge-tool","aria-hidden":"true"},"#"),a(" Purge Tool")],-1),Ya=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" rev-list --objects --all\n"),s("span",{class:"token punctuation"},"\\"),a(),s("span",{class:"token operator"},"|"),a(),s("span",{class:"token function"},"grep"),a(),s("span",{class:"token string"},[a('"'),s("span",{class:"token variable"},[s("span",{class:"token variable"},"$("),s("span",{class:"token function"},"git"),a(" verify-pack -v .git/objects/pack/*.idx\n"),s("span",{class:"token punctuation"},"\\"),a(),s("span",{class:"token operator"},"|"),a(),s("span",{class:"token function"},"sort"),a(" -k "),s("span",{class:"token number"},"3"),a(" -n "),s("span",{class:"token operator"},"|"),a(),s("span",{class:"token function"},"tail"),a(" -5 "),s("span",{class:"token operator"},"|"),a(),s("span",{class:"token function"},"awk"),a(),s("span",{class:"token string"},"'{print$1}'"),s("span",{class:"token variable"},")")]),a('"')]),a("\n"),s("span",{class:"token function"},"git"),a(" filter-branch -f --prune-empty --index-filter\n"),s("span",{class:"token punctuation"},"\\"),a(),s("span",{class:"token string"},"'git rm -rf --cached --ignore-unmatch your-file-name'"),a("\n"),s("span",{class:"token punctuation"},"\\"),a(" --tag-name-filter "),s("span",{class:"token function"},"cat"),a(" -- --all\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br"),s("span",{class:"line-number"},"3"),s("br"),s("span",{class:"line-number"},"4"),s("br"),s("span",{class:"line-number"},"5"),s("br"),s("span",{class:"line-number"},"6"),s("br")])],-1),Va=s("h2",{id:"commands-list"},[s("a",{class:"header-anchor",href:"#commands-list","aria-hidden":"true"},"#"),a(" Commands List")],-1),Ka=s("h3",{id:"basic-commands"},[s("a",{class:"header-anchor",href:"#basic-commands","aria-hidden":"true"},"#"),a(" Basic Commands")],-1),Ja=s("h4",{id:"git-config"},[s("a",{class:"header-anchor",href:"#git-config","aria-hidden":"true"},"#"),a(" git config")],-1),Xa=s("h4",{id:"git-help"},[s("a",{class:"header-anchor",href:"#git-help","aria-hidden":"true"},"#"),a(" git help")],-1),Qa=s("h4",{id:"git-init"},[s("a",{class:"header-anchor",href:"#git-init","aria-hidden":"true"},"#"),a(" git init")],-1),Za=s("h4",{id:"git-clone"},[s("a",{class:"header-anchor",href:"#git-clone","aria-hidden":"true"},"#"),a(" git clone")],-1),nl=s("p",null,"clone specific branch",-1),el=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" clone -b branch_name repo_url\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),sl=s("h4",{id:"git-add"},[s("a",{class:"header-anchor",href:"#git-add","aria-hidden":"true"},"#"),a(" git add")],-1),al=s("h4",{id:"git-status"},[s("a",{class:"header-anchor",href:"#git-status","aria-hidden":"true"},"#"),a(" git status")],-1),ll=s("h4",{id:"git-diff"},[s("a",{class:"header-anchor",href:"#git-diff","aria-hidden":"true"},"#"),a(" git diff")],-1),tl=s("h4",{id:"git-difftool"},[s("a",{class:"header-anchor",href:"#git-difftool","aria-hidden":"true"},"#"),a(" git difftool")],-1),il=s("p",null,"外置 diff 工具",-1),rl=s("h4",{id:"git-commit"},[s("a",{class:"header-anchor",href:"#git-commit","aria-hidden":"true"},"#"),a(" git commit")],-1),ol=s("h4",{id:"git-reset"},[s("a",{class:"header-anchor",href:"#git-reset","aria-hidden":"true"},"#"),a(" git reset")],-1),cl=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" reset "),s("span",{class:"token variable"},[s("span",{class:"token variable"},"$("),s("span",{class:"token function"},"git"),a(" merge-base master "),s("span",{class:"token punctuation"},"$("),a("git rev-parse --abbrev-ref HEAD"),s("span",{class:"token punctuation"},")"),s("span",{class:"token variable"},")")]),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),ul=s("ul",null,[s("li",null,[s("code",null,"git rev-parse --abbrev-rev HEAD"),a(" will return the name of the branch currently on")]),s("li",null,[s("code",null,"git merge-base master $(name of your branch)"),a(" will find the best common ancestor between master and current branch")]),s("li",null,[s("code",null,"git reset $(hash of the branch creation)"),a(" will undo all the commits, merges, rebase (preserving changes to the code)")])],-1),pl=s("h4",{id:"git-rm"},[s("a",{class:"header-anchor",href:"#git-rm","aria-hidden":"true"},"#"),a(" git rm")],-1),bl=s("h4",{id:"git-mv"},[s("a",{class:"header-anchor",href:"#git-mv","aria-hidden":"true"},"#"),a(" git mv")],-1),dl=s("h4",{id:"git-clean"},[s("a",{class:"header-anchor",href:"#git-clean","aria-hidden":"true"},"#"),a(" git clean")],-1),ml=s("p",null,"从工作区中移除不想要的文件。可以是编译的临时文件或者合并冲突的文件。",-1),hl=s("h4",{id:"git-branch"},[s("a",{class:"header-anchor",href:"#git-branch","aria-hidden":"true"},"#"),a(" git branch")],-1),gl=s("h4",{id:"git-checkout"},[s("a",{class:"header-anchor",href:"#git-checkout","aria-hidden":"true"},"#"),a(" git checkout")],-1),kl=s("h4",{id:"git-merge"},[s("a",{class:"header-anchor",href:"#git-merge","aria-hidden":"true"},"#"),a(" git merge")],-1),fl=s("h4",{id:"git-mergetool"},[s("a",{class:"header-anchor",href:"#git-mergetool","aria-hidden":"true"},"#"),a(" git mergetool")],-1),vl=s("p",null,"外置 merge 工具",-1),wl=s("h4",{id:"git-log"},[s("a",{class:"header-anchor",href:"#git-log","aria-hidden":"true"},"#"),a(" git log")],-1),yl=s("h4",{id:"git-stash"},[s("a",{class:"header-anchor",href:"#git-stash","aria-hidden":"true"},"#"),a(" git stash")],-1),xl=s("p",null,"临时地保存一些还没有提交的工作,以便在分支上不需要提交未完成工作就可以清理工作目录。",-1),Cl=s("h4",{id:"git-tag"},[s("a",{class:"header-anchor",href:"#git-tag","aria-hidden":"true"},"#"),a(" git tag")],-1),Al=s("h4",{id:"git-fetch"},[s("a",{class:"header-anchor",href:"#git-fetch","aria-hidden":"true"},"#"),a(" git fetch")],-1),Gl=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" fetch "),s("span",{class:"token operator"},"<"),a("repo_name"),s("span",{class:"token operator"},">"),a(),s("span",{class:"token operator"},"<"),a("branch_name"),s("span",{class:"token operator"},">"),a("\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Il=s("h4",{id:"git-pull"},[s("a",{class:"header-anchor",href:"#git-pull","aria-hidden":"true"},"#"),a(" git pull")],-1),El=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" pull --rebase\n"),s("span",{class:"token function"},"git"),a(" pull --allow-unrelated-histories\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),Tl=s("h4",{id:"git-push"},[s("a",{class:"header-anchor",href:"#git-push","aria-hidden":"true"},"#"),a(" git push")],-1),Nl=s("h4",{id:"git-remote"},[s("a",{class:"header-anchor",href:"#git-remote","aria-hidden":"true"},"#"),a(" git remote")],-1),Ol=s("h4",{id:"git-archive"},[s("a",{class:"header-anchor",href:"#git-archive","aria-hidden":"true"},"#"),a(" git archive")],-1),Rl=s("p",null,"创建项目一个指定快照的归档文件",-1),Sl=s("h4",{id:"git-submodule"},[s("a",{class:"header-anchor",href:"#git-submodule","aria-hidden":"true"},"#"),a(" git submodule")],-1),Hl=s("p",null,"管理一个仓库的其他外部仓库。 它可以被用在库或者其他类型的共 享资源上.submodule 命令有几个子命令, 如( add 、 update 、 sync 等等)用来管理这些 资源.",-1),Ll=s("ul",null,[s("li",null,"add submodule")],-1),jl=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" submodule "),s("span",{class:"token function"},"add"),a(" git://github.com/rack/rack.git ./lib/rack\n"),s("span",{class:"token function"},"cat"),a(" .gitmodules\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),Dl=s("ul",null,[s("li",null,"get submodule")],-1),Pl=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" submodule init\n"),s("span",{class:"token function"},"git"),a(" submodule update\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),Bl=s("ul",null,[s("li",null,"sync submodule")],-1),_l=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" pull origin/master --rebase\n"),s("span",{class:"token function"},"git"),a(" submodule update\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br"),s("span",{class:"line-number"},"2"),s("br")])],-1),Ml=s("div",{class:"language-bash line-numbers-mode"},[s("pre",null,[s("code",null,[s("span",{class:"token function"},"git"),a(" submodule update --init --force --remote\n")])]),s("div",{class:"line-numbers-wrapper"},[s("span",{class:"line-number"},"1"),s("br")])],-1),Fl=s("h3",{id:"检查与比较"},[s("a",{class:"header-anchor",href:"#检查与比较","aria-hidden":"true"},"#"),a(" 检查与比较")],-1),Ul=s("h4",{id:"git-show"},[s("a",{class:"header-anchor",href:"#git-show","aria-hidden":"true"},"#"),a(" git show")],-1),$l=s("h4",{id:"git-shortlog"},[s("a",{class:"header-anchor",href:"#git-shortlog","aria-hidden":"true"},"#"),a(" git shortlog")],-1),ql=s("p",null,"创建一个漂亮的 changelog 文件",-1),zl=s("h4",{id:"git-describe"},[s("a",{class:"header-anchor",href:"#git-describe","aria-hidden":"true"},"#"),a(" git describe")],-1),Wl=s("p",null,"接受任何可以解析成一个提交的东西,然后生成一个人类可读的字符串且不可变。 这是一种获得一个提交的描述的方式,它跟一个提交的 SHA-1 值一样是无歧义,但是更具可读性。",-1),Yl=s("h3",{id:"调试"},[s("a",{class:"header-anchor",href:"#调试","aria-hidden":"true"},"#"),a(" 调试")],-1),Vl=s("h4",{id:"git-bisect"},[s("a",{class:"header-anchor",href:"#git-bisect","aria-hidden":"true"},"#"),a(" git bisect")],-1),Kl=s("p",null,"通过自动进行一个二分查找来找到哪一个特定的提交是导致 bug 或者问题的第一个提交。",-1),Jl=s("h4",{id:"git-blame"},[s("a",{class:"header-anchor",href:"#git-blame","aria-hidden":"true"},"#"),a(" git blame")],-1),Xl=s("h4",{id:"git-grep"},[s("a",{class:"header-anchor",href:"#git-grep","aria-hidden":"true"},"#"),a(" git grep")],-1),Ql=s("p",null,"查找任何字符串或者正则表达式",-1),Zl=s("h3",{id:"补丁"},[s("a",{class:"header-anchor",href:"#补丁","aria-hidden":"true"},"#"),a(" 补丁")],-1),nt=s("h4",{id:"git-cherry-pick"},[s("a",{class:"header-anchor",href:"#git-cherry-pick","aria-hidden":"true"},"#"),a(" git cherry-pick")],-1),et=s("p",null,"获得在单个提交中引入的变更,然后尝试将作为一个新的提交引入到你当前分支上",-1),st=s("h4",{id:"git-rebase"},[s("a",{class:"header-anchor",href:"#git-rebase","aria-hidden":"true"},"#"),a(" git rebase")],-1),at=s("h4",{id:"git-revert"},[s("a",{class:"header-anchor",href:"#git-revert","aria-hidden":"true"},"#"),a(" git revert")],-1),lt=s("h3",{id:"邮件"},[s("a",{class:"header-anchor",href:"#邮件","aria-hidden":"true"},"#"),a(" 邮件")],-1),tt=s("h4",{id:"git-apply"},[s("a",{class:"header-anchor",href:"#git-apply","aria-hidden":"true"},"#"),a(" git apply")],-1),it=s("p",null,"应用一个通过 git diff 或者甚至使用 GNU diff 命令创建的补丁",-1),rt=s("h4",{id:"git-am"},[s("a",{class:"header-anchor",href:"#git-am","aria-hidden":"true"},"#"),a(" git am")],-1),ot=s("p",null,"应用来自邮箱的补丁",-1),ct=s("h4",{id:"git-format-patch"},[s("a",{class:"header-anchor",href:"#git-format-patch","aria-hidden":"true"},"#"),a(" git format-patch")],-1),ut=s("p",null,"mailbox 的格式来生成一系列的补丁以便你可以发送到一个邮件列表中",-1),pt=s("h4",{id:"git-imap-send"},[s("a",{class:"header-anchor",href:"#git-imap-send","aria-hidden":"true"},"#"),a(" git imap-send")],-1),bt=s("p",null,"将一个由 git format-patch 生成的邮箱上传至 IMAP 草稿文件夹",-1),dt=s("h4",{id:"git-send-email"},[s("a",{class:"header-anchor",href:"#git-send-email","aria-hidden":"true"},"#"),a(" git send-email")],-1),mt=s("p",null,"通过邮件发送那些使用 git format-patch 生成的补丁",-1),ht=s("h4",{id:"git-request-pull"},[s("a",{class:"header-anchor",href:"#git-request-pull","aria-hidden":"true"},"#"),a(" git request-pull")],-1),gt=s("h3",{id:"外部系统"},[s("a",{class:"header-anchor",href:"#外部系统","aria-hidden":"true"},"#"),a(" 外部系统")],-1),kt=s("h4",{id:"git-svn"},[s("a",{class:"header-anchor",href:"#git-svn","aria-hidden":"true"},"#"),a(" git svn")],-1),ft=s("h4",{id:"git-fast-import"},[s("a",{class:"header-anchor",href:"#git-fast-import","aria-hidden":"true"},"#"),a(" git fast-import")],-1),vt=s("p",null,"对于其他版本控制系统或者从其他任何的格式导入,你可以使用 git fast-import 快速地将其他格式映射到 Git 可以轻松记录的格式",-1),wt=s("h3",{id:"管理"},[s("a",{class:"header-anchor",href:"#管理","aria-hidden":"true"},"#"),a(" 管理")],-1),yt=s("h4",{id:"git-gc"},[s("a",{class:"header-anchor",href:"#git-gc","aria-hidden":"true"},"#"),a(" git gc")],-1),xt=s("p",null,"在你的仓库中执行 ``garbage collection'' ,删除数据库中不需要的文件和将其他文件打包成一种更有效的格式",-1),Ct=s("h4",{id:"git-fsck"},[s("a",{class:"header-anchor",href:"#git-fsck","aria-hidden":"true"},"#"),a(" git fsck")],-1),At=s("p",null,"检查内部数据库的问题或者不一致性",-1),Gt=s("h4",{id:"git-reflog"},[s("a",{class:"header-anchor",href:"#git-reflog","aria-hidden":"true"},"#"),a(" git reflog")],-1),It=s("p",null,"分析你所有分支的头指针的日志来查找出你在重写历史上可能丢失的提交",-1),Et=s("h4",{id:"git-filter-branch"},[s("a",{class:"header-anchor",href:"#git-filter-branch","aria-hidden":"true"},"#"),a(" git filter-branch")],-1),Tt=s("p",null,"根据某些规则来重写大量的提交记录,例如从任何地方删除文件,或者通过过滤一个仓库中的一个单独的子目录以提取出一个项目",-1),Nt=s("h4",{id:"git-note"},[s("a",{class:"header-anchor",href:"#git-note","aria-hidden":"true"},"#"),a(" git-note")],-1),Ot=s("p",null,"为特定 commit 添加 note,一个 commit 只能有一个 note",-1);t.render=function(s,a,l,t,Rt,St){return n(),e("div",null,[i,r,o,c,u,p,b,d,m,h,g,k,f,v,w,y,x,C,A,G,I,E,T,N,O,R,S,H,L,j,D,P,B,_,M,F,U,$,q,z,W,Y,V,K,J,X,Q,Z,nn,en,sn,an,ln,tn,rn,on,cn,un,pn,bn,dn,mn,hn,gn,kn,fn,vn,wn,yn,xn,Cn,An,Gn,In,En,Tn,Nn,On,Rn,Sn,Hn,Ln,jn,Dn,Pn,Bn,_n,Mn,Fn,Un,$n,qn,zn,Wn,Yn,Vn,Kn,Jn,Xn,Qn,Zn,ne,ee,se,ae,le,te,ie,re,oe,ce,ue,pe,be,de,me,he,ge,ke,fe,ve,we,ye,xe,Ce,Ae,Ge,Ie,Ee,Te,Ne,Oe,Re,Se,He,Le,je,De,Pe,Be,_e,Me,Fe,Ue,$e,qe,ze,We,Ye,Ve,Ke,Je,Xe,Qe,Ze,ns,es,ss,as,ls,ts,is,rs,os,cs,us,ps,bs,ds,ms,hs,gs,ks,fs,vs,ws,ys,xs,Cs,As,Gs,Is,Es,Ts,Ns,Os,Rs,Ss,Hs,Ls,js,Ds,Ps,Bs,_s,Ms,Fs,Us,$s,qs,zs,Ws,Ys,Vs,Ks,Js,Xs,Qs,Zs,na,ea,sa,aa,la,ta,ia,ra,oa,ca,ua,pa,ba,da,ma,ha,ga,ka,fa,va,wa,ya,xa,Ca,Aa,Ga,Ia,Ea,Ta,Na,Oa,Ra,Sa,Ha,La,ja,Da,Pa,Ba,_a,Ma,Fa,Ua,$a,qa,za,Wa,Ya,Va,Ka,Ja,Xa,Qa,Za,nl,el,sl,al,ll,tl,il,rl,ol,cl,ul,pl,bl,dl,ml,hl,gl,kl,fl,vl,wl,yl,xl,Cl,Al,Gl,Il,El,Tl,Nl,Ol,Rl,Sl,Hl,Ll,jl,Dl,Pl,Bl,_l,Ml,Fl,Ul,$l,ql,zl,Wl,Yl,Vl,Kl,Jl,Xl,Ql,Zl,nt,et,st,at,lt,tt,it,rt,ot,ct,ut,pt,bt,dt,mt,ht,gt,kt,ft,vt,wt,yt,xt,Ct,At,Gt,It,Et,Tt,Nt,Ot])};export default t;export{l as __pageData}; diff --git a/assets/programming_tools_vim_vimBasicNotes.md.bfbb803e.js b/assets/programming_tools_vim_vimBasicNotes.md.bfbb803e.js new file mode 100644 index 00000000000..95ee24b2127 --- /dev/null +++ b/assets/programming_tools_vim_vimBasicNotes.md.bfbb803e.js @@ -0,0 +1 @@ +import{o as t,c as e,a as l}from"./app.6dd2a1b7.js";const a='{"title":"Vim Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Normal 模式命令","slug":"normal-模式命令"},{"level":3,"title":"重复命令","slug":"重复命令"},{"level":3,"title":"撤销命令","slug":"撤销命令"},{"level":3,"title":"复合命令","slug":"复合命令"},{"level":3,"title":"编辑命令","slug":"编辑命令"},{"level":2,"title":"Insert 模式命令","slug":"insert-模式命令"},{"level":3,"title":"模式转换","slug":"模式转换"},{"level":3,"title":"I 插入","slug":"i-插入"},{"level":3,"title":"I 删除","slug":"i-删除"},{"level":3,"title":"I 粘贴","slug":"i-粘贴"},{"level":2,"title":"可视模式 (Visual Mode)","slug":"可视模式-visual-mode"},{"level":2,"title":"底行模式","slug":"底行模式"},{"level":3,"title":"补全","slug":"补全"},{"level":3,"title":"Range","slug":"range"},{"level":3,"title":"撤销/重复","slug":"撤销-重复"},{"level":3,"title":"Shell","slug":"shell"},{"level":3,"title":"Range 替换","slug":"range-替换"},{"level":3,"title":"global","slug":"global"},{"level":2,"title":"文件与缓冲区","slug":"文件与缓冲区"},{"level":3,"title":"File Search","slug":"file-search"},{"level":3,"title":"缓冲区","slug":"缓冲区"},{"level":3,"title":"保存文件","slug":"保存文件"},{"level":3,"title":"窗口","slug":"窗口"},{"level":3,"title":"标签","slug":"标签"},{"level":3,"title":"文件管理器","slug":"文件管理器"},{"level":2,"title":"宏","slug":"宏"},{"level":2,"title":"Tools","slug":"tools"},{"level":3,"title":"Vundle","slug":"vundle"},{"level":3,"title":"Color Schemes","slug":"color-schemes"},{"level":3,"title":"YouCompleteMe","slug":"youcompleteme"},{"level":3,"title":"ctags","slug":"ctags"},{"level":3,"title":"make","slug":"make"},{"level":3,"title":"内置补全","slug":"内置补全"},{"level":3,"title":"git","slug":"git"},{"level":2,"title":"Documentation","slug":"documentation"},{"level":2,"title":"Error","slug":"error"},{"level":3,"title":"Swap Backup File","slug":"swap-backup-file"},{"level":3,"title":"Error Encoding","slug":"error-encoding"}],"relativePath":"programming/tools/vim/vimBasicNotes.md","lastUpdated":1627196177000}',s={},n=l('

    Vim Basic Notes

    Normal 模式命令

    重复命令

    .

    微型宏: 重复上一次(插入命令 至 <Esc>)录制动作

    ;

    重复 t/T/f/F

    @

    命令作用
    @{register}重复寄存器中的宏命令
    @:重复任意 Ex 命令
    @@重复@命令

    :&

    重复:substitute


    撤销命令

    目的操作重复回退
    做出一个修改{edit}.u
    在行内查找下一指定字符f{char}/t{char};,
    在行内查找上一指定字符F{char}/T{char};,
    在文档中查找下一处匹配项/pattern<CR>nN
    在文档中查找上一处匹配项?pattern<CR>nN
    执行替换😒/target/replacement&u
    执行一系列修改qx{changes}q@xu

    复合命令

    插入

    复合命令等效的长命令
    Cc$
    scl
    S^c
    I^i
    A$a
    oA<CR>
    Oko

    编辑命令

    Operator + {motion} 精神

    操作符命令 + 动作命令(范围)

    :h operator :h :map-operator

    • 操作符命令: 基本编辑命令
    命令作用
    c修改
    d删除
    y复制到寄存器
    g~反转大小写
    gu转换为小写
    gU转换为大写
    >增加缩进
    <减小缩进
    =自动缩进
    !使用外部程序过滤{motion}所跨越的行
    • 动作命令(a(all)/i(in)/t(til))

    e.g $/2l/aw/ap 或 /patterns

    • 模式串: /patterns
    • 0/$: 行首/尾
    • 文本对象: i/a
    • 分隔符文本对象(separator text objects)
    分隔符文本对象选择区域
    a) 或 ab一对圆括号(parentheses)
    i) 或 ib圆括号(parentheses) 内部
    a} 或 aB一对花括号{braces}
    i} 或 iB花括号{braces} 内部
    a]一对方括号[brackets]
    i]方括号[brackets] 内部
    a>一对尖括号 <angle brackets>
    i>尖括号 <angle brackets> 内部
    a'一对单引号'single quotes'
    i'单引号'single quotes' 内部
    a"一对双引号"double quotes"
    i"双引号"double quotes" 内部
    a`一对反引号`backTicks`
    i`反引号`backTicks` 内部
    at一对 XML 标签<xml>tags</xml>
    itXML 标签内部
    • 范围文本对象(range text objects)
    范围文本对象选择范围
    iw当前单词
    aw当前单词及一个空格
    iW当前字串
    aW当前字串及一个空格
    is当前句子
    as当前句子及一个空格
    ip当前段落
    ap当前段落及一个空行

    插入编辑命令

    复合命令等效的长命令
    Cc$
    scl
    S^c
    I^i
    A$a
    oA<CR>
    Oko

    register

    {register}{operator}{motion} / <C-r>{register}

    寄存器符号作用使用范例
    ""无名寄存器e.g yiw / diw
    "a ~ "z有名寄存器e.g "ayiw
    "0复制专用寄存器e.g yiw + diw + "0p
    "_黑洞寄存器/有去无回寄存器e.g "_diw
    "+系统剪贴板寄存器e.g "+p / InsertMode <C-r>+
    "*上次高亮文本寄存器e.g "+p / InsertMode <C-r>*
    "=表达式寄存器e.g "+p / InsertMode <C-r>=
    "%当前文件名
    "#轮换文件名
    ".上次插入的文本
    ":上次执行的 Ex 命令
    "/上次查找的模式

    :reg {register} 显示寄存器内容

    删除

    {number}{register}d/s/x{motion}

    复制

    {number}{register}y{motion}

    粘贴

    {number}{register}p{motion}

    选择

    *

    选中包含光标处字符的单词

    跳转

    基本域
    命令光标动作
    %跳转至下一个配对的范围符号
    j向下移动一个实际行
    gj向下移动一个屏幕行
    k向上移动一个实际行
    gk向上移动一个屏幕行
    w正向移动到下一单词的开头
    b反向移动到当前单词/上一单词的开头
    e正向移动到当前单词/下一单词的结尾
    ge反向移动到上一单词的结尾
    0移动到实际行的行首
    g0移动到屏幕行的行首
    $移动到实际行的行尾
    g$移动到屏幕行的行尾
    ^移动到实际行的第一个非空白字符
    g^移动到屏幕行的第一个非空白字符
    _first char of line
    g_last char of line
    Hjump to top of screen
    Mjump to middle of screen
    Ljump to bottom of screen
    ztcurrent line to top of screen
    zzcurrent line to middle of screen
    zbcurrent line to bottom of screen
    <C-u>/<C-d>翻半页
    <C-b>/<C-f>翻半页
    gdjump to definition
    gijump to last insert position
    #jump to previous same word
    *jump to next same word

    :set path?

    查看'path'值

    命令作用
    [count]G跳转到指定的行号
    /pattern<CR>/?pattern<CR>/n/N跳转到下一个/上一个模式出现之处
    %跳转到匹配的括号所在之处
    (/)跳转到上一句/下一句的开头
    {/}跳转到上一段/下一段的开头
    gf跳转到光标下的文件名
    gg文首
    G文尾
    <N>ggjump to line
    <N>%jump to percent of file
    <C-]>跳转到光标下关键字的定义之处
    `{mark}跳转到一个位置标记
    标记

    m{alpha} 标记当前光标处,标记名为 alpha

    位置标记跳转到
    `{alpha}自定义标记处
    ``当前文件中上次跳转动作之前的位置
    `.上次修改的地方
    `^上次插入的地方
    `[上次修改或复制的起始位置
    `]上次修改或复制的结束位置
    `<上次高亮选区的起始位置
    `>上次高亮选区的结束位置
    拼写检查
    命令作用
    ]s跳到下一处拼写错误
    [s跳到上一处拼写错误
    z=为当前单词提供更正建议
    zg把当前单词添加到拼写文件中
    zw把当前单词从拼写文件中删除
    zug撤销针对当前单词的 zg 或 zw 命令

    查找

    字符
    命令光标动作
    w正向移动到下一单词的开头
    b反向移动到当前单词/上一单词的开头
    e正向移动到当前单词/下一单词的结尾
    ge反向移动到上一单词的结尾
    ;重复/f/F/t/T
    ,撤销/f/F/t/T

    <C-a>/<C-x>: 查找数字,递增/减数字

    /pattern ?pattern
    原字符
    原字符作用范例
    \\c忽略大小写
    \\C大小写敏感
    \\v开启 very magic 模式(可省略转义符)
    < 与 >\\v 模式下的单词定界符
    %()分组符/\\v%(And|D)rew
    \\V开启原义模式(可省略转义符):
    \\w匹配单词类字符(alpha,number,"_")
    \\W匹配非单词字符
    \\x匹配十六进制数[0-9a-fA-F]
    \\_s匹配空白符/换行符
    \\zs界定一个匹配的开始
    \\ze界定一个匹配的结束
    Flags

    置于 patterns 末尾

    Flags作用
    /g全局
    /e光标至匹配词末尾
    /c确认或拒绝每一处修改
    /n会抑制正常的替换行为,只报告本次 substitute 命令匹配的个数
    /e屏蔽错误提示
    /&重复上次 flags

    替换

    :h gU

    • gU{motion} 小写转大写 e.gUaw
    • r{char} 替换光标所在字符
    • gr{char}
    • R/gR 进入替换模式

    缩进

    >{motion}

    e.g >G: 缩进全文

    ={motion}

    gg=G 自动缩进全文

    注释

    \\{motion}

    vim-commentary 插件

    \\\\ 注释行 \\ap 注释段落

    历史记录

    u: 回退命令 <C-r>: 前进命令

    Insert 模式命令

    模式转换

    <C-o> - 进入临时 normal 模式

    I 插入

    特殊字符

    :h digraphs-default :h digraph-table :digraphs

    命令作用
    <C-v>{123}以十进制字符编码插入字符
    <C-v>u{1234}以十六进制字符编码插入字符
    <C-v>{nonDigit}按原义插入非数字字符
    <C-k>{char1}{char2}插入以二合字母{char1}{char2}表示的字符

    I 删除

    命令作用
    <C-h>删除前一个字符(同退格键)
    <C-w>删除前一个单词
    <C-u>删至行首

    I 粘贴

    • <C-r>{register} 粘贴
    • <C-r><C-p>{register} 智能粘贴
    寄存器作用
    0普通寄存器
    =算术寄存器: 在下方输入表达式后,自动粘贴运算结果

    可视模式 (Visual Mode)

    命令作用
    v激活面向字符的可视模式
    V激活面向行的可视模式
    <C-v>激活面向列块的可视模式
    gv重选上次的高亮选区
    shift-vselect current line
    gqsplit selected line into multiple lines
    • o 切换高亮选区的活动端

    底行模式

    :h ex-cmd-index

    黑魔法列表:

    • :normal 将 Ex 命令与 Normal 指令结合在一起的黑魔法
    • :args 文件列表
    • :argdo {ExCommands} 对存于文件列表的所有文件执行 Ex 命令
    • :global 对 patterns 执行 EX 命令
    命令作用
    :edit/:write读写文件
    :tabnew创建新标签页
    :split分割窗口
    :prev/:next前/后标签页
    :bprev/:bnext前/后缓冲区列表
    :copy命令对快速复制一行非常好用
    :[range]delete [x]删除范围内的行[到寄存器 x 中]
    :[range]yank [x]复制范围的行[到寄存器 x 中]
    :[line]put [x]在行后粘贴寄存器 x 中的内容
    :[range]copy/t/co{address}行拷贝到{address} 行之下
    :[range]move/m {address}行移动到{address} 行之下
    :[range]join连接指定范围内的行
    :[range]normal {commands}每一行执行命令{commands}
    :[range]substitute/{pattern}/{string}/[flags]{pattern}替换为{string}
    :[range]global/{pattern}/[cmd]对指定范围内匹配
    :shell打开内置 shell
    :!{commands}执行外部命令
    :args {argList}文件列表
    :argdo {ExCommands}对文件列表中的文件执行命令
    :grep
    :vimgrep
    :make
    cnoremap <expr> %% getcmdtype( ) == ':' ? expand('%:h').'/' : '%%'\n
    1

    补全

    自动补全

    <C-d>

    粘贴补全

    <C-r><C-w>: 将光标所在单词粘贴至命令行

    补全历史记录

    q/ 或 q: 弹出历史记录窗口

    Range

    • {start},{end}
    • number 表示行号,.表示当前行,$表示最后一行,%表示所有行
    • /start_pattern/,/end_pattern/
    符号地址
    1文件的第一行
    $文件的最后一行
    0虚拟行,位于文件第一行上方
    .光标所在行
    'm包含位置标记 m 的行
    '<高亮选区的起始行
    '>高亮选区的结束行
    %整个文件(:1,$ 的简写形式)

    e.g 1 第 1 行 % 所有行 2,$ 第 2 行 - 最后一行 /<html>/,/<\\/html>/ 标签 html 所有行

    撤销/重复

    • @: 重复命令
    • <C-o> 撤销命令

    Shell

    命令作用
    :shell启动一个 shell (输入 exit 返回 Vim)
    :!{cmd}在 shell 中执行{cmd}
    :read !{cmd}在 shell 中执行{cmd} ,并把其标准输出插入到光标下方
    :[range]write !{cmd}在 shell 中执行{cmd} ,以[range] 作为其标准输入
    :[range]!{filter}使用外部程序{filter} 过滤指定的[range]

    Range 替换

    Abolish.vim:超级 substitute 命令

    :[range]s[substitute]/{pattern}/{string}/[flags]

    Range 替换原字符

    原字符作用
    \\c忽略大小写
    \\C大小写敏感
    \\v开启 very magic 模式(可省略转义符)
    < 与 >\\v 模式下的单词定界符
    %( 与 )分组符
    \\V开启原义模式(可省略转义符)
    \\w匹配单词类字符(alpha,number,"_")
    \\W匹配非单词字符
    \\x匹配十六进制数[0-9a-fA-F]
    _s匹配空白符/换行符
    \\zs界定一个匹配的开始
    \\ze界定一个匹配的结束

    Range 替换 Flags

    置于 patterns 末尾

    Flags作用
    /g全局
    /e光标至匹配词末尾
    /c确认或拒绝每一处修改
    /n会抑制正常的替换行为,只报告本次 substitute 命令匹配的个数
    /e屏蔽错误提示
    /&重复上次 flags
    /c 后选项作用
    y替换此处匹配
    n忽略此处匹配
    q退出替换过程
    l“last” —— 替换此处匹配后退出
    a“all” —— 替换此处与之后所有的匹配
    <C-e>向上滚动屏幕
    <C-y>向下滚动屏幕

    替换域中的特殊字符

    符号 作用 |:---------------|:--------------------------------------------------| |\\r|插入一个换行符| |\\t|插入一个制表符| |\\|插入一个反斜杠| |\\1|插入第 1 个子匹配| |\\2|插入第 2 个子匹配(以此类推,最多到\\9)| |\\0|插入匹配模式的所有内容| |&|插入匹配模式的所有内容| |~|使用上一次调用:substitute 时的{string}| |={Vim script}|执行{Vim Script} 表达式;并将返回的结果作为替换{string}|

    global

    • :[range] global[!] /{pattern}/[ExCommands]
    • :g/{start}/ .,{finish} [cmd]

    ':g/re/d' 删除所有的匹配行 ':v/re/d' 只保留匹配行 追加存储 TODO 项至 a 寄存器 :g/TODO/yank A > :reg a

    文件与缓冲区

    built-in fuzzy file search :find or :tabnew

    set nocompatible\nset number\n\nsyntax on\nfiletype plugin indent on\n\n" :find filepath\n" :tabnew filepath\n" :tabp :tabn\n" :b partOfFilepath\n" :ls\nset path+=**\nset wildmenu\nset wildmode=list:longest,full\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    :ls to list opened file, :b to jump to specific file

    缓冲区

    命令作用
    :b{bufferNumber/bufferName}跳转至指定缓冲区
    :bd{bufferNumber/bufferName}删除指定缓冲区

    保存文件

    命令作用
    :w[rite]把缓冲区内容写入磁盘
    :e[dit]!把磁盘文件内容读入缓冲区(即回滚所做修改)
    :qa[ll]!关闭所有窗口,摒弃修改而无需警告
    :wa[ll]!把所有改变的缓冲区写入磁盘

    窗口

    • 创建窗口
    命令作用
    <C-w>s水平切分当前窗口,新窗口仍显示当前缓冲区
    <C-w>v垂直切分当前窗口,新窗口仍显示当前缓冲区
    :sp[lit] {file}水平切分当前窗口,并在新窗口中载入{file}
    :vsp[lit] {file}垂直切分当前窗口,并在新窗口中载入{file}
    • 切换窗口
    命令作用
    <C-w>w/<C-w><C-w>在窗口间循环切换
    <C-w>h切换到左边的窗口
    <C-w>j切换到下边的窗口
    <C-w>k切换到上边的窗口
    <C-w>l切换到右边的窗口
    • 自定义窗口

    :h window-moving

    命令作用
    <C-w>=使所有窗口等宽、等高
    <C-w>_最大化活动窗口的高度
    <C-w>|最大化活动窗口的宽度
    [N]<C-w>_把活动窗口的高度设为[N]行
    [N]<C-w>|把活动窗口的宽度设为[N]列
    :windo lcd {path}设置当前标签页的所有窗口的工作目录
    • 关闭窗口
    Ex 命令Normal 命令作用
    :clo[se]<C-w>c关闭活动窗口
    :on[ly]<C-w>o只保留活动窗口,关闭其他所有窗口

    标签

    • 新建/关闭标签页
    命令作用
    :tabe[dit] {filename}在新标签页中打开{filename}
    <C-w>T把当前窗口移到一个新标签页
    :tabc[lose]关闭当前标签页及其中的所有窗口
    :tabo[nly]只保留活动标签页,关闭所有其他标签页
    • 切换标签页
    Ex 命令Normal 命令作用
    :tabn[ext] {N}{N}gt切换到编号为{N} 的标签页
    :tabn[ext]gt切换到下一标签页
    :tabp[revious]gT切换到上一标签页

    -重排标签页

    :tabmove [N] - N 为 0 时,当前标签页移至首;N 省略时,至尾

    文件管理器

    Ex 命令作用
    :edit ./:e.打开文件管理器,并显示当前工作目录
    :Explore/:E打开文件管理器,并显示活动缓冲区所在的目录

    命令作用
    q{register}开始录制宏,并将其保存到指定寄存器,再次按 q 结束录制
    {number}@{register}命令执行指定寄存器的内容
    @@重复@命令

    register 为小写时,覆盖录制宏;register 为大写时,追加录制宏

    Tools

    Vundle

    git clone https://github.com/VundleVim/Vundle.vim ~/.vim/bundle/Vundle.vim\n
    1
    :PluginInstall\n
    1

    Color Schemes

    • built-in fuzzy file search :find
    • need config
    • :AirlineTheme {theme}
    • :colorscheme {theme}
    set nocompatible\nset number\n\nsyntax on\nfiletype plugin indent on\n\nset shiftwidth=4\nset softtabstop=4\n\nset spell spelllang=en_us\nscriptencoding utf-8\n\nset mouse=a\nset mousehide\n\nset ignorecase\nset smartcase\n\n" :find filepath\n" :tabnew filepath\n" :tabp :tabn\n" :b partOfFilepath\n" :ls\nset path+=**\nset wildmenu\nset wildmode=list:longest,full\n\n" NERDtree like setup for netrw\nlet g:netrw_banner = 0\nlet g:netrw_liststyle = 3\nlet g:netrw_browse_split = 4\nlet g:netrw_altv = 1\nlet g:netrw_winsize = 25\n" let g:netrw_list_hide=netrw_gitignore#Hide()\n" let g:netrw_list_hide.=',\\(^\\|\\s\\s\\)\\zs\\.\\S\\+'\naugroup ProjectDrawer\nautocmd!\nautocmd VimEnter * :Vexplore\naugroup END\n\n" ctags setup\ncommand! MakeTags !ctags -R .\n\n" colorschemes config\ncolorscheme Monokai\n\n" airline config\n" set laststatus=2\nlet g:airline#extensions#tabline#enabled = 1\nlet g:airline#extensions#tabline#left_sep = ' '\nlet g:airline#extensions#tabline#left_alt_sep = '|'\n\n" CtrlP config\nlet g:ctrlp_map = '<c-p>'\nlet g:ctrlp_cmd = 'CtrlP'\nlet g:ctrlp_working_path_mode = 'ra'\nlet g:ctrlp_user_command = 'find %s -type f'\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57

    YouCompleteMe

    need compile and config

    sudo apt-get install build-essential cmake python-dev python3-dev\ncd ~/.vim/bundle/YouCompleteMe\n./install.py --clang-completer\n
    1
    2
    3
    let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py'\n
    1

    ctags

    " ^] jump\n" g^] for ambiguous tags\n" ^t jump back\ncommand! MakeTags !ctags -R .\n
    1
    2
    3
    4
    命令作用
    <C-]>跳转到匹配当前光标所在关键字的第一处标签
    g<C-]>跳转至匹配当前光标所在的关键字
    :tag {keyword}跳转到匹配{keyword}的第一处标签
    :tjump {keyword}提示用户从匹配{keyword}的多处标签中指定一处进行跳转
    :pop 或 <C-t>反向遍历标签历史
    :tag正向遍历标签历史
    :tnext跳转到下一处匹配的标签
    :tprev跳转到上一处匹配的标签
    :tfirst跳转到第一处匹配的标签
    :tlast跳转到最后一处匹配的标签
    :tselect提示用户从标签匹配列表中选择一项进行跳转

    make

    QuickFix 命令作用
    :cnext跳转到下一项
    :cprev跳转到上一项
    :cfirst跳转到第一项
    :clast跳转到最后一项
    :cnfile跳转到下一个文件中的第一项
    :cpfile跳转到上一个文件中的最后一项
    :cc N跳转到第 n 项
    :copen打开 QuickFix 窗口
    :cclose关闭 QuickFix 窗口

    内置补全

    In insert mode

    命令补全类型
    <C-n>普通关键字
    <C-x><C-n>当前缓冲区关键字
    <C-x><C-i>包含文件关键字
    <C-x><C-]>tag 关键字
    <C-x><C-k>字典查找
    <C-x><C-l>整行补全
    <C-x><C-f>文件名补全
    <C-x><C-o>全能(Omni)补全

    可供弹出式菜单使用的命令

    按键操作作用
    <C-n>使用来自补全列表的下一个匹配项(next 匹配项)
    <C-p>使用来自补全列表的上一个匹配项(previous 匹配项)
    <Down>选择来自补全列表的下一个匹配项
    <Up>选择来自补全列表的上一个匹配项
    <C-y>确认使用当前选中的匹配项(yes)
    <C-e>还原最早输入的文本(从自动补全中 exit)
    <C-h>(与<BS>)从当前匹配项中删除一个字符
    <C-l>从当前匹配项中增加一个字符
    {char}中止自动补全并插入字符{char}

    git

    • Gblame + key o
    • Glog + [q/]q/[Q/]Q
    • Gdiff
    • Gcommit/Gstatus
    • Gpull/Gpush

    Documentation

    :help:

    • :help ^n: <C-n> docs in normal mode
    • :help i_^n: <C-n> docs in insert mode
    • :help c_^n: <C-n> docs in commandLine mode
    • :helpgrep command: search docs includes command

    Error

    Swap Backup File

    can't open swap or backup file:

    • create :set directory? directory
    • chown of directory to ${whoami}

    Error Encoding

    set fileencodings=utf-8,gb2312,gb18030,gbk,ucs-bom,cp936,latin1\nset fileformats=unix,dos,mac\nset enc=utf8\nset fencs=utf8,gbk,gb2312,gb18030\nset termencoding=utf-8\n
    1
    2
    3
    4
    5
    ',196);s.render=function(l,a,s,d,r,i){return t(),e("div",null,[n])};export default s;export{a as __pageData}; diff --git a/assets/programming_tools_vim_vimBasicNotes.md.bfbb803e.lean.js b/assets/programming_tools_vim_vimBasicNotes.md.bfbb803e.lean.js new file mode 100644 index 00000000000..ddebce3204b --- /dev/null +++ b/assets/programming_tools_vim_vimBasicNotes.md.bfbb803e.lean.js @@ -0,0 +1 @@ +import{o as t,c as e,a as l}from"./app.6dd2a1b7.js";const a='{"title":"Vim Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Normal 模式命令","slug":"normal-模式命令"},{"level":3,"title":"重复命令","slug":"重复命令"},{"level":3,"title":"撤销命令","slug":"撤销命令"},{"level":3,"title":"复合命令","slug":"复合命令"},{"level":3,"title":"编辑命令","slug":"编辑命令"},{"level":2,"title":"Insert 模式命令","slug":"insert-模式命令"},{"level":3,"title":"模式转换","slug":"模式转换"},{"level":3,"title":"I 插入","slug":"i-插入"},{"level":3,"title":"I 删除","slug":"i-删除"},{"level":3,"title":"I 粘贴","slug":"i-粘贴"},{"level":2,"title":"可视模式 (Visual Mode)","slug":"可视模式-visual-mode"},{"level":2,"title":"底行模式","slug":"底行模式"},{"level":3,"title":"补全","slug":"补全"},{"level":3,"title":"Range","slug":"range"},{"level":3,"title":"撤销/重复","slug":"撤销-重复"},{"level":3,"title":"Shell","slug":"shell"},{"level":3,"title":"Range 替换","slug":"range-替换"},{"level":3,"title":"global","slug":"global"},{"level":2,"title":"文件与缓冲区","slug":"文件与缓冲区"},{"level":3,"title":"File Search","slug":"file-search"},{"level":3,"title":"缓冲区","slug":"缓冲区"},{"level":3,"title":"保存文件","slug":"保存文件"},{"level":3,"title":"窗口","slug":"窗口"},{"level":3,"title":"标签","slug":"标签"},{"level":3,"title":"文件管理器","slug":"文件管理器"},{"level":2,"title":"宏","slug":"宏"},{"level":2,"title":"Tools","slug":"tools"},{"level":3,"title":"Vundle","slug":"vundle"},{"level":3,"title":"Color Schemes","slug":"color-schemes"},{"level":3,"title":"YouCompleteMe","slug":"youcompleteme"},{"level":3,"title":"ctags","slug":"ctags"},{"level":3,"title":"make","slug":"make"},{"level":3,"title":"内置补全","slug":"内置补全"},{"level":3,"title":"git","slug":"git"},{"level":2,"title":"Documentation","slug":"documentation"},{"level":2,"title":"Error","slug":"error"},{"level":3,"title":"Swap Backup File","slug":"swap-backup-file"},{"level":3,"title":"Error Encoding","slug":"error-encoding"}],"relativePath":"programming/tools/vim/vimBasicNotes.md","lastUpdated":1627196177000}',s={},n=l('',196);s.render=function(l,a,s,d,r,i){return t(),e("div",null,[n])};export default s;export{a as __pageData}; diff --git a/assets/stack_frame.daa8403a.png b/assets/stack_frame.daa8403a.png new file mode 100644 index 0000000000000000000000000000000000000000..21bdc7e8bd1f2dea43cd295725ed0dfbf7076972 GIT binary patch literal 50714 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,li>ul{margin:0}table{display:block;border-collapse:collapse;margin:1rem 0;overflow-x:auto}tr{border-top:1px solid #dfe2e5}tr:nth-child(2n){background-color:#f6f8fa}td,th{border:1px solid #dfe2e5;padding:.6em 1em}blockquote{margin:1rem 0;border-left:.2rem solid #dfe2e5;padding:.25rem 0 .25rem 1rem;font-size:1rem;color:#999}blockquote>p{margin:0}form{margin:0}.theme.sidebar-open .sidebar-mask{display:block}.theme.no-navbar>h1,.theme.no-navbar>h2,.theme.no-navbar>h3,.theme.no-navbar>h4,.theme.no-navbar>h5,.theme.no-navbar>h6{margin-top:1.5rem;padding-top:0}.theme.no-navbar aside{top:0}@media screen and (min-width:720px){.theme.no-sidebar aside{display:none}.theme.no-sidebar main{margin-left:0}}.sidebar-mask{position:fixed;z-index:2;display:none;width:100vw;height:100vh}code{margin:0;border-radius:3px;padding:.25rem .5rem;font-family:var(--code-font-family);font-size:.85em;color:var(--c-text-light);background-color:var(--code-inline-bg-color)}code .token.deleted{color:#ec5975}code .token.inserted{color:var(--c-brand)}div[class*=language-]{position:relative;margin:1rem -1.5rem;background-color:var(--code-bg-color);overflow-x:auto}li>div[class*=language-]{border-radius:6px 0 0 6px;margin:1rem -1.5rem 1rem -1.25rem}@media (min-width:420px){div[class*=language-]{margin:1rem 0;border-radius:6px}li>div[class*=language-]{margin:1rem 0 1rem 0;border-radius:6px}}[class*=language-] code,[class*=language-] pre{text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}[class*=language-] pre{position:relative;z-index:1;margin:0;padding:1.25rem 1.5rem;background:0 0;overflow-x:auto}[class*=language-] code{padding:0;line-height:var(--code-line-height);font-size:var(--code-font-size);color:#eee}.highlight-lines{position:absolute;top:0;bottom:0;left:0;padding:1.25rem 0;width:100%;line-height:var(--code-line-height);font-family:var(--code-font-family);font-size:var(--code-font-size);user-select:none;overflow:hidden}.highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode{padding-left:3.5rem}.line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid rgba(0,0,0,.5);padding:1.25rem 0;width:3.5rem;text-align:center;line-height:var(--code-line-height);font-family:var(--code-font-family);font-size:var(--code-font-size);color:#888}div[class*=language-]:before{position:absolute;top:.6em;right:1em;z-index:2;font-size:.8rem;color:#888}div[class~=language-html]:before,div[class~=language-markup]:before{content:'html'}div[class~=language-markdown]:before,div[class~=language-md]:before{content:'md'}div[class~=language-css]:before{content:'css'}div[class~=language-sass]:before{content:'sass'}div[class~=language-scss]:before{content:'scss'}div[class~=language-less]:before{content:'less'}div[class~=language-stylus]:before{content:'styl'}div[class~=language-javascript]:before,div[class~=language-js]:before{content:'js'}div[class~=language-ts]:before,div[class~=language-typescript]:before{content:'ts'}div[class~=language-json]:before{content:'json'}div[class~=language-rb]:before,div[class~=language-ruby]:before{content:'rb'}div[class~=language-py]:before,div[class~=language-python]:before{content:'py'}div[class~=language-bash]:before,div[class~=language-sh]:before{content:'sh'}div[class~=language-php]:before{content:'php'}div[class~=language-go]:before{content:'go'}div[class~=language-rust]:before{content:'rust'}div[class~=language-java]:before{content:'java'}div[class~=language-c]:before{content:'c'}div[class~=language-yaml]:before{content:'yaml'}div[class~=language-dockerfile]:before{content:'dockerfile'}div[class~=language-vue]:before{content:'vue'}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.custom-block.danger,.custom-block.tip,.custom-block.warning{margin:1rem 0;border-left:.5rem solid;padding:.1rem 1.5rem;overflow-x:auto}.custom-block.tip{background-color:#f3f5f7;border-color:var(--c-brand)}.custom-block.warning{border-color:#e7c000;color:#6b5900;background-color:rgba(255,229,100,.3)}.custom-block.warning .custom-block-title{color:#b29400}.custom-block.warning a{color:var(--c-text)}.custom-block.danger{border-color:#c00;color:#4d0000;background-color:#ffe6e6}.custom-block.danger .custom-block-title{color:#900}.custom-block.danger a{color:var(--c-text)}.custom-block.details{position:relative;display:block;border-radius:2px;margin:1.6em 0;padding:1.6em;background-color:#eee}.custom-block.details h4{margin-top:0}.custom-block.details figure:last-child,.custom-block.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-block.details summary{outline:0;cursor:pointer}.custom-block-title{margin-bottom:-.4rem;font-weight:600}.sidebar-links{margin:0;padding:0;list-style:none}.sidebar-link-item{display:block;margin:0;border-left:.25rem solid transparent;color:var(--c-text)}a.sidebar-link-item:hover{text-decoration:none;color:var(--c-brand)}a.sidebar-link-item.active{color:var(--c-brand)}.sidebar>.sidebar-links{padding:.75rem 0 5rem}@media (min-width:720px){.sidebar>.sidebar-links{padding:1.5rem 0}}.sidebar>.sidebar-links>.sidebar-link+.sidebar-link{padding-top:.5rem}@media (min-width:720px){.sidebar>.sidebar-links>.sidebar-link+.sidebar-link{padding-top:1.25rem}}.sidebar>.sidebar-links>.sidebar-link>.sidebar-link-item{padding:.35rem 1.5rem .35rem 1.25rem;font-size:1.1rem;font-weight:700}.sidebar>.sidebar-links>.sidebar-link>a.sidebar-link-item.active{border-left-color:var(--c-brand);font-weight:600}.sidebar>.sidebar-links>.sidebar-link>.sidebar-links>.sidebar-link>.sidebar-link-item{display:block;padding:.35rem 1.5rem .35rem 2rem;line-height:1.4;font-size:1rem;font-weight:400}.sidebar>.sidebar-links>.sidebar-link>.sidebar-links>.sidebar-link>a.sidebar-link-item.active{border-left-color:var(--c-brand);font-weight:600}.sidebar>.sidebar-links>.sidebar-link>.sidebar-links>.sidebar-link>.sidebar-links>.sidebar-link>.sidebar-link-item{display:block;padding:.3rem 1.5rem .3rem 3rem;line-height:1.4;font-size:.9rem;font-weight:400}.sidebar>.sidebar-links>.sidebar-link>.sidebar-links>.sidebar-link>.sidebar-links>.sidebar-link>.sidebar-links>.sidebar-link>.sidebar-link-item{display:block;padding:.3rem 1.5rem .3rem 4rem;line-height:1.4;font-size:.9rem;font-weight:400}.debug[data-v-edc1134c]{box-sizing:border-box;position:fixed;right:8px;bottom:8px;z-index:9999;border-radius:4px;width:74px;height:32px;color:#eee;overflow:hidden;cursor:pointer;background-color:rgba(0,0,0,.85);transition:all .15s ease}.debug[data-v-edc1134c]:hover{background-color:rgba(0,0,0,.75)}.debug.open[data-v-edc1134c]{right:0;bottom:0;width:100%;height:100%;margin-top:0;border-radius:0;padding:0 0;overflow:scroll}@media (min-width:512px){.debug.open[data-v-edc1134c]{width:512px}}.debug.open[data-v-edc1134c]:hover{background-color:rgba(0,0,0,.85)}.title[data-v-edc1134c]{margin:0;padding:6px 16px 6px;line-height:20px;font-size:13px}.block[data-v-edc1134c]{margin:2px 0 0;border-top:1px solid rgba(255,255,255,.16);padding:8px 16px;font-family:Hack,monospace;font-size:13px}.block+.block[data-v-edc1134c]{margin-top:8px}.nav-bar-title[data-v-f07481ba]{font-size:1.3rem;font-weight:600;color:var(--c-text)}.nav-bar-title[data-v-f07481ba]:hover{text-decoration:none}.logo[data-v-f07481ba]{margin-right:.75rem;height:1.3rem;vertical-align:bottom}.icon.outbound{position:relative;top:-1px;display:inline-block;vertical-align:middle;color:var(--c-text-lighter)}.item[data-v-2c9af77b]{display:block;padding:0 1.5rem;line-height:36px;font-size:1rem;font-weight:600;color:var(--c-text);white-space:nowrap}.item.active[data-v-2c9af77b],.item[data-v-2c9af77b]:hover{text-decoration:none;color:var(--c-brand)}.item.external[data-v-2c9af77b]:hover{border-bottom-color:transparent;color:var(--c-text)}@media (min-width:720px){.item[data-v-2c9af77b]{border-bottom:2px solid transparent;padding:0;line-height:24px;font-size:.9rem;font-weight:500}.item.active[data-v-2c9af77b],.item[data-v-2c9af77b]:hover{border-bottom-color:var(--c-brand);color:var(--c-text)}}.item[data-v-22d28cf1]{display:block;padding:0 1.5rem 0 2.5rem;line-height:32px;font-size:.9rem;font-weight:500;color:var(--c-text);white-space:nowrap}@media (min-width:720px){.item[data-v-22d28cf1]{padding:0 24px 0 12px;line-height:32px;font-size:.85rem;font-weight:500;color:var(--c-text);white-space:nowrap}.item.active .arrow[data-v-22d28cf1]{opacity:1}}.item.active[data-v-22d28cf1],.item[data-v-22d28cf1]:hover{text-decoration:none;color:var(--c-brand)}.item.external[data-v-22d28cf1]:hover{border-bottom-color:transparent;color:var(--c-text)}@media (min-width:720px){.arrow[data-v-22d28cf1]{display:inline-block;margin-right:8px;border-top:6px solid #ccc;border-right:4px solid transparent;border-bottom:0;border-left:4px solid transparent;vertical-align:middle;opacity:0;transform:translateY(-2px) rotate(-90deg)}}.nav-dropdown-link[data-v-2a5d8d7e]{position:relative;height:36px;overflow:hidden;cursor:pointer}@media (min-width:720px){.nav-dropdown-link[data-v-2a5d8d7e]{height:auto;overflow:visible}.nav-dropdown-link:hover .dialog[data-v-2a5d8d7e]{display:block}}.nav-dropdown-link.open[data-v-2a5d8d7e]{height:auto}.button[data-v-2a5d8d7e]{display:block;border:0;padding:0 1.5rem;width:100%;text-align:left;line-height:36px;font-family:var(--font-family-base);font-size:1rem;font-weight:600;color:var(--c-text);white-space:nowrap;background-color:transparent;cursor:pointer}.button[data-v-2a5d8d7e]:focus{outline:0}@media (min-width:720px){.button[data-v-2a5d8d7e]{border-bottom:2px solid transparent;padding:0;line-height:24px;font-size:.9rem;font-weight:500}}.button-arrow[data-v-2a5d8d7e]{display:inline-block;margin-top:-1px;margin-left:8px;border-top:6px solid #ccc;border-right:4px solid transparent;border-bottom:0;border-left:4px solid transparent;vertical-align:middle}.button-arrow.right[data-v-2a5d8d7e]{transform:rotate(-90deg)}@media (min-width:720px){.button-arrow.right[data-v-2a5d8d7e]{transform:rotate(0)}}.dialog[data-v-2a5d8d7e]{margin:0;padding:0;list-style:none}@media (min-width:720px){.dialog[data-v-2a5d8d7e]{display:none;position:absolute;top:26px;right:-8px;border-radius:6px;padding:12px 0;min-width:128px;background-color:var(--c-bg);box-shadow:var(--shadow-3)}}.nav-links[data-v-74485887]{padding:.75rem 0;border-bottom:1px solid var(--c-divider)}@media (min-width:720px){.nav-links[data-v-74485887]{display:flex;padding:6px 0 0;align-items:center;border-bottom:0}.item+.item[data-v-74485887]{padding-left:24px}}.sidebar-button{position:absolute;top:.6rem;left:1rem;display:none;padding:.6rem;cursor:pointer}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media screen and (max-width:719px){.sidebar-button{display:block}}.nav-bar[data-v-dd1cb1ee]{position:fixed;top:0;right:0;left:0;z-index:var(--z-index-navbar);display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--c-divider);padding:.7rem 1.5rem .7rem 4rem;height:var(--header-height);background-color:var(--c-bg)}@media (min-width:720px){.nav-bar[data-v-dd1cb1ee]{padding:.7rem 1.5rem}}.flex-grow[data-v-dd1cb1ee]{flex-grow:1}.nav[data-v-dd1cb1ee]{display:none}@media (min-width:720px){.nav[data-v-dd1cb1ee]{display:block}}.sidebar[data-v-74188dea]{position:fixed;top:var(--header-height);bottom:0;left:0;z-index:var(--z-index-sidebar);border-right:1px solid var(--c-divider);width:16.4rem;background-color:var(--c-bg);overflow-y:auto;transform:translateX(-100%);transition:transform .25s ease}@media (min-width:720px){.sidebar[data-v-74188dea]{transform:translateX(0)}}@media (min-width:960px){.sidebar[data-v-74188dea]{width:20rem}}.sidebar.open[data-v-74188dea]{transform:translateX(0)}.nav[data-v-74188dea]{display:block}@media (min-width:720px){.nav[data-v-74188dea]{display:none}}.link[data-v-93821cda]{display:inline-block;font-size:1rem;font-weight:500;color:var(--c-text-light)}.link[data-v-93821cda]:hover{text-decoration:none;color:var(--c-brand)}.icon[data-v-93821cda]{margin-left:4px}.last-updated[data-v-694e09d6]{display:inline-block;margin:0;line-height:1.4;font-size:.9rem;color:var(--c-text-light)}@media (min-width:960px){.last-updated[data-v-694e09d6]{font-size:1rem}}.prefix[data-v-694e09d6]{display:inline-block;font-weight:500}.datetime[data-v-694e09d6]{display:inline-block;margin-left:6px;font-weight:400}.page-footer[data-v-3538c8db]{padding-top:1rem;padding-bottom:1rem;overflow:auto}@media (min-width:960px){.page-footer[data-v-3538c8db]{display:flex;justify-content:space-between;align-items:center}}.updated[data-v-3538c8db]{padding-top:4px}@media (min-width:960px){.updated[data-v-3538c8db]{padding-top:0}}.next-and-prev-link[data-v-5ae8aee1]{padding-top:1rem}.container[data-v-5ae8aee1]{display:flex;justify-content:space-between;border-top:1px solid var(--c-divider);padding-top:1rem}.next[data-v-5ae8aee1],.prev[data-v-5ae8aee1]{display:flex;flex-shrink:0;width:50%}.prev[data-v-5ae8aee1]{justify-content:flex-start;padding-right:12px}.next[data-v-5ae8aee1]{justify-content:flex-end;padding-left:12px}.link[data-v-5ae8aee1]{display:inline-flex;align-items:center;max-width:100%;font-size:1rem;font-weight:500}.text[data-v-5ae8aee1]{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.icon[data-v-5ae8aee1]{display:block;flex-shrink:0;width:16px;height:16px;fill:var(--c-text);transform:translateY(1px)}.icon-prev[data-v-5ae8aee1]{margin-right:8px}.icon-next[data-v-5ae8aee1]{margin-left:8px}.page[data-v-d004a6fc]{padding-top:var(--header-height)}@media (min-width:720px){.page[data-v-d004a6fc]{margin-left:16.4rem}}@media (min-width:960px){.page[data-v-d004a6fc]{margin-left:20rem}}.container[data-v-d004a6fc]{margin:0 auto;padding:0 1.5rem 4rem;max-width:48rem}.content[data-v-d004a6fc]{padding-bottom:1.5rem}@media (max-width:420px){.content[data-v-d004a6fc]{clear:both}}#ads-container{margin:0 auto}@media (min-width:420px){#ads-container{position:relative;right:0;float:right;margin:-8px -8px 24px 24px;width:146px}}@media (max-width:420px){#ads-container{height:105px;margin:1.75rem 0}}@media (min-width:1400px){#ads-container{position:fixed;right:8px;bottom:8px}}.home-hero[data-v-1154499e]{margin:2.5rem 0 2.75rem;padding:0 1.5rem;text-align:center}@media (min-width:420px){.home-hero[data-v-1154499e]{margin:3.5rem 0}}@media (min-width:720px){.home-hero[data-v-1154499e]{margin:4rem 0 4.25rem}}.figure[data-v-1154499e]{padding:0 1.5rem}.image[data-v-1154499e]{display:block;margin:0 auto;width:auto;max-width:100%;max-height:280px}.title[data-v-1154499e]{margin-top:1.5rem;font-size:2rem}@media (min-width:420px){.title[data-v-1154499e]{font-size:3rem}}@media (min-width:720px){.title[data-v-1154499e]{margin-top:2rem}}.description[data-v-1154499e]{margin:0;margin-top:.25rem;line-height:1.3;font-size:1.2rem;color:var(--c-text-light)}@media (min-width:420px){.description[data-v-1154499e]{line-height:1.2;font-size:1.6rem}}.action[data-v-1154499e]{margin-top:1.5rem;display:inline-block}.action.alt[data-v-1154499e]{margin-left:1.5rem}@media (min-width:420px){.action[data-v-1154499e]{margin-top:2rem;display:inline-block}}.action[data-v-1154499e] .item{display:inline-block;border-radius:6px;padding:0 20px;line-height:44px;font-size:1rem;font-weight:500;color:var(--c-bg);background-color:var(--c-brand);border:2px solid var(--c-brand);transition:background-color .1s ease}.action.alt[data-v-1154499e] .item{background-color:var(--c-bg);color:var(--c-brand)}.action[data-v-1154499e] .item:hover{text-decoration:none;color:var(--c-bg);background-color:var(--c-brand-light)}@media (min-width:420px){.action[data-v-1154499e] .item{padding:0 24px;line-height:52px;font-size:1.2rem;font-weight:500}}.home-features[data-v-58405b12]{margin:0 auto;padding:2.5rem 0 2.75rem;max-width:960px}.home-hero+.home-features[data-v-58405b12]{padding-top:0}@media (min-width:420px){.home-features[data-v-58405b12]{padding:3.25rem 0 3.5rem}.home-hero+.home-features[data-v-58405b12]{padding-top:0}}@media (min-width:720px){.home-features[data-v-58405b12]{padding-right:1.5rem;padding-left:1.5rem}}.wrapper[data-v-58405b12]{padding:0 1.5rem}.home-hero+.home-features .wrapper[data-v-58405b12]{border-top:1px solid var(--c-divider);padding-top:2.5rem}@media (min-width:420px){.home-hero+.home-features .wrapper[data-v-58405b12]{padding-top:3.25rem}}@media (min-width:720px){.wrapper[data-v-58405b12]{padding-right:0;padding-left:0}}.container[data-v-58405b12]{margin:0 auto;max-width:392px}@media (min-width:720px){.container[data-v-58405b12]{max-width:960px}}.features[data-v-58405b12]{display:flex;flex-wrap:wrap;margin:-20px -24px}.feature[data-v-58405b12]{flex-shrink:0;padding:20px 24px;width:100%}@media (min-width:720px){.feature[data-v-58405b12]{width:calc(100% / 3)}}.title[data-v-58405b12]{margin:0;border-bottom:0;line-height:1.4;font-size:1.25rem;font-weight:500}@media (min-width:420px){.title[data-v-58405b12]{font-size:1.4rem}}.details[data-v-58405b12]{margin:0;line-height:1.6;font-size:1rem;color:var(--c-text-light)}.title+.details[data-v-58405b12]{padding-top:.25rem}.footer[data-v-d7c9d38c]{margin:0 auto;max-width:960px}@media (min-width:720px){.footer[data-v-d7c9d38c]{padding:0 1.5rem}}.container[data-v-d7c9d38c]{padding:2rem 1.5rem 2.25rem}.home-content+.footer .container[data-v-d7c9d38c],.home-features+.footer .container[data-v-d7c9d38c],.home-hero+.footer .container[data-v-d7c9d38c]{border-top:1px solid var(--c-divider)}@media (min-width:420px){.container[data-v-d7c9d38c]{padding:3rem 1.5rem 3.25rem}}.text[data-v-d7c9d38c]{margin:0;text-align:center;line-height:1.4;font-size:.9rem;color:var(--c-text-light)}.home[data-v-46076ded]{padding-top:var(--header-height)}.home-content[data-v-46076ded]{max-width:960px;margin:0 auto;padding:0 1.5rem}@media (max-width:720px){.home-content[data-v-46076ded]{max-width:392px;padding:0}} \ No newline at end of file diff --git a/assets/web_angular_angularBasicNotes.md.85fd00dc.js b/assets/web_angular_angularBasicNotes.md.85fd00dc.js new file mode 100644 index 00000000000..4e1287cf817 --- /dev/null +++ b/assets/web_angular_angularBasicNotes.md.85fd00dc.js @@ -0,0 +1 @@ +import{o as n,c as s,a}from"./app.6dd2a1b7.js";const e='{"title":"Angular Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Basic","slug":"basic"},{"level":3,"title":"CLI","slug":"cli"},{"level":2,"title":"Module","slug":"module"},{"level":2,"title":"Component","slug":"component"},{"level":3,"title":"Props","slug":"props"},{"level":3,"title":"Event","slug":"event"},{"level":3,"title":"Attributes","slug":"attributes"},{"level":3,"title":"Reference","slug":"reference"},{"level":3,"title":"Pipe","slug":"pipe"},{"level":2,"title":"Service","slug":"service"},{"level":3,"title":"Injection Provider","slug":"injection-provider"},{"level":2,"title":"RxJS","slug":"rxjs"},{"level":3,"title":"Basis","slug":"basis"},{"level":3,"title":"RxJS Pipe Helper","slug":"rxjs-pipe-helper"},{"level":3,"title":"Operator","slug":"operator"},{"level":2,"title":"Router","slug":"router"},{"level":2,"title":"Form","slug":"form"},{"level":2,"title":"Event Binding","slug":"event-binding"},{"level":2,"title":"Directives","slug":"directives"},{"level":3,"title":"Structural Directives","slug":"structural-directives"},{"level":3,"title":"Attribute Directives","slug":"attribute-directives"},{"level":2,"title":"Styles","slug":"styles"},{"level":3,"title":"CSS Class Binding","slug":"css-class-binding"}],"relativePath":"web/angular/angularBasicNotes.md","lastUpdated":1627196035000}',p={},t=a('

    Angular Basic Notes

    Basic

    CLI

    npm install -g @angular/cli\n
    1
    ng new my-app\nng add <package-name>\nng serve --open\nng lint\nng test\nng e2e\n
    1
    2
    3
    4
    5
    6

    production build: suffix / is required

    ng build --prod true --outputPath ./build --baseHref https://sabertazimi.github.io/hust-web/angular/learn/\n
    1
    ng generate --help\n
    1

    Module

    Angular 需要知道如何把应用程序的各个部分组合到一起, 以及该应用需要哪些其它文件和库, 这些信息被称为元数据(metadata. 有些元数据位于@Component装饰器中, 你会把它加到组件类上. 另一些关键性的元数据位于@NgModule装饰器中.

    NgModule 为其中的组件提供了一个编译上下文环境. 根模块总会有一个根组件, 并在引导期间创建它. 任何模块都能包含任意数量的其它组件, 这些组件可以通过路由器加载, 也可以通过模板创建. 那些属于这个 NgModule 的组件会共享同一个编译上下文环境.

    Component

    Props

    import { Input } from '@angular/core';\n\n... {\n  @Input() hero: Hero;\n}\n
    1
    2
    3
    4
    5

    private props

    import { HeroService } from '../hero.service';\n\nconstructor(private heroService: HeroService) { }\n
    1
    2
    3

    Event

    parent

    import { Component, OnInit } from '@angular/core';\n\n@Component({\n  selector: 'app-root',\n  template: `<app-child (valueChange)="displayCounter($event)"></app-child>`,\n})\nexport class AppComponent implements OnInit {\n  ngOnInit() {}\n\n  displayCounter(count) {\n    console.log(count);\n  }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    child

    import { Component, Input, EventEmitter, Output } from '@angular/core';\n\n@Component({\n  selector: 'app-child',\n  template: `<button class="btn btn-primary" (click)="handleClick()">\n    Click me\n  </button>`,\n})\nexport class AppChildComponent {\n  @Output() valueChange: EventEmitter<number> = new EventEmitter();\n  counter = 0;\n\n  handleClick() {\n    this.counter += 1;\n    this.valueChange.emit(this.counter);\n  }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

    Attributes

    Angular 只会绑定到组件的公共属性

    import { MessageService } from '../message.service';\n\n... {\n  constructor(public messageService: MessageService) {}\n}\n
    1
    2
    3
    4
    5
    <div *ngIf="messageService.messages.length">\n  <h2>Messages</h2>\n  <button class="clear" (click)="messageService.clear()">Clear</button>\n  <div *ngFor="let message of messageService.messages">{{message}}</div>\n</div>\n
    1
    2
    3
    4
    5

    Reference

    # refer to DOM

    <div>\n  <label\n    >Hero name:\n    <input #heroName />\n  </label>\n  <button (click)="add(heroName.value); heroName.value=''">add</button>\n</div>\n
    1
    2
    3
    4
    5
    6
    7

    Pipe

    Pure Pipe

    Angular 只有在它检测到输入值发生了纯变更时才会执行纯管道. 纯变更是指对原始类型值 (String、Number、Boolean、Symbol) 的更改, 或者对对象引用 (Date、Array、Function、Object) 的更改. Higher performance.

    Impure Pipe

    Angular 会在每个组件的变更检测周期中执行非纯管道. 非纯管道可能会被调用很多次, 和每个按键或每次鼠标移动一样频繁.

    Async Pipe

    <!-- heroes$ is a Observable -->\n<li *ngFor="let hero of heroes$ | async">{{hero.name}}</li>\n
    1
    2

    Service

    Injection Provider

    @Injectable({\n  providedIn: 'root',\n})\n
    1
    2
    3

    RxJS

    • RxJS 管理所有输入的 input -> consumer/redux action 的调度过程
    • 条件变更之后的自动重新计算 (Reactive)
    • 同步与异步的统一
    • 获取和订阅的统一
    • 现在与未来的统一
    • 可组合的数据变更过程
    • 数据与视图的精确绑定
    • UI 变化很复杂时,用 component 归一化处理
    • state 变化很复杂时,用 action/state 归一化处理
    • data-input 很复杂时,用 RxJS/observable 归一化处理
    • reactive.how

    Basis

    可观察对象可以发送多个任意类型的值 —— 字面量、消息、事件. 无论这些值是同步发送的还是异步发送的, 接收这些值的 API 都是一样的. 由于准备(setup)和清场(teardown)的逻辑都是由可观察对象自己处理的, 因此应用代码只管订阅并消费这些值就可以了, 做完之后, 取消订阅. 无论这个流是击键流、HTTP 响应流还是定时器, 对这些值进行监听和停止监听的接口都是一样的.

    Observer(观察者)是 Observable(可观察对象)推送数据的消费者. 在 RxJS 中, Observer 是一个由回调函数组成的对象, 键名分别为 next, error, complete, 以此接受 Observable 推送的不同类型的通知 (data input).

    Subscription 是一个代表可以终止资源的对象, 表示一个 Observable 的执行过程. Subscription 有一个重要的方法: unsubscribe. 这个方法不需要传入参数, 调用后便会终止相应的资源. Observable 当有数据产生时才会推送给订阅者, 所以它可能会无限次向订阅者推送数据. 因此在 Angular 里面创建组件的时候务必要取消订阅操作, 以避免内存泄漏.

    Subject 既是可观察对象的数据源, 本身也是 Observable. 可以像订阅任何 Observable 一样订阅 Subject. 还可以通过调用它的 next(value) 方法往 Observable 中推送一些值.

    // Create simple observable that emits three values\nconst myObservable = of(1, 2, 3);\n\n// Create observer object\nconst myObserver = {\n  next: (x) => console.log('Observer got a next value: ' + x),\n  error: (err) => console.error('Observer got an error: ' + err),\n  complete: () => console.log('Observer got a complete notification'),\n};\n\n// Execute with the observer object\nconst subscription = myObservable.subscribe(myObserver);\n// Logs:\n// Observer got a next value: 1\n// Observer got a next value: 2\n// Observer got a next value: 3\n// Observer got a complete notification\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    ... {\n  search(term: string): void {\n    this.searchTerms.next(term);\n  }\n\n  ngOnInit(): void {\n    this.heroes$ = this.searchTerms.pipe(\n      // wait 300ms after each keystroke before considering the term\n      debounceTime(300),\n\n      // ignore new term if same as previous term\n      distinctUntilChanged(),\n\n      // switch to new search observable each time the term changes\n      // return another Observable\n      switchMap((term: string) => this.heroService.searchHeroes(term)),\n    );\n  }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    RxJS Pipe Helper

    RxJS 提供了 pipe 辅助函数, 它存在于 Observable 上, 它缓解了操作符不在原型上所带来的问题.

    import { take, map } from 'rxjs/operators';\nimport { of } from 'rxjs/observable/of';\n\nmap.call(take.call(of(1, 2, 3), 2), (val) => val + 2);\n\n// to\nimport { take, map } from 'rxjs/operators';\nimport { of } from 'rxjs/observable/of';\n\nof(1, 2, 3).pipe(\n  take(2),\n  map((val) => val + 2)\n);\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    Operator

    Creation Operator

    • 单值: of, empty, never
    • 多值: from
    • 定时: interval, timer
    • 从事件创建: fromEvent/fromEventPattern
    • 从 Promise 创建: fromPromise
    • 自定义创建: create

    Transformation Operator

    • map
    • mapTo
    • mergeMap/flatMap
    • pluck
    • reduce
    • scan
    • groupBy
    • switch
    • switchMap: 在每次发出时, 会取消前一个内部 Observable (所提供函数的 return value) 的订阅, 然后订阅一个新的 observable. 即当有新的输入时便不再关心之前请求的响应结果.

    借助switchMap操作符, 每个有效的击键事件都会触发一次HttpClient.get()方法调用. 即使在每个请求之间都有至少 300ms 的间隔, 仍然可能会同时存在多个尚未返回的 HTTP 请求. switchMap()会记住原始的请求顺序, 只会返回最近一次 HTTP 方法调用的结果, 以前的那些请求都会被取消和舍弃.

    Filter Operator

    • audit
    • auditTime
    • filter
    • skip
    • first
    • last
    • take
    • takeWhile
    • takeUntil
    • throttle
    • throttleTime
    • debounce
    • debounceTime
    • distinctUntilChanged: 只有当当前值与之前最后一个值 !== 时才将其发出
    • bufferTime
    • subscribeOn
    • ObserveOn

    Combination Operator

    • concat: 保持原来的序列顺序连接两个数据流
    • merge: 合并序列
    • race: 预设条件为其中一个数据流完成
    • forkJoin: 预设条件为所有数据流都完成
    • zip: 取各来源数据流最后一个值合并为对象
    • combineLatest: 取各来源数据流最后一个值合并为数组

    Multi-Cast Operator

    • MultiCast
    • Publish
    • Share

    Error Handling Operator

    • throw
    • catch/catchError
    • retry
    • retryWhen
    • finally

    Utils Operator

    • do/tap
    • delay
    • delayWhen
    • timeout
    • toPromise

    Router

    <router-outlet> 会告诉路由器要在哪里显示路由的视图.

    import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\nimport { HeroesComponent } from './heroes/heroes.component';\n\nconst routes: Routes = [\n  {\n    path: 'heroes',\n    component: HeroesComponent,\n  },\n];\n\n@NgModule({\n  imports: [RouterModule.forRoot(routes)],\n  exports: [RouterModule],\n})\nexport class AppRoutingModule {}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

    Form

    • [(ngModel)]
    • (ngSubmit)

    Event Binding

    • () template syntax for event binding
    <li (click)="onSelect($event.target.name)"></li>\n<li (click)="onSelect(hero.name)"></li>\n
    1
    2

    Directives

    Structural Directives

    For Directive

    <li *ngFor="let hero of heroes">{{hero.name}}</li>\n
    1

    If Directive

    <div *ngIf="selectedHero">Selected</div>\n
    1

    Attribute Directives

    Class Directive

    same to [ngStyle]

    <div [ngClass]="currentClasses">\n  This div is initially saveable, unchanged, and special\n</div>\n
    1
    2
    3
    currentClasses: {};\n\nsetCurrentClasses() {\n  // CSS classes: added/removed per current state of component properties\n  this.currentClasses = {\n    'saveable': this.canSave,\n    'modified': !this.isUnchanged,\n    'special':  this.isSpecial\n  };\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    Styles

    CSS Class Binding

    <!-- toggle the "special" class on/off with a property -->\n<div [class.special]="isSpecial">The class binding is special</div>\n\n<!-- binding to `class.special` trumps the class attribute -->\n<div class="special" [class.special]="!isSpecial">\n  This one is not so special\n</div>\n
    1
    2
    3
    4
    5
    6
    7
    ',91);p.render=function(a,e,p,o,l,c){return n(),s("div",null,[t])};export default p;export{e as __pageData}; diff --git a/assets/web_angular_angularBasicNotes.md.85fd00dc.lean.js b/assets/web_angular_angularBasicNotes.md.85fd00dc.lean.js new file mode 100644 index 00000000000..8f90e58cac1 --- /dev/null +++ b/assets/web_angular_angularBasicNotes.md.85fd00dc.lean.js @@ -0,0 +1 @@ +import{o as n,c as s,a}from"./app.6dd2a1b7.js";const e='{"title":"Angular Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Basic","slug":"basic"},{"level":3,"title":"CLI","slug":"cli"},{"level":2,"title":"Module","slug":"module"},{"level":2,"title":"Component","slug":"component"},{"level":3,"title":"Props","slug":"props"},{"level":3,"title":"Event","slug":"event"},{"level":3,"title":"Attributes","slug":"attributes"},{"level":3,"title":"Reference","slug":"reference"},{"level":3,"title":"Pipe","slug":"pipe"},{"level":2,"title":"Service","slug":"service"},{"level":3,"title":"Injection Provider","slug":"injection-provider"},{"level":2,"title":"RxJS","slug":"rxjs"},{"level":3,"title":"Basis","slug":"basis"},{"level":3,"title":"RxJS Pipe Helper","slug":"rxjs-pipe-helper"},{"level":3,"title":"Operator","slug":"operator"},{"level":2,"title":"Router","slug":"router"},{"level":2,"title":"Form","slug":"form"},{"level":2,"title":"Event Binding","slug":"event-binding"},{"level":2,"title":"Directives","slug":"directives"},{"level":3,"title":"Structural Directives","slug":"structural-directives"},{"level":3,"title":"Attribute Directives","slug":"attribute-directives"},{"level":2,"title":"Styles","slug":"styles"},{"level":3,"title":"CSS Class Binding","slug":"css-class-binding"}],"relativePath":"web/angular/angularBasicNotes.md","lastUpdated":1627196035000}',p={},t=a('',91);p.render=function(a,e,p,o,l,c){return n(),s("div",null,[t])};export default p;export{e as __pageData}; diff --git a/assets/web_css_bootstrapBasicNotes.md.222d8e91.js b/assets/web_css_bootstrapBasicNotes.md.222d8e91.js new file mode 100644 index 00000000000..37e1b908f55 --- /dev/null +++ b/assets/web_css_bootstrapBasicNotes.md.222d8e91.js @@ -0,0 +1 @@ +import{o as n,c as a,a as s}from"./app.6dd2a1b7.js";const t='{"title":"Bootstrap Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Bootstrap Basis","slug":"bootstrap-basis"},{"level":2,"title":"Grid System","slug":"grid-system"},{"level":3,"title":"Basic","slug":"basic"},{"level":3,"title":"row","slug":"row"},{"level":2,"title":"Nav","slug":"nav"},{"level":3,"title":"NavBar","slug":"navbar"},{"level":3,"title":"BreadCrumb","slug":"breadcrumb"},{"level":3,"title":"Scroll Spy","slug":"scroll-spy"},{"level":2,"title":"Tabs and Pills","slug":"tabs-and-pills"},{"level":3,"title":"Tab Pane","slug":"tab-pane"},{"level":3,"title":"Tab Pane JS API","slug":"tab-pane-js-api"},{"level":3,"title":"Tab Pane JS Events","slug":"tab-pane-js-events"},{"level":2,"title":"Collapse","slug":"collapse"},{"level":3,"title":"Accordion","slug":"accordion"},{"level":2,"title":"Text","slug":"text"},{"level":2,"title":"Form","slug":"form"},{"level":3,"title":"Form Basic","slug":"form-basic"},{"level":3,"title":"CheckBox and Select","slug":"checkbox-and-select"},{"level":3,"title":"Form Alerts and Prompts","slug":"form-alerts-and-prompts"},{"level":2,"title":"Table","slug":"table"},{"level":3,"title":"Table Basic Class","slug":"table-basic-class"},{"level":2,"title":"Card","slug":"card"},{"level":3,"title":"Panel","slug":"panel"},{"level":3,"title":"Well","slug":"well"},{"level":2,"title":"Images","slug":"images"},{"level":3,"title":"Img Class","slug":"img-class"},{"level":3,"title":"Thumbnail","slug":"thumbnail"},{"level":3,"title":"Media","slug":"media"},{"level":3,"title":"Embed","slug":"embed"},{"level":2,"title":"Alerts and Prompts","slug":"alerts-and-prompts"},{"level":3,"title":"Labels","slug":"labels"},{"level":3,"title":"Badges","slug":"badges"},{"level":3,"title":"Alerts","slug":"alerts"},{"level":3,"title":"Progress Bars","slug":"progress-bars"},{"level":3,"title":"Tooltip","slug":"tooltip"},{"level":3,"title":"Popover","slug":"popover"},{"level":3,"title":"Modal","slug":"modal"},{"level":2,"title":"Button","slug":"button"},{"level":2,"title":"Jumbotron","slug":"jumbotron"},{"level":2,"title":"Icon-Fonts","slug":"icon-fonts"},{"level":2,"title":"Carousel","slug":"carousel"},{"level":2,"title":"Common Class","slug":"common-class"},{"level":3,"title":"color","slug":"color"},{"level":3,"title":"size","slug":"size"},{"level":3,"title":"state","slug":"state"},{"level":3,"title":"Bootstrap Animation","slug":"bootstrap-animation"},{"level":2,"title":"Bootstrap 4","slug":"bootstrap-4"},{"level":3,"title":"Bootstrap Card","slug":"bootstrap-card"},{"level":2,"title":"Custom Bootstrap Theme","slug":"custom-bootstrap-theme"},{"level":3,"title":"Webpack Setup","slug":"webpack-setup"},{"level":3,"title":"Bootstrap Reboot Tips","slug":"bootstrap-reboot-tips"},{"level":3,"title":"Useful Custom Functions","slug":"useful-custom-functions"},{"level":3,"title":"Custom Global Options","slug":"custom-global-options"},{"level":3,"title":"Custom Colors","slug":"custom-colors"},{"level":3,"title":"Custom Spacing","slug":"custom-spacing"},{"level":3,"title":"Custom Layout","slug":"custom-layout"},{"level":3,"title":"Custom Borders","slug":"custom-borders"},{"level":3,"title":"Custom Navbar and Navigation","slug":"custom-navbar-and-navigation"},{"level":3,"title":"Custom Dropdown","slug":"custom-dropdown"},{"level":3,"title":"Custom List Group","slug":"custom-list-group"},{"level":3,"title":"Custom Card","slug":"custom-card"},{"level":3,"title":"Custom Breadcrumb","slug":"custom-breadcrumb"},{"level":3,"title":"Custom Form","slug":"custom-form"},{"level":2,"title":"Reference","slug":"reference"}],"relativePath":"web/css/bootstrapBasicNotes.md","lastUpdated":1628014655000}',p={},e=s('

    Bootstrap Basic Notes

    Bootstrap Basis

    <UI API>\n  <container/content>\n  <header>\n  </header>\n  <body>\n  </body>\n  <footer>\n  </footer>\n</container/content>\n</UI API>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    Grid System

    Basic

    • 设置宽度: col-xs/sm/md/lg-num
    • 设置偏移量: col-xs/sm/md/lg-pull/push/offset-num

    row

    • row
    • row-header/row-content/row-footer

    Class

    • navbar navbar-default
    • navbar-inverse(color) navbar-fixed-top
    • navbar-form
    • nav-tabs nav-pills
    • navbar-left/right

    Structure

    navbar > container > nav/navbar-header/navbar-nav/navbar-form > li/a

    <nav class="navbar navbar-default">\n  <div class="container-fluid">\n    <!-- Brand and toggle get grouped for better mobile display -->\n    <div class="navbar-header">\n      <button\n        type="button"\n        class="navbar-toggle collapsed"\n        data-toggle="collapse"\n        data-target="#bs-example-navbar-collapse-1"\n        aria-expanded="false"\n      >\n        <span class="sr-only">Toggle navigation</span>\n        <span class="icon-bar"></span>\n        <span class="icon-bar"></span>\n        <span class="icon-bar"></span>\n      </button>\n      <a class="navbar-brand" href="#">Brand</a>\n    </div>\n\n    <!-- Collect the nav links, forms, and other content for toggling -->\n    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">\n      <ul class="nav navbar-nav">\n        <li class="active">\n          <a href="#">Link <span class="sr-only">(current)</span></a>\n        </li>\n        <li><a href="#">Link</a></li>\n        <li class="dropdown">\n          <a\n            href="#"\n            class="dropdown-toggle"\n            data-toggle="dropdown"\n            role="button"\n            aria-haspopup="true"\n            aria-expanded="false"\n          >\n            Dropdown<span class="caret"></span>\n          </a>\n          <ul class="dropdown-menu">\n            <li><a href="#">Action</a></li>\n            <li><a href="#">Another action</a></li>\n            <li><a href="#">Something else here</a></li>\n            <li role="separator" class="divider"></li>\n            <li><a href="#">Separated link</a></li>\n            <li role="separator" class="divider"></li>\n            <li><a href="#">One more separated link</a></li>\n          </ul>\n        </li>\n      </ul>\n      <form class="navbar-form navbar-left" role="search">\n        <div class="form-group">\n          <input type="text" class="form-control" placeholder="Search" />\n        </div>\n        <button type="submit" class="btn btn-default">Submit</button>\n      </form>\n      <ul class="nav navbar-nav navbar-right">\n        <li><a href="#">Link</a></li>\n        <li class="dropdown">\n          <a\n            href="#"\n            class="dropdown-toggle"\n            data-toggle="dropdown"\n            role="button"\n            aria-haspopup="true"\n            aria-expanded="false"\n          >\n            Dropdown <span class="caret"></span>\n          </a>\n          <ul class="dropdown-menu">\n            <li><a href="#">Action</a></li>\n            <li><a href="#">Another action</a></li>\n            <li><a href="#">Something else here</a></li>\n            <li role="separator" class="divider"></li>\n            <li><a href="#">Separated link</a></li>\n          </ul>\n        </li>\n      </ul>\n    </div>\n    <!-- /.navbar-collapse -->\n  </div>\n  <!-- /.container-fluid -->\n</nav>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    body {\n  padding: 50px 0px 0px 0px;\n  z-index: 0;\n}\n\n.navbar-inverse {\n  background: #303f9f;\n}\n\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #fff;\n  background: #1a237e;\n}\n\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  color: #fff;\n  background: #1a237e;\n}\n\n.navbar-inverse .navbar-nav .open .dropdown-menu > li > a,\n.navbar-inverse .navbar-nav .open .dropdown-menu {\n  background-color: #303f9f;\n  color: #eeeeee;\n}\n\n.navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover {\n  color: #000000;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32

    路径导航栏 - Home -> Library -> Data

    <ol class="breadcrumb">\n  <li><a href="#">Home</a></li>\n  <li><a href="#">Library</a></li>\n  <li class="active">Data</li>\n</ol>\n
    1
    2
    3
    4
    5

    Scroll Spy

    body {\n  position: relative;\n}\n\n.affix {\n  top: 100px;\n}\n
    1
    2
    3
    4
    5
    6
    7
    <body data-spy="scroll" data-target="#navbar-example" data-offset="200">\n  <nav class="hidden-xs col-sm-2" id="navbar-example">\n    <ul\n      class="nav nav-tabs"\n      role="tablist"\n      data-spy="affix"\n      data-offset-top="400"\n    >\n      <li><a href="#history">Our History</a></li>\n      <li><a href="#corporate">Corporate</a></li>\n      <li><a href="#facts">Facts</a></li>\n    </ul>\n  </nav>\n\n  <!-- 在某个地方 -->\n  <div id="history">...</div>\n  <div id="corporate">...</div>\n  <div id="facts">...</div>\n</body>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    Tabs and Pills

    • nav-tabs/nav-pills
    • nav-justified/nav-stacked
    • link - active/disabled
    <ul class="nav nav-tabs/nav-pills nav-justified/nav-stacked">\n  <li role="presentation" class="active"><a href="#">Home</a></li>\n  <li role="presentation" class="disabled"><a href="#">Messages</a></li>\n  <li role="presentation" class="dropdown">\n    <a\n      class="dropdown-toggle"\n      data-toggle="dropdown"\n      href="#"\n      role="button"\n      aria-haspopup="true"\n      aria-expanded="false"\n    >\n      Dropdown <span class="caret"></span>\n    </a>\n    <ul class="dropdown-menu">\n      ...\n    </ul>\n  </li>\n</ul>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    Tab Pane

    <div>\n  <!-- Nav tabs -->\n  <ul class="nav nav-tabs" role="tablist">\n    <li role="presentation" class="active">\n      <a href="#home" aria-controls="home" role="tab" data-toggle="tab">Home</a>\n    </li>\n    <li role="presentation">\n      <a href="#profile" aria-controls="profile" role="tab" data-toggle="tab"\n        >Profile</a\n      >\n    </li>\n    <li role="presentation">\n      <a href="#messages" aria-controls="messages" role="tab" data-toggle="tab"\n        >Messages</a\n      >\n    </li>\n    <li role="presentation">\n      <a href="#settings" aria-controls="settings" role="tab" data-toggle="tab"\n        >Settings</a\n      >\n    </li>\n  </ul>\n\n  <!-- Tab panes -->\n  <div class="tab-content">\n    <div role="tabpanel" class="tab-pane fade in active" id="home">...</div>\n    <div role="tabpanel" class="tab-pane fade" id="profile">...</div>\n    <div role="tabpanel" class="tab-pane fade" id="messages">...</div>\n    <div role="tabpanel" class="tab-pane fade" id="settings">...</div>\n  </div>\n</div>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31

    Tab Pane JS API

    $('#myTabs a').click(function (e) {\n  e.preventDefault();\n  $(this).tab('show');\n});\n\n$('#myTabs a[href="#profile"]').tab('show'); // Select tab by name\n$('#myTabs a:first').tab('show'); // Select first tab\n$('#myTabs a:last').tab('show'); // Select last tab\n$('#myTabs li:eq(2) a').tab('show'); // Select third tab (0-indexed)\n
    1
    2
    3
    4
    5
    6
    7
    8
    9

    Tab Pane JS Events

    • hide.bs.tab (on the current active tab)
    • show.bs.tab (on the to-be-shown tab)
    • hidden.bs.tab (on the previous active tab, the same one as for the hide.bs.tab event)
    • shown.bs.tab (on the newly-active just-shown tab, the same one as for the show.bs.tab event)
    $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {\n  e.target; // newly activated tab\n  e.relatedTarget; // previous active tab\n});\n
    1
    2
    3
    4

    Collapse

    href/data-target -> id

    <a\n  class="btn btn-primary"\n  role="button"\n  data-toggle="collapse"\n  href="#collapseExample"\n  aria-expanded="false"\n  aria-controls="collapseExample"\n>\n  Link with href\n</a>\n\n<button\n  class="btn btn-primary"\n  type="button"\n  data-toggle="collapse"\n  data-target="#collapseExample"\n  aria-expanded="false"\n  aria-controls="collapseExample"\n>\n  Button with data-target\n</button>\n\n<div class="collapse in" id="collapseExample">\n  <div class="well">...</div>\n</div>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25

    Accordion

    panel-body/list-group

    <div\n  class="panel-group"\n  id="accordion"\n  role="tablist"\n  aria-multiselectable="true"\n>\n  <div class="panel panel-default">\n    <div class="panel-heading" role="tab" id="headingOne">\n      <h4 class="panel-title">\n        <a\n          role="button"\n          data-toggle="collapse"\n          data-parent="#accordion"\n          href="#collapseOne"\n          aria-expanded="true"\n          aria-controls="collapseOne"\n        >\n          Collapsible Group Item #1\n        </a>\n      </h4>\n    </div>\n    <div\n      id="collapseOne"\n      class="panel-collapse collapse in"\n      role="tabpanel"\n      aria-labelledby="headingOne"\n    >\n      <div class="panel-body">\n        Anim cliche, high life terry richardson ad squid.\n      </div>\n    </div>\n  </div>\n  <div class="panel panel-default">\n    <div class="panel-heading" role="tab" id="headingTwo">\n      <h4 class="panel-title">\n        <a\n          class="collapsed"\n          role="button"\n          data-toggle="collapse"\n          data-parent="#accordion"\n          href="#collapseTwo"\n          aria-expanded="false"\n          aria-controls="collapseTwo"\n        >\n          Collapsible Group Item #2\n        </a>\n      </h4>\n    </div>\n    <div\n      id="collapseTwo"\n      class="panel-collapse collapse"\n      role="tabpanel"\n      aria-labelledby="headingTwo"\n    >\n      <div class="panel-body">\n        Anim cliche, high life terry richardson ad squid.\n      </div>\n    </div>\n  </div>\n  <div class="panel panel-default">\n    <div class="panel-heading" role="tab" id="headingThree">\n      <h4 class="panel-title">\n        <a\n          class="collapsed"\n          role="button"\n          data-toggle="collapse"\n          data-parent="#accordion"\n          href="#collapseThree"\n          aria-expanded="false"\n          aria-controls="collapseThree"\n        >\n          Collapsible Group Item #3\n        </a>\n      </h4>\n    </div>\n    <div\n      id="collapseThree"\n      class="panel-collapse collapse"\n      role="tabpanel"\n      aria-labelledby="headingThree"\n    >\n      <div class="panel-body">\n        Anim cliche, high life terry richardson ad squid.\n      </div>\n    </div>\n  </div>\n</div>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87

    Text

    • text-center/left/right
    • text-primary/info/success/danger

    Form

    <!-- type,format,value -->\n<input id=”” name=””\ntype=”text/email/password/radiobutton/checkbox(checked)/submit/number/range/color/date/url”\nvalue=”(textfield/buttonText)” placeholder=”(默认占位文字)”\n\n<!-- validate input data -->\n\nrequired pattern=”[0-9a-zA-z]{5/13-16}”\n<!-- []:可用字符 {}:字符数目 -->\nmin=”(number)” max=”(number)” step=”(步长:指定输入数字必须倍数关系)”\n<!-- validate input data-->\n/>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    Form Basic

    • <form class="form-horizontal" role="form">
    • <form class="form-inline" role="form">
    <form class="form-horizontal" role="form">\n  <!-- input -->\n  <div class="form-group">\n    <label for="firstName" class="col-sm-2 control-label">First Name</label>\n    <div class="col-sm-10">\n      <input\n        type="text"\n        class="form-control"\n        id="firstName"\n        name="firstName"\n        placeholder="Enter First Name"\n      />\n    </div>\n  </div>\n  <!-- input -->\n  <div class="form-group">\n    <label for="lastName" class="col-sm-2 control-label">Last Name</label>\n    <div class="col-sm-10">\n      <input\n        type="text"\n        class="form-control"\n        id="lastName"\n        name="lastName"\n        placeholder="Enter Last Name"\n      />\n    </div>\n  </div>\n  <!-- input-addon -->\n  <div class="form-group">\n    <label for="telNum" class="col-xs-12 col-sm-2 control-label">\n      Contact Tel\n    </label>\n    <div class="col-xs-5 col-sm-4 col-md-3">\n      <div class="input-group">\n        <div class="input-group-addon">(</div>\n        <input\n          type="tel"\n          class="form-control"\n          id="areaCode"\n          name="areaCode"\n          placeholder="Area code"\n        />\n        <div class="input-group-addon">)</div>\n      </div>\n    </div>\n    <div class="col-xs-7 col-sm-6 col-md-7">\n      <input\n        type="tel"\n        class="form-control"\n        id="telNum"\n        name="telNum"\n        placeholder="Tel. number"\n      />\n    </div>\n  </div>\n  <!-- input -->\n  <div class="form-group">\n    <label for="emailID" class="col-sm-2 control-label">Email</label>\n    <div class="col-sm-10">\n      <input\n        type="email"\n        class="form-control"\n        id="emailID"\n        name="emailID"\n        placeholder="Email"\n      />\n    </div>\n  </div>\n  <!-- check box and select -->\n  <div class="form-group">\n    <div class="checkbox col-sm-5 col-sm-offset-2">\n      <label class="checkbox-inline">\n        <input type="checkbox" name="approve" value="" />\n        <strong>May we contact you?</strong>\n      </label>\n    </div>\n    <div class="col-sm-3 col-sm-offset-1">\n      <select class="form-control">\n        <option>Tel.</option>\n        <option>Email</option>\n      </select>\n    </div>\n  </div>\n  <!-- textarea -->\n  <div class="form-group">\n    <label for="feedback" class="col-sm-2 control-label">Your Feedback</label>\n    <div class="col-sm-10">\n      <textarea\n        class="form-control"\n        id="feedback"\n        name="feedback"\n        rows="12"\n      ></textarea>\n    </div>\n  </div>\n  <!-- submit button -->\n  <div class="form-group">\n    <div class="col-sm-offset-2 col-sm-10">\n      <button type="submit" class="btn btn-primary">Send Feedback</button>\n    </div>\n  </div>\n</form>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    <form>\n  <div class="form-group">\n    <label for="exampleInputEmail1">Email address</label>\n    <input\n      type="email"\n      class="form-control"\n      id="exampleInputEmail1"\n      placeholder="Email"\n    />\n  </div>\n  <div class="form-group">\n    <label for="exampleInputPassword1">Password</label>\n    <input\n      type="password"\n      class="form-control"\n      id="exampleInputPassword1"\n      placeholder="Password"\n    />\n  </div>\n  <div class="form-group">\n    <label for="exampleInputFile">File input</label>\n    <input type="file" id="exampleInputFile" />\n    <p class="help-block">Example block-level help text here.</p>\n  </div>\n  <div class="checkbox">\n    <label> <input type="checkbox" /> Check me out </label>\n  </div>\n  <button type="submit" class="btn btn-default">Submit</button>\n</form>\n\n<div class="row">\n  <div class="col-lg-6">\n    <div class="input-group">\n      <div class="input-group-btn">\n        <button\n          type="button"\n          class="btn btn-default dropdown-toggle"\n          data-toggle="dropdown"\n          aria-haspopup="true"\n          aria-expanded="false"\n        >\n          Action <span class="caret"></span>\n        </button>\n        <ul class="dropdown-menu">\n          <li><a href="#">Action</a></li>\n          <li><a href="#">Another action</a></li>\n          <li><a href="#">Something else here</a></li>\n          <li role="separator" class="divider"></li>\n          <li><a href="#">Separated link</a></li>\n        </ul>\n      </div>\n      <!-- /btn-group -->\n      <input type="text" class="form-control" aria-label="..." />\n    </div>\n    <!-- /input-group -->\n  </div>\n  <!-- /.col-lg-6 -->\n</div>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58

    CheckBox and Select

    <div class="form-group">\n  <div class="checkbox col-sm-5 col-sm-offset-2">\n    <label class="checkbox-inline">\n      <input type="checkbox" name="approve" value="" />\n      <strong>May we contact you?</strong>\n    </label>\n  </div>\n  <div class="col-sm-3 col-sm-offset-1">\n    <select class="form-control">\n      <option>Tel.</option>\n      <option>Email</option>\n    </select>\n  </div>\n</div>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    Form Alerts and Prompts

    • has-color
    • has-feedback
    • form-control-feedback(icon)
    • control-label/form-control/help-block
    <div class="form-group has-success has-feedback">\n  <label class="control-label" for="inputSuccess2">Input with success</label>\n  <input\n    type="text"\n    class="form-control"\n    id="inputSuccess2"\n    aria-describedby="inputSuccess2Status"\n  />\n  <span\n    class="glyphicon glyphicon-ok form-control-feedback"\n    aria-hidden="true"\n  ></span>\n  <span id="inputSuccess2Status" class="sr-only">(success)</span>\n</div>\n<div class="form-group has-warning has-feedback">\n  <label class="control-label" for="inputWarning2">Input with warning</label>\n  <input\n    type="text"\n    class="form-control"\n    id="inputWarning2"\n    aria-describedby="inputWarning2Status"\n  />\n  <span\n    class="glyphicon glyphicon-warning-sign form-control-feedback"\n    aria-hidden="true"\n  ></span>\n  <span id="inputWarning2Status" class="sr-only">(warning)</span>\n</div>\n<div class="form-group has-error has-feedback">\n  <label class="control-label" for="inputError2">Input with error</label>\n  <input\n    type="text"\n    class="form-control"\n    id="inputError2"\n    aria-describedby="inputError2Status"\n  />\n  <span\n    class="glyphicon glyphicon-remove form-control-feedback"\n    aria-hidden="true"\n  ></span>\n  <span id="inputError2Status" class="sr-only">(error)</span>\n</div>\n<div class="form-group has-success has-feedback">\n  <label class="control-label" for="inputGroupSuccess1"\n    >Input group with success</label\n  >\n  <div class="input-group">\n    <span class="input-group-addon">@</span>\n    <input\n      type="text"\n      class="form-control"\n      id="inputGroupSuccess1"\n      aria-describedby="inputGroupSuccess1Status"\n    />\n  </div>\n  <span\n    class="glyphicon glyphicon-ok form-control-feedback"\n    aria-hidden="true"\n  ></span>\n  <span id="inputGroupSuccess1Status" class="sr-only">(success)</span>\n</div>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61

    Table

    Table Basic Class

    • table-striped
    • table-bordered
    • table-hover
    • table-condensed
    • table-responsive
    <div class="table-responsive">\n  <table class="table table-striped">\n    <tr>\n      <td>&nbsp;</td>\n      <th>2013</th>\n      <th>2014</th>\n      <th>2015</th>\n    </tr>\n    <tr>\n      <th>Employees</th>\n      <td>15</td>\n      <td>30</td>\n      <td>40</td>\n    </tr>\n    <tr>\n      <th>Guests Served</th>\n      <td>15000</td>\n      <td>45000</td>\n      <td>100,000</td>\n    </tr>\n    <tr>\n      <th>Special Events</th>\n      <td>3</td>\n      <td>20</td>\n      <td>45</td>\n    </tr>\n    <tr>\n      <th>Annual Turnover</th>\n      <td>$251,325</td>\n      <td>$1,250,375</td>\n      <td>~$3,000,000</td>\n    </tr>\n  </table>\n</div>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34

    Card

    Panel

    <div class="panel panel-primary">\n  <div class="panel-heading">\n    <h3 class="panel-title">Facts At a Glance</h3>\n  </div>\n  <div class="panel-body">\n    <dl class="dl-horizontal">\n      <dt>Started</dt>\n      <dd>3 Feb. 2013</dd>\n      <dt>Major Stake Holder</dt>\n      <dd>HK Fine Foods Inc.</dd>\n      <dt>Last Year's Turnover</dt>\n      <dd>$1,250,375</dd>\n      <dt>Employees</dt>\n      <dd>40</dd>\n    </dl>\n  </div>\n</div>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

    Well

    • well/well-xs/well-sm
    <div class="well">\n  <blockquote>\n    <p>paragraph</p>\n    <footer>\n      Yogi Berra,<cite title="Source Title"\n        >The Wit and Wisdom of Yogi Berra, 2014</cite\n      >\n    </footer>\n  </blockquote>\n</div>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    Images

    Img Class

    • img-responsive
    • img-rounded
    • img-circle
    • img-thumbnail

    Thumbnail

    <div class="row">\n  <div class="col-sm-6 col-md-4">\n    <div class="thumbnail">\n      <img class="img-thumbnail" src="..." alt="..." />\n      <div class="caption">\n        <h3>Thumbnail label</h3>\n        <p>...</p>\n        <p>\n          <a href="#" class="btn btn-primary btn-xs" role="button">Button</a>\n          <a href="#" class="btn btn-default btn-xs" role="button">Button</a>\n        </p>\n      </div>\n    </div>\n  </div>\n</div>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    Media

    • media
    • media-list(ul)
    • media-object
    • media-body
    • media-heading
    • media-left/right
    • media-top/middle/bottom
    <ul class="media-list">\n  <li class="media">\n    <div class="media-left media-middle">\n      <a href="#">\n        <img class="media-object" src="..." alt="..." />\n      </a>\n    </div>\n    <div class="media-body">\n      <h4 class="media-heading">Media heading</h4>\n      ...\n    </div>\n  </li>\n</ul>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    Embed

    • embed-responsive
    • embed-responsive-item
    • targets: <iframe>, <embed>, <video>, <object>
    <!-- 16:9 aspect ratio -->\n<div class="embed-responsive embed-responsive-16by9">\n  <iframe class="embed-responsive-item" src="..."></iframe>\n</div>\n\n<!-- 4:3 aspect ratio -->\n<div class="embed-responsive embed-responsive-4by3">\n  <iframe class="embed-responsive-item" src="..."></iframe>\n</div>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9

    Alerts and Prompts

    Labels

    • target: span
    • label
    • label-color
    • label-size
    <span class="label label-default label-xs">Default</span>\n<span class="label label-primary label-sm">Primary</span>\n<span class="label label-success label-md">Success</span>\n<span class="label label-info label-lg">Info</span>\n<span class="label label-warning">Warning</span>\n<span class="label label-danger">Danger</span>\n
    1
    2
    3
    4
    5
    6

    Badges

    <button class="btn btn-primary" type="button">\n  Messages <span class="badge">4</span>\n</button>\n
    1
    2
    3

    Alerts

    • alert
    • alert-color
    • alert-dismissible
    • alert-link
    <div class="alert alert-warning alert-dismissible" role="alert">\n  <button type="button" class="close" data-dismiss="alert" aria-label="Close">\n    <span aria-hidden="true">&times;</span>\n  </button>\n  <strong>Warning!</strong> Better check yourself, you're not looking too good.\n  <a href="#" class="alert-link">...</a>\n</div>\n
    1
    2
    3
    4
    5
    6
    7

    Progress Bars

    • progress-bar
    • width/aria-valuemin/aria-valuemax
    • progress-bar-color
    • progress-bar-striped
    • stacked: put multi-progress-bar into same .progress
    <div class="progress">\n  <div\n    class="progress-bar progress-bar-success"\n    role="progressbar"\n    aria-valuenow="40"\n    aria-valuemin="0"\n    aria-valuemax="100"\n    style="width:\n  40%"\n  >\n    <span class="sr-only">40% Complete (success)</span>\n  </div>\n</div>\n<div class="progress">\n  <div\n    class="progress-bar progress-bar-info"\n    role="progressbar"\n    aria-valuenow="20"\n    aria-valuemin="0"\n    aria-valuemax="100"\n    style="width:\n  20%"\n  >\n    <span class="sr-only">20% Complete</span>\n  </div>\n</div>\n<div class="progress">\n  <div\n    class="progress-bar progress-bar-warning"\n    role="progressbar"\n    aria-valuenow="60"\n    aria-valuemin="0"\n    aria-valuemax="100"\n    style="width:\n  60%"\n  >\n    <span class="sr-only">60% Complete (warning)</span>\n  </div>\n</div>\n<div class="progress">\n  <div\n    class="progress-bar progress-bar-danger"\n    role="progressbar"\n    aria-valuenow="80"\n    aria-valuemin="0"\n    aria-valuemax="100"\n    style="width:\n  80%"\n  >\n    <span class="sr-only">80% Complete (danger)</span>\n  </div>\n</div>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52

    Tooltip

    • data-toggle="tooltip"
    • data-placement="left"
    • title="Tooltip on left"
    // manually initialization\n$(function () {\n  $('[data-toggle="tooltip"]').tooltip();\n});\n
    1
    2
    3
    4
    <button\n  type="button"\n  class="btn btn-default"\n  data-toggle="tooltip"\n  data-placement="left"\n  title="Tooltip on left"\n>\n  Tooltip on left\n</button>\n\n<button\n  type="button"\n  class="btn btn-default"\n  data-toggle="tooltip"\n  data-placement="top"\n  title="Tooltip on top"\n>\n  Tooltip on top\n</button>\n\n<button\n  type="button"\n  class="btn btn-default"\n  data-toggle="tooltip"\n  data-placement="bottom"\n  title="Tooltip on bottom"\n>\n  Tooltip on bottom\n</button>\n\n<button\n  type="button"\n  class="btn btn-default"\n  data-toggle="tooltip"\n  data-placement="right"\n  title="Tooltip on right"\n>\n  Tooltip on right\n</button>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39

    Popover

    • data-container="body"
    • data-toggle="popover"
    • data-trigger="focus"
    • data-placement="left"
    • title="left"
    • data-content="Button content."
    // manually initialization\n$(function () {\n  $('[data-toggle="popover"]').popover();\n});\n
    1
    2
    3
    4
    <button\n  type="button"\n  class="btn btn-default"\n  data-container="body"\n  data-toggle="popover"\n  data-placement="left"\n  title="left"\n  data-content="Button Content."\n>\n  Popover on left\n</button>\n\n<button\n  type="button"\n  class="btn btn-default"\n  data-container="body"\n  data-toggle="popover"\n  data-placement="top"\n  title="top"\n  data-content="Button content."\n>\n  Popover on top\n</button>\n\n<button\n  type="button"\n  class="btn btn-default"\n  data-container="body"\n  data-toggle="popover"\n  data-placement="bottom"\n  title="bottom"\n  data-content="Button content."\n>\n  Popover on bottom\n</button>\n\n<button\n  type="button"\n  class="btn btn-default"\n  data-container="body"\n  data-toggle="popover"\n  data-placement="right"\n  title="right"\n  data-content="Button content."\n>\n  Popover on right\n</button>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    data-dismiss ="modal"\n
    1

    修饰.modal-dialog、.modal-content

    $().modal('');

    <!-- Button trigger modal -->\n<button\n  type="button"\n  class="btn btn-primary btn-lg"\n  data-toggle="modal"\n  data-target="#myModal"\n>\n  Launch demo modal\n</button>\n\n<!-- Modal -->\n<div\n  class="modal fade"\n  id="myModal"\n  tabindex="-1"\n  role="dialog"\n  aria-labelledby="myModalLabel"\n>\n  <div class="modal-dialog" role="document">\n    <div class="modal-content">\n      <div class="modal-header">\n        <button\n          type="button"\n          class="close"\n          data-dismiss="modal"\n          aria-label="Close"\n        >\n          <span aria-hidden="true">&times;</span>\n        </button>\n        <h4 class="modal-title" id="myModalLabel">Modal title</h4>\n      </div>\n      <div class="modal-body">...</div>\n      <div class="modal-footer">\n        <button type="button" class="btn btn-default" data-dismiss="modal">\n          Close\n        </button>\n        <button type="button" class="btn btn-primary">Save changes</button>\n      </div>\n    </div>\n  </div>\n</div>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <button\n  type="button"\n  class="btn btn-primary"\n  data-toggle="modal"\n  data-target="#exampleModal"\n  data-whatever="@mdo"\n>\n  Open modal for @mdo\n</button>\n<button\n  type="button"\n  class="btn btn-primary"\n  data-toggle="modal"\n  data-target="#exampleModal"\n  data-whatever="@fat"\n>\n  Open modal for @fat\n</button>\n<button\n  type="button"\n  class="btn btn-primary"\n  data-toggle="modal"\n  data-target="#exampleModal"\n  data-whatever="@getBootstrap"\n>\n  Open modal for @getBootstrap\n</button>\n\n<div\n  class="modal fade"\n  id="exampleModal"\n  tabindex="-1"\n  role="dialog"\n  aria-labelledby="exampleModalLabel"\n>\n  <div class="modal-dialog" role="document">\n    <div class="modal-content">\n      <div class="modal-header">\n        <button\n          type="button"\n          class="close"\n          data-dismiss="modal"\n          aria-label="Close"\n        >\n          <span aria-hidden="true">&times;</span>\n        </button>\n        <h4 class="modal-title" id="exampleModalLabel">New message</h4>\n      </div>\n      <div class="modal-body">\n        <form>\n          <div class="form-group">\n            <label for="recipient-name" class="control-label">Recipient:</label>\n            <input type="text" class="form-control" id="recipient-name" />\n          </div>\n          <div class="form-group">\n            <label for="message-text" class="control-label">Message:</label>\n            <textarea class="form-control" id="message-text"></textarea>\n          </div>\n        </form>\n      </div>\n      <div class="modal-footer">\n        <button type="button" class="btn btn-default" data-dismiss="modal">\n          Close\n        </button>\n        <button type="button" class="btn btn-primary">Send message</button>\n      </div>\n    </div>\n  </div>\n</div>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69

    Button

    • targets: a/input/button
    • base: btn
    • color: btn-primary btn-success btn-warning btn-danger btn-info
    • size: btn-xs/sm/lg
    • display: btn-block/btn-main
    • group: btn-toolbar/btn-group/btn-group-vertical/btn-group-lg
    <div class="btn-toolbar">\n  <div class="btn-group">\n    <button class="btn"></button>\n    <button class="btn"></button>\n    <button class="btn"></button>\n  </div>\n</div>\n\n<div class="btn-group btn-group-vertical">\n  <button class="btn"></button>\n  <button class="btn"></button>\n  <button class="btn"></button>\n</div>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    • other: btn-social-icon
    <button data-toggle="””" data-target-”” data-dismiss="””"></button>\n
    1

    Jumbotron

    <div class="jumbotron">\n  <div class="container">\n    <div class="main">\n      <h1>We are Broadway</h1>\n      <a href="#" class="btn-main"> Get started </a>\n    </div>\n  </div>\n</div>\n
    1
    2
    3
    4
    5
    6
    7
    8

    Icon-Fonts

    <span class="glyphicon glyphicon-home" aria-hidden="true"></span>\n<i class="fa fa-phone/fa-fax/fa-envelope"></i>\n
    1
    2

    Slide Show:

    <div id="carousel-example-generic" class="carousel slide" data-ride="carousel">\n  <!-- Indicators -->\n  <ol class="carousel-indicators">\n    <li\n      data-target="#carousel-example-generic"\n      data-slide-to="0"\n      class="active"\n    ></li>\n    <li data-target="#carousel-example-generic" data-slide-to="1"></li>\n    <li data-target="#carousel-example-generic" data-slide-to="2"></li>\n  </ol>\n\n  <!-- Wrapper for slides -->\n  <div class="carousel-inner" role="listbox">\n    <div class="item active">\n      <img src="..." alt="..." />\n      <div class="carousel-caption">...</div>\n    </div>\n    <div class="item">\n      <img src="..." alt="..." />\n      <div class="carousel-caption">...</div>\n    </div>\n    ...\n  </div>\n\n  <!-- Controls -->\n  <a\n    class="left carousel-control"\n    href="#carousel-example-generic"\n    role="button"\n    data-slide="prev"\n  >\n    <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>\n    <span class="sr-only">Previous</span>\n  </a>\n  <a\n    class="right carousel-control"\n    href="#carousel-example-generic"\n    role="button"\n    data-slide="next"\n  >\n    <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>\n    <span class="sr-only">Next</span>\n  </a>\n</div>\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    .carousel(options)\n\nInitializes the carousel with an optional options object\nand starts cycling through items.\nCopy\n\n$('.carousel').carousel({\n  interval: 2000\n})\n\n.carousel('cycle')\n\nCycles through the carousel items from left to right.\n.carousel('pause')\n\nStops the carousel from cycling through items.\n.carousel(number)\n\nCycles the carousel to a particular frame (0 based, similar to an array).\n.carousel('prev')\n\nCycles to the previous item.\n.carousel('next')\n\nCycles to the next item.\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25

    Common Class

    color

    • default/primary/info/warnings/danger

    size

    • xs/sm/md/lg

    state

    • active
    • disabled

    Bootstrap Animation

    • collapse
    • fade
    • in

    Bootstrap 4

    Bootstrap Card

    • .well: .card.bg-light
    • .panel: .card
    • .thumbnail: .card + .card-img/.card-img-top

    Custom Bootstrap Theme

    Webpack Setup

    {\n  "scripts": {\n    "start": "npm run dev",\n    "dev": "cross-env NODE_ENV=development \\\n      webpack-dev-server --port 2333 --mode development --open",\n    "build": "cross-env NODE_ENV=production webpack --mode production",\n    "lint": "stylelint ./src/**/*.scss ./src/**/*.css && \\\n      eslint --ext .js --ext .jsx ./src"\n  },\n  "devDependencies": {\n    "@babel/cli": "^7.2.3",\n    "@babel/core": "^7.3.3",\n    "@babel/plugin-proposal-class-properties": "^7.3.3",\n    "@babel/plugin-proposal-object-rest-spread": "^7.3.2",\n    "@babel/preset-env": "^7.3.1",\n    "autoprefixer": "^8.6.2",\n    "babel-eslint": "^10.0.1",\n    "babel-loader": "^8.0.5",\n    "clean-webpack-plugin": "^0.1.19",\n    "cross-env": "^5.2.0",\n    "css-loader": "^0.28.11",\n    "eslint": "^4.19.1",\n    "eslint-config-airbnb": "^17.0.0",\n    "eslint-loader": "^2.1.0",\n    "eslint-plugin-import": "^2.13.0",\n    "eslint-plugin-jsx-a11y": "^6.1.1",\n    "eslint-plugin-react": "^7.10.0",\n    "html-loader": "^0.5.5",\n    "html-webpack-plugin": "^3.2.0",\n    "mini-css-extract-plugin": "^0.4.0",\n    "node-sass": "^4.11.0",\n    "postcss-loader": "^2.1.5",\n    "precss": "^4.0.0",\n    "sass-loader": "^7.0.3",\n    "style-loader": "^0.21.0",\n    "stylelint": "^9.10.1",\n    "stylelint-config-mass": "^1.0.2",\n    "stylelint-webpack-plugin": "^0.10.5",\n    "webpack": "^4.12.0",\n    "webpack-cli": "^3.0.6",\n    "webpack-dev-server": "^3.2.0"\n  },\n  "dependencies": {\n    "bootstrap": "^4.3.1",\n    "jquery": "^3.3.1",\n    "popper.js": "^1.14.7"\n  }\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    const path = require('path');\n\nconst HtmlWebpackPlugin = require('html-webpack-plugin');\nconst MiniCssExtractPlugin = require('mini-css-extract-plugin');\nconst CleanWebpackPlugin = require('clean-webpack-plugin');\nconst StyleLintPlugin = require('stylelint-webpack-plugin');\n\nconst packageJson = require('./package.json');\n\nconst devMode = process.env.NODE_ENV !== 'production';\nconst useSass = !!packageJson.devDependencies['node-sass'];\n\nconst styleLoader = [\n  devMode ? 'style-loader' : MiniCssExtractPlugin.loader,\n  {\n    loader: 'css-loader',\n    options: {\n      minimize: !devMode,\n    },\n  },\n  'postcss-loader',\n];\n\nif (useSass) {\n  styleLoader.push('sass-loader');\n}\n\nmodule.exports = {\n  entry: {\n    main: './src/index.js',\n  },\n  output: {\n    filename: '[name].[chunkhash].js',\n    path: path.resolve(__dirname, 'build'),\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.(js|jsx)$/,\n        exclude: /node_modules/,\n        use: ['babel-loader', 'eslint-loader'],\n      },\n      {\n        test: /\\.html$/,\n        use: [\n          {\n            loader: 'html-loader',\n            options: {\n              minimize: !devMode,\n            },\n          },\n        ],\n      },\n      {\n        test: /\\.(css|scss)$/,\n        use: [...styleLoader],\n      },\n    ],\n  },\n  plugins: [\n    new CleanWebpackPlugin('build'),\n    new HtmlWebpackPlugin({\n      hash: true,\n      template: './src/index.html',\n      filename: './index.html',\n    }),\n    new MiniCssExtractPlugin({\n      filename: devMode ? '[name].css' : '[name].[hash].css',\n      chunkFilename: devMode ? '[id].css' : '[id].[hash].css',\n    }),\n    new StyleLintPlugin(),\n  ],\n  resolve: {\n    extensions: ['.js', '.jsx'],\n  },\n  devtool: 'source-map',\n};\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77

    Bootstrap Reboot Tips

    • @import '~bootstrap/scss/reboot;

    Some useful best practices:

    • body font-size: 1rem for scalable component spacing.
    • avoid margin-top as vertical margins collapse (only use margin-bottom for headings h1/.../h6, lists ul/ol/dl/dd, <pre></pre>)
    • block use rems for margin for easier scaling across device sizes
    • using inherit whenever possible for font- property
    • box-sizing: border-box is globally set on every element including *::before and *::after
    • body sets a global font-family, line-height and text-align
    • body sets background-color: #fff for safety
    • legend/fieldset have no borders/padding/margin
    • label are set to display: inline-block to allow margin
    • textarea are modified to only be resizable vertically resize: vertical as horizontal resizing often “breaks” page layout
    • summary are set to cursor: pointer

    Useful Custom Functions

    • @import '~bootstrap/scss/functions';
    • @import '~bootstrap/scss/mixins';
    @function color($key: 'blue') {\n  @return map-get($colors, $key);\n}\n\n@function theme-color($key: 'primary') {\n  @return map-get($theme-colors, $key);\n}\n\n@function gray($key: '100') {\n  @return map-get($grays, $key);\n}\n\n@function theme-color-level($color-name: 'primary', $level: 0) {\n  $color: theme-color($color-name);\n  $color-base: if($level > 0, #000, #fff);\n  $level: abs($level);\n\n  @return mix($color-base, $color, $level * $theme-color-interval);\n}\n\n/* color contrast: color-yiq(color) */\n.custom-element {\n  background-color: color-yiq(#000);\n  color: color-yiq(theme-color('dark'));\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25

    Custom Global Options

    $enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-prefers-reduced-motion-media-query: true !default;\n$enable-grid-classes: true !default;\n$enable-pointer-cursor-for-buttons: true !default;\n$enable-print-styles: true !default;\n$enable-responsive-font-sizes: false !default;\n$enable-validation-icons: true !default;\n$enable-deprecation-messages: true !default;\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    Custom Colors

    • @import '~bootstrap/scss/variables';
    $theme-colors: (\n  'primary': #0074d9,\n  'danger': #ff4136 'secondary': #495057,\n  'success': #37b24d,\n  'info': #1c7ed6,\n  'warning': #f59f00,\n  'danger': #f03e3e\n);\n\n$colors: (\n  'blue': $blue,\n  'indigo': $indigo,\n  'purple': $purple,\n  'pink': $pink,\n  'red': $red,\n  'orange': $orange,\n  'yellow': $yellow,\n  'green': $green,\n  'teal': $teal,\n  'cyan': $cyan,\n  'white': $white,\n  'gray': $gray-600,\n  'gray-dark': $gray-800\n) !default;\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24

    Custom Spacing

    key variable - $spacer:

    • t - for classes that set margin-top or padding-top
    • b - for classes that set margin-bottom or padding-bottom
    • l - for classes that set margin-left or padding-left
    • r - for classes that set margin-right or padding-right
    • x - for classes that set both xxx-left and xxx-right
    • y - for classes that set both xxx-top and xxx-bottom
    • blank - for classes that set a margin or padding on all 4 sides of the element
    • 0 - for classes that eliminate the margin or padding by setting it to 0
    • 1 - (by default) for classes that set the margin or padding to $spacer * .25
    • 2 - (by default) for classes that set the margin or padding to $spacer * .5
    • 3 - (by default) for classes that set the margin or padding to $spacer
    • 4 - (by default) for classes that set the margin or padding to $spacer * 1.5
    • 5 - (by default) for classes that set the margin or padding to $spacer * 3
    • auto - for classes that set the margin to auto
    .mt-0 {\n  margin-top: 0 !important;\n}\n\n.ml-1 {\n  margin-left: ($spacer * 0.25) !important;\n}\n\n.px-2 {\n  padding-right: ($spacer * 0.5) !important;\n  padding-left: ($spacer * 0.5) !important;\n}\n\n.p-3 {\n  padding: $spacer !important;\n}\n\n.mt-n1 {\n  margin-top: -0.25rem !important;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    Custom Layout

    $grid-columns: 12 !default;\n$grid-gutter-width: 30px !default;\n
    1
    2

    Custom Borders

    $border-width: 1px !default;\n$border-color: $gray-300 !default;\n$border-radius: 0.25rem !default;\n$border-radius-lg: 0.3rem !default;\n$border-radius-sm: 0.2rem !default;\n
    1
    2
    3
    4
    5

    Custom Navbar and Navigation

    /* $nav-link-padding-x: 1.5rem; */\n$navbar-nav-link-padding-x: 1.5rem;\n$nav-link-padding-y: 1rem;\n\n$navbar-light-color: $violet-4;\n$navbar-light-hover-color: $violet-6;\n$navbar-light-active-color: $violet-9;\n$navbar-light-toggler-border-color: $violet-2;\n\n$navbar-dark-color: $violet-3;\n$navbar-dark-hover-color: $violet-5;\n$navbar-dark-active-color: $violet-1;\n$navbar-dark-toggler-border-color: $violet-1;\n\n$nav-tabs-border-color: $primary;\n$nav-tabs-link-hover-border-color: $violet-5;\n$nav-tabs-link-active-color: $violet-9;\n$nav-tabs-link-active-bg: $violet-3;\n$nav-tabs-link-active-border-color: $violet-1;\n\n$nav-pills-link-active-color: $white;\n$nav-pills-link-active-bg: $primary;\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22

    Custom Dropdown

    custom $dropdown- variables

    $dropdown-padding-y: 1rem;\n$dropdown-spacer: 0.5rem;\n$dropdown-bg: $white;\n$dropdown-border-color: $primary;\n$dropdown-border-width: $border-width * 3;\n$dropdown-link-color: $primary;\n$dropdown-item-padding-y: 0.5rem;\n$dropdown-item-padding-x: 3rem;\n
    1
    2
    3
    4
    5
    6
    7
    8

    Custom List Group

    $list-group-border-color: $primary;\n
    1

    Custom Card

    $card-border-color: $primary;\n$card-color: $primary;\n$card-bg: $violet-0;\n
    1
    2
    3

    Custom Breadcrumb

    $breadcrumb-bg: $violet-0;\n$breadcrumb-divider-color: $gray-600 !default;\n$breadcrumb-active-color: $violet-3;\n$breadcrumb-divider: quote('>');\n
    1
    2
    3
    4

    Custom Form

    $input-btn-padding-y: 0.75rem;\n$input-btn-padding-x: 1.5rem;\n$input-btn-focus-width: 0; /* remove focus box-shadow */\n$custom-control-indicator-checked-color: $primary;\n
    1
    2
    3
    4

    Reference

    ',164);p.render=function(s,t,p,o,l,c){return n(),a("div",null,[e])};export default p;export{t as __pageData}; diff --git a/assets/web_css_bootstrapBasicNotes.md.222d8e91.lean.js b/assets/web_css_bootstrapBasicNotes.md.222d8e91.lean.js new file mode 100644 index 00000000000..a5929d4eda5 --- /dev/null +++ b/assets/web_css_bootstrapBasicNotes.md.222d8e91.lean.js @@ -0,0 +1 @@ +import{o as n,c as a,a as s}from"./app.6dd2a1b7.js";const t='{"title":"Bootstrap Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Bootstrap Basis","slug":"bootstrap-basis"},{"level":2,"title":"Grid System","slug":"grid-system"},{"level":3,"title":"Basic","slug":"basic"},{"level":3,"title":"row","slug":"row"},{"level":2,"title":"Nav","slug":"nav"},{"level":3,"title":"NavBar","slug":"navbar"},{"level":3,"title":"BreadCrumb","slug":"breadcrumb"},{"level":3,"title":"Scroll Spy","slug":"scroll-spy"},{"level":2,"title":"Tabs and Pills","slug":"tabs-and-pills"},{"level":3,"title":"Tab Pane","slug":"tab-pane"},{"level":3,"title":"Tab Pane JS API","slug":"tab-pane-js-api"},{"level":3,"title":"Tab Pane JS Events","slug":"tab-pane-js-events"},{"level":2,"title":"Collapse","slug":"collapse"},{"level":3,"title":"Accordion","slug":"accordion"},{"level":2,"title":"Text","slug":"text"},{"level":2,"title":"Form","slug":"form"},{"level":3,"title":"Form Basic","slug":"form-basic"},{"level":3,"title":"CheckBox and Select","slug":"checkbox-and-select"},{"level":3,"title":"Form Alerts and Prompts","slug":"form-alerts-and-prompts"},{"level":2,"title":"Table","slug":"table"},{"level":3,"title":"Table Basic Class","slug":"table-basic-class"},{"level":2,"title":"Card","slug":"card"},{"level":3,"title":"Panel","slug":"panel"},{"level":3,"title":"Well","slug":"well"},{"level":2,"title":"Images","slug":"images"},{"level":3,"title":"Img Class","slug":"img-class"},{"level":3,"title":"Thumbnail","slug":"thumbnail"},{"level":3,"title":"Media","slug":"media"},{"level":3,"title":"Embed","slug":"embed"},{"level":2,"title":"Alerts and Prompts","slug":"alerts-and-prompts"},{"level":3,"title":"Labels","slug":"labels"},{"level":3,"title":"Badges","slug":"badges"},{"level":3,"title":"Alerts","slug":"alerts"},{"level":3,"title":"Progress Bars","slug":"progress-bars"},{"level":3,"title":"Tooltip","slug":"tooltip"},{"level":3,"title":"Popover","slug":"popover"},{"level":3,"title":"Modal","slug":"modal"},{"level":2,"title":"Button","slug":"button"},{"level":2,"title":"Jumbotron","slug":"jumbotron"},{"level":2,"title":"Icon-Fonts","slug":"icon-fonts"},{"level":2,"title":"Carousel","slug":"carousel"},{"level":2,"title":"Common Class","slug":"common-class"},{"level":3,"title":"color","slug":"color"},{"level":3,"title":"size","slug":"size"},{"level":3,"title":"state","slug":"state"},{"level":3,"title":"Bootstrap Animation","slug":"bootstrap-animation"},{"level":2,"title":"Bootstrap 4","slug":"bootstrap-4"},{"level":3,"title":"Bootstrap Card","slug":"bootstrap-card"},{"level":2,"title":"Custom Bootstrap Theme","slug":"custom-bootstrap-theme"},{"level":3,"title":"Webpack Setup","slug":"webpack-setup"},{"level":3,"title":"Bootstrap Reboot Tips","slug":"bootstrap-reboot-tips"},{"level":3,"title":"Useful Custom Functions","slug":"useful-custom-functions"},{"level":3,"title":"Custom Global Options","slug":"custom-global-options"},{"level":3,"title":"Custom Colors","slug":"custom-colors"},{"level":3,"title":"Custom Spacing","slug":"custom-spacing"},{"level":3,"title":"Custom Layout","slug":"custom-layout"},{"level":3,"title":"Custom Borders","slug":"custom-borders"},{"level":3,"title":"Custom Navbar and Navigation","slug":"custom-navbar-and-navigation"},{"level":3,"title":"Custom Dropdown","slug":"custom-dropdown"},{"level":3,"title":"Custom List Group","slug":"custom-list-group"},{"level":3,"title":"Custom Card","slug":"custom-card"},{"level":3,"title":"Custom Breadcrumb","slug":"custom-breadcrumb"},{"level":3,"title":"Custom Form","slug":"custom-form"},{"level":2,"title":"Reference","slug":"reference"}],"relativePath":"web/css/bootstrapBasicNotes.md","lastUpdated":1628014655000}',p={},e=s('',164);p.render=function(s,t,p,o,l,c){return n(),a("div",null,[e])};export default p;export{t as __pageData}; diff --git a/assets/web_css_cssAdvancedNotes.md.fcd5d609.js b/assets/web_css_cssAdvancedNotes.md.fcd5d609.js new file mode 100644 index 00000000000..15a052272f1 --- /dev/null +++ b/assets/web_css_cssAdvancedNotes.md.fcd5d609.js @@ -0,0 +1 @@ +import{o as n,c as a,a as s}from"./app.6dd2a1b7.js";const e='{"title":"CSS Advanced Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"CSS Framework Key Points","slug":"css-framework-key-points"},{"level":2,"title":"Typography Principles","slug":"typography-principles"},{"level":3,"title":"font-size and spacing","slug":"font-size-and-spacing"},{"level":3,"title":"Table","slug":"table"},{"level":2,"title":"Grid System","slug":"grid-system"},{"level":2,"title":"Form Design Principles","slug":"form-design-principles"},{"level":3,"title":"Buttons Placement Principles","slug":"buttons-placement-principles"},{"level":2,"title":"Graceful Degradation","slug":"graceful-degradation"},{"level":2,"title":"CSS Houdini","slug":"css-houdini"},{"level":2,"title":"CSS Performance","slug":"css-performance"},{"level":3,"title":"Basic Perf Tips","slug":"basic-perf-tips"},{"level":3,"title":"CSS Selectors","slug":"css-selectors"},{"level":3,"title":"CSS Triggers","slug":"css-triggers"},{"level":3,"title":"will-change","slug":"will-change"},{"level":3,"title":"contain","slug":"contain"},{"level":3,"title":"Animation Frame","slug":"animation-frame"},{"level":3,"title":"CSS Loading Tips","slug":"css-loading-tips"},{"level":3,"title":"Animation","slug":"animation"},{"level":2,"title":"CSS Hacks","slug":"css-hacks"},{"level":2,"title":"Design Principles","slug":"design-principles"},{"level":3,"title":"费茨定律","slug":"费茨定律"},{"level":3,"title":"米勒定律","slug":"米勒定律"},{"level":3,"title":"席克定律","slug":"席克定律"},{"level":3,"title":"泰斯勒定律","slug":"泰斯勒定律"}],"relativePath":"web/css/cssAdvancedNotes.md","lastUpdated":1627196035000}',t={},l=s('

    CSS Advanced Notes

    CSS Framework Key Points

    • Content
    • Centering
    • Font Family
    • Spacing
    • Color and Contrast
    • Balance (Position)
    • Primary and Secondary Color
    • Custom Text (Font)
    • Images and Links

    Typography Principles

    • The typeface (font-family)
    • Type (modular) scale
    • Responsiveness of the text (size unit and breakpoints)
    • Spacing and vertical rhythm
    • Colors (theming)

    refer to: font-family, font-size, spacing, color

    font-size and spacing

    • set a base-size
    • multiples of base-size
    • use rem for most font-size, use em for some spacing (needing responsive design)
    $xs: $base / $ratio / $ratio;\n$sm: $base / $ratio;\n$md: $base;\n$lg: $base * $ratio;\n$xl: $base * $ratio * ratio;\n
    1
    2
    3
    4
    5

    font-size

    • rem is better
    • em for responsive layout (etc. layer2 font based-on layer1 font in dropdown menu)
    • make text legible: at least 16px

    spacing

    make text breathe:

    • margin/padding: at least 15px
    • line-height: 1.4
    • word-spacing
    • letter-spacing
    • 60-100 characters per line

    vertical rhythms

    keep vertical spaces between elements on a page consistent (and relative) to each other:

    • Set the vertical white space between elements to a multiple of base-size
    • Set the line-height of all text elements to a multiple of base-size

    Table

    • remove fills, grid lines, border and bolding
    • left-align text, right-align numbers and align headings with data
    • put white space to work to group and separate

    Grid System

    • Must have different traits at different sizes
    • Must be fluid between breakpoints
    • Must have enough control to decide which columns will transform and at which point
    • Classes should ideally still make sense at all breakpoints

    Form Design Principles

    Buttons Placement Principles

    • Align the primary button to the left edge of the inputs
    • Put the back button above the form
    • Put tangentially related actions above the form
    • Place extra buttons based on what they do
    • In some single field forms put the button next to the input (e.g search button)
    • Put buttons on multi select forms above the form

    https://adamsilver.io/articles/where-to-put-buttons-in-forms

    Graceful Degradation

    write old browser css code, then write modern browser css code

    .grid {\n  display: flex;\n}\n\n/* old browser don't support this rule */\n/* old browser will ignore this rule */\n.grid {\n  display: grid;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9

    CSS Houdini

    CSS Houdini bring many API:

    • css properties and values api: custom properties (--var, var(--var)), custom function (--darken(--var))
    • css layout api (layoutWorklet): layout below (display: flex/grid), layout above (css-sizing: min-content/max-content/fit-content)
    • css paint api (paintWorklet): background, background-color, background-image
    • css composite api (compositeWorklet)

    to let developers enhance css without any browser updates

    CSS Performance

    Basic Perf Tips

    • use audits panel to diagnose
    • use CSS shorthand and color shortcuts
    • eliminate unneeded zeros and units
    • remove unused CSS by coverage panel of Devtools
    • link is parallel, @import isn't parallel

    CSS Selectors

    减少选择器的复杂性,与构造样式本身的其他工作相比, 选择器复杂性可以占用计算元素样式所需时间的 50%以上

    CSS Triggers

    avoid to frequently change css property or call JS DOM API triggering layout stage (reflow)

    will-change

    告知浏览器该元素会有哪些变化的方法,这样浏览器可以在元素属性真正发生变化之前提前做好对应的优化准备工作

     {\n  will-change: auto;\n  will-change: scroll-position;\n  will-change: contents;\n  will-change: transform; /* Example of <custom-ident> */\n  will-change: opacity; /* Example of <custom-ident> */\n  will-change: left, top; /* Example of two <animate-feature> */\n\n  will-change: unset;\n  will-change: initial;\n  will-change: inherit;\n}\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    contain

    CSS Containment

    contain 属性允许开发者声明当前元素和它的内容尽可能的独立于 DOM 树的其他部分。 这使得浏览器在重新计算布局、样式、绘图或它们的组合的时候,只会影响到有限的 DOM 区域,而不是整个页面

    /* 无布局包含*/\ncontain: none;\n\n/* 布局包含 layout、style、paint 和 size*/\ncontain: strict;\n\n/* 布局包含layout、style 和 paint */\ncontain: content;\n\n/* 布局包含 size */\ncontain: size;\n\n/* 布局包含 layout */\ncontain: layout;\n\n/* 布局包含 style */\ncontain: style;\n\n/* 布局包含 paint */\ncontain: paint;\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    • size: 声明这个元素的尺寸会变化,不需要去检查它依赖关系中的尺寸变化
    • style: 声明那些同时会影响这个元素和其子孙元素的属性,都在这个元素的包含范围内
    • layout: 声明没有外部元素可以影响它内部的布局,反之亦然
    • paint: 声明这个元素的子孙节点不会在它边缘外显示。如果一个元素在视窗外或因其他原因导致不可见,则同样保证它的子孙节点不会被显示

    Animation Frame

    window.requestAnimationFrame:

    • reflow: javascript -> style -> layout -> paint -> composite
    • repaint: paint -> composite

    告诉浏览器希望执行动画并请求浏览器在下一次重绘之前调用指定的函数来更新动画。该方法使用一个回调函数作为参数,这个回调函数会在浏览器重绘之前调用

    若想要在下次重绘时产生另一个动画画面,callback 必须调用 requestAnimationFrame

    const start = null;\nconst element = document.getElementById('SomeElementYouWantToAnimate');\nelement.style.position = 'absolute';\n\nfunction step(timestamp) {\n  if (!start) {\n    start = timestamp;\n  }\n\n  const progress = timestamp - start;\n  element.style.left = Math.min(progress / 10, 200) + 'px';\n\n  if (progress < 2000) {\n    window.requestAnimationFrame(step);\n  }\n}\n\nwindow.requestAnimationFrame(step);\n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    CSS Loading Tips

    • Lazyload any CSS not needed for Start Render:
      • This could be Critical CSS;
      • or splitting your CSS into Media Queries.
    • Avoid @import:
      • In your HTML;
      • but in CSS especially;
      • and beware of oddities with the PreLoad Scanner.
    • Be wary of synchronous CSS and JavaScript order:
      • JavaScript defined after CSS won’t run until CSSOM is completed;
      • so if your JavaScript doesn’t depend on your CSS;
        • load it before your CSS;
      • but if it does depend on your CSS:
        • load it after your CSS.
    • Load CSS as the DOM needs it:
      • This unblocks Start Render and allows progressive rendering.
    <link rel="preload" href="/path/to/split.css" as="style" />\n<link\n  rel="stylesheet"\n  href="/path/to/split.css"\n  media="print"\n  onload="this.media='all'"\n/>\n
    1
    2
    3
    4
    5
    6
    7

    Animation

    Best Practice

    • High Performance Tips
    • all animation: keyframe animation or transitions is best
    • js-based animation: requestAnimationFrame is better than setTimeout/setInterval
    • position animation:transform: translate(npx, npx) is better than top/right/bottom/left
    • scale animation: transform: scale(n) better than width/height
    • rotation animation: transform: rotate(deg) is better
    • opacity/visibility animation: opacity: 0...1 is better

    DevTools for Animation

    • DevTools for Animation Performance
    • slower CPU simulation in performance panel
    • enable paint instrumentation in performance panel
    • FPS meter in rendering panel
    • paint flashing in rendering panel
    • layers panel

    Animation Internal

    • width/height/margin/left/top in Layout stage
    • box-shadow/border-radius/background/outline/color in Paint stage
    • cursor/z-index/transform/opacity in Composite Layers stage
    • top/left has very large time to paint each frame

    CSS Hacks

    Design Principles

    费茨定律

    人机交互和人体工程学中人类活动的模型, 它预测了从任意位置快速移动到一个目标位置所需的时间, 由 2 个位置的距离(D)和目标大小(S)有关, 正比于 D, 反比于 S:

    • 关联性强的 UI 放置在一起
    • 大拇指点击热区
    • 屏幕边界视为无限大 (容易到达)
    • 关机滑动距离长

    米勒定律

    人的短时记忆能力广度为 7±2 个信息块:

    • 手机号/银行卡号/超大数字分段放置, 信息分层 e.g 134 9999 9999, 999, 999, 999
    • 文章布局时增大段落间 margin, 改变部分文字的粗细/字体/颜色
    • 导航/选项卡不超过 9 个 (超过 9 个可使用 dropdown/subMenu)

    席克定律

    用户所面临的选择数量越多, 做出选择所花费的时间就越长, 在人机交互的界面中选项越多, 意味着用户做出决策的时间越长:

    • 减少选项并提供默认值
    • 分类分层
    • 分步分页 (大部分手机应用注册界面)

    泰斯勒定律

    泰斯勒定律又称复杂性守恒定律, 该定律认为每一个过程都有其固有的复杂性, 这个复杂性存在一个临界点, 超过了这个点就不能再简化了, 你只能将固有的复杂性从一个地方移动到另外一个地方:

    • 智能手机: 按键的复杂度转为手机操作系统的复杂度
    • 智能推荐: 用户自己选择筛选条件的复杂度转为人工智能算法的复杂度
    ',82);t.render=function(s,e,t,i,o,p){return n(),a("div",null,[l])};export default t;export{e as __pageData}; diff --git a/assets/web_css_cssAdvancedNotes.md.fcd5d609.lean.js b/assets/web_css_cssAdvancedNotes.md.fcd5d609.lean.js new file mode 100644 index 00000000000..51cee9ae72c --- /dev/null +++ b/assets/web_css_cssAdvancedNotes.md.fcd5d609.lean.js @@ -0,0 +1 @@ +import{o as n,c as a,a as s}from"./app.6dd2a1b7.js";const e='{"title":"CSS Advanced Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"CSS Framework Key Points","slug":"css-framework-key-points"},{"level":2,"title":"Typography Principles","slug":"typography-principles"},{"level":3,"title":"font-size and spacing","slug":"font-size-and-spacing"},{"level":3,"title":"Table","slug":"table"},{"level":2,"title":"Grid System","slug":"grid-system"},{"level":2,"title":"Form Design Principles","slug":"form-design-principles"},{"level":3,"title":"Buttons Placement Principles","slug":"buttons-placement-principles"},{"level":2,"title":"Graceful Degradation","slug":"graceful-degradation"},{"level":2,"title":"CSS Houdini","slug":"css-houdini"},{"level":2,"title":"CSS Performance","slug":"css-performance"},{"level":3,"title":"Basic Perf Tips","slug":"basic-perf-tips"},{"level":3,"title":"CSS Selectors","slug":"css-selectors"},{"level":3,"title":"CSS Triggers","slug":"css-triggers"},{"level":3,"title":"will-change","slug":"will-change"},{"level":3,"title":"contain","slug":"contain"},{"level":3,"title":"Animation Frame","slug":"animation-frame"},{"level":3,"title":"CSS Loading Tips","slug":"css-loading-tips"},{"level":3,"title":"Animation","slug":"animation"},{"level":2,"title":"CSS Hacks","slug":"css-hacks"},{"level":2,"title":"Design Principles","slug":"design-principles"},{"level":3,"title":"费茨定律","slug":"费茨定律"},{"level":3,"title":"米勒定律","slug":"米勒定律"},{"level":3,"title":"席克定律","slug":"席克定律"},{"level":3,"title":"泰斯勒定律","slug":"泰斯勒定律"}],"relativePath":"web/css/cssAdvancedNotes.md","lastUpdated":1627196035000}',t={},l=s('',82);t.render=function(s,e,t,i,o,p){return n(),a("div",null,[l])};export default t;export{e as __pageData}; diff --git a/assets/web_css_cssBasicNotes.md.8e99d3ef.js b/assets/web_css_cssBasicNotes.md.8e99d3ef.js new file mode 100644 index 00000000000..17e52838d74 --- /dev/null +++ b/assets/web_css_cssBasicNotes.md.8e99d3ef.js @@ -0,0 +1 @@ +import{o as n,c as s,e as a,b as t,d as e}from"./app.6dd2a1b7.js";const l='{"title":"CSS Basic Notes","description":"","frontmatter":{},"headers":[{"level":2,"title":"Cascading and Inheritance","slug":"cascading-and-inheritance"},{"level":3,"title":"Cascading Order","slug":"cascading-order"},{"level":3,"title":"Specificity","slug":"specificity"},{"level":3,"title":"CSS Inheritance","slug":"css-inheritance"},{"level":2,"title":"Property Value","slug":"property-value"},{"level":3,"title":"Initial Value","slug":"initial-value"},{"level":3,"title":"Specified Value","slug":"specified-value"},{"level":3,"title":"Computed Value","slug":"computed-value"},{"level":3,"title":"Used Value","slug":"used-value"},{"level":3,"title":"Actual Value","slug":"actual-value"},{"level":2,"title":"Property Order","slug":"property-order"},{"level":3,"title":"Property Order Summary","slug":"property-order-summary"},{"level":3,"title":"Property Order Details","slug":"property-order-details"},{"level":2,"title":"Naming Convention","slug":"naming-convention"},{"level":3,"title":"Layout Structure Naming Convention","slug":"layout-structure-naming-convention"},{"level":3,"title":"Navigation Naming Convention","slug":"navigation-naming-convention"},{"level":3,"title":"Functional Component Naming Convention","slug":"functional-component-naming-convention"},{"level":3,"title":"CSS Files Naming Convention","slug":"css-files-naming-convention"},{"level":2,"title":"CSS Selector","slug":"css-selector"},{"level":3,"title":"元素选择器","slug":"元素选择器"},{"level":3,"title":"关系选择器","slug":"关系选择器"},{"level":3,"title":"Attribute Selectors","slug":"attribute-selectors"},{"level":3,"title":"Pseudo Class Selectors","slug":"pseudo-class-selectors"},{"level":3,"title":"Pseudo Element Selectors","slug":"pseudo-element-selectors"},{"level":2,"title":"CSS Normalize","slug":"css-normalize"},{"level":2,"title":"CSS Box","slug":"css-box"},{"level":3,"title":"Width","slug":"width"},{"level":3,"title":"Z Index","slug":"z-index"},{"level":3,"title":"Overflow","slug":"overflow"},{"level":3,"title":"Resize Box","slug":"resize-box"},{"level":3,"title":"Box Sizing","slug":"box-sizing"},{"level":3,"title":"Box Height","slug":"box-height"},{"level":3,"title":"Box Column","slug":"box-column"},{"level":2,"title":"Box Model","slug":"box-model"},{"level":3,"title":"Box Margin","slug":"box-margin"},{"level":3,"title":"Box Percentage Length","slug":"box-percentage-length"},{"level":2,"title":"Block Formatting Context","slug":"block-formatting-context"},{"level":2,"title":"Stack Context","slug":"stack-context"},{"level":3,"title":"Create BFC","slug":"create-bfc"},{"level":3,"title":"Margin Collapsing","slug":"margin-collapsing"},{"level":2,"title":"Float Patterns","slug":"float-patterns"},{"level":3,"title":"Fixed Parent","slug":"fixed-parent"},{"level":3,"title":"Float ClearFix","slug":"float-clearfix"},{"level":3,"title":"Float Best Practice","slug":"float-best-practice"},{"level":2,"title":"Position Patterns","slug":"position-patterns"},{"level":3,"title":"Static Position","slug":"static-position"},{"level":3,"title":"Relative Position","slug":"relative-position"},{"level":3,"title":"Absolute Position","slug":"absolute-position"},{"level":3,"title":"Fixed Position","slug":"fixed-position"},{"level":3,"title":"Sticky Position","slug":"sticky-position"},{"level":2,"title":"Flex Patterns","slug":"flex-patterns"},{"level":3,"title":"Flex Under the Hood","slug":"flex-under-the-hood"},{"level":3,"title":"Flex Useful Shorthand","slug":"flex-useful-shorthand"},{"level":3,"title":"Flex Parent Property","slug":"flex-parent-property"},{"level":3,"title":"Flex Children Property","slug":"flex-children-property"},{"level":3,"title":"Flexibility of Float","slug":"flexibility-of-float"},{"level":3,"title":"Pseudo Elements of Flex Box","slug":"pseudo-elements-of-flex-box"},{"level":3,"title":"Fixed Sidebar with Flexbox","slug":"fixed-sidebar-with-flexbox"},{"level":3,"title":"Flexbox Best Practice","slug":"flexbox-best-practice"},{"level":2,"title":"Grid Patterns","slug":"grid-patterns"},{"level":3,"title":"Grid Attention Tips","slug":"grid-attention-tips"},{"level":3,"title":"Grid Alignment","slug":"grid-alignment"},{"level":2,"title":"Column Patterns","slug":"column-patterns"},{"level":3,"title":"Two Column Pattern","slug":"two-column-pattern"},{"level":3,"title":"Three Column Pattern","slug":"three-column-pattern"},{"level":2,"title":"Centering Patterns","slug":"centering-patterns"},{"level":3,"title":"Horizontal Centering Pattern","slug":"horizontal-centering-pattern"},{"level":3,"title":"Vertical Centering Pattern","slug":"vertical-centering-pattern"},{"level":3,"title":"Mixing Centering Pattern","slug":"mixing-centering-pattern"},{"level":2,"title":"CSS Logical Properties and Values","slug":"css-logical-properties-and-values"},{"level":3,"title":"CSS Logical Basis","slug":"css-logical-basis"},{"level":3,"title":"CSS Logical Reference","slug":"css-logical-reference"},{"level":2,"title":"CSS ScrollBar","slug":"css-scrollbar"},{"level":3,"title":"Custom ScrollBar","slug":"custom-scrollbar"},{"level":3,"title":"Hidden ScrollBar","slug":"hidden-scrollbar"},{"level":2,"title":"CSS Opacity","slug":"css-opacity"},{"level":2,"title":"CSS Colors","slug":"css-colors"},{"level":3,"title":"HSL Color","slug":"hsl-color"},{"level":2,"title":"CSS Border","slug":"css-border"},{"level":3,"title":"Border Radius","slug":"border-radius"},{"level":3,"title":"Border Image","slug":"border-image"},{"level":3,"title":"Border Collapse","slug":"border-collapse"},{"level":3,"title":"Border Best Practice","slug":"border-best-practice"},{"level":2,"title":"CSS Background","slug":"css-background"},{"level":3,"title":"Background Image","slug":"background-image"},{"level":3,"title":"Background Size","slug":"background-size"},{"level":3,"title":"Background Repeat","slug":"background-repeat"},{"level":3,"title":"Background Attachment","slug":"background-attachment"},{"level":3,"title":"Background Clip","slug":"background-clip"},{"level":3,"title":"Background Origin","slug":"background-origin"},{"level":3,"title":"Blend Mode","slug":"blend-mode"},{"level":3,"title":"Mask Style","slug":"mask-style"},{"level":3,"title":"Clip Path","slug":"clip-path"},{"level":3,"title":"Background Best Practice","slug":"background-best-practice"},{"level":2,"title":"CSS Text","slug":"css-text"},{"level":3,"title":"Text Alignment","slug":"text-alignment"},{"level":3,"title":"Text Overflow","slug":"text-overflow"},{"level":3,"title":"Text Wrap","slug":"text-wrap"},{"level":3,"title":"Text Transform","slug":"text-transform"},{"level":3,"title":"Text Writing Mode","slug":"text-writing-mode"},{"level":3,"title":"White Space","slug":"white-space"},{"level":2,"title":"CSS Font","slug":"css-font"},{"level":3,"title":"Font Size","slug":"font-size"},{"level":3,"title":"Font Style","slug":"font-style"},{"level":3,"title":"Font Variant","slug":"font-variant"},{"level":3,"title":"Font Size Adjust","slug":"font-size-adjust"},{"level":3,"title":"Font Display","slug":"font-display"},{"level":3,"title":"Custom Fonts Function","slug":"custom-fonts-function"},{"level":3,"title":"Font Best Practice","slug":"font-best-practice"},{"level":2,"title":"CSS Counter","slug":"css-counter"},{"level":2,"title":"CSS Filter","slug":"css-filter"},{"level":3,"title":"SVG Filter","slug":"svg-filter"},{"level":3,"title":"Backdrop Filter","slug":"backdrop-filter"},{"level":2,"title":"CSS Interactive","slug":"css-interactive"},{"level":3,"title":"Cursor and Pointer","slug":"cursor-and-pointer"},{"level":3,"title":"User Select","slug":"user-select"},{"level":3,"title":"CSS Form","slug":"css-form"},{"level":2,"title":"Object Position and Fit","slug":"object-position-and-fit"},{"level":2,"title":"Animation","slug":"animation"},{"level":3,"title":"Animation Property","slug":"animation-property"},{"level":3,"title":"Animation Helper","slug":"animation-helper"},{"level":3,"title":"Transition","slug":"transition"},{"level":3,"title":"Transform","slug":"transform"},{"level":3,"title":"Animation Details","slug":"animation-details"},{"level":3,"title":"Animation Best Practice","slug":"animation-best-practice"},{"level":3,"title":"GreenSock Library","slug":"greensock-library"},{"level":2,"title":"Responsive Design","slug":"responsive-design"},{"level":3,"title":"Responsive Font","slug":"responsive-font"},{"level":3,"title":"Responsive Length","slug":"responsive-length"},{"level":3,"title":"Responsive Size","slug":"responsive-size"},{"level":3,"title":"Responsive Box","slug":"responsive-box"},{"level":3,"title":"Responsive Image","slug":"responsive-image"},{"level":2,"title":"Media Query","slug":"media-query"},{"level":3,"title":"设备类型","slug":"设备类型"},{"level":3,"title":"设备特性","slug":"设备特性"},{"level":3,"title":"Media Query Support Detection","slug":"media-query-support-detection"},{"level":3,"title":"JavaScript Media Query API","slug":"javascript-media-query-api"},{"level":2,"title":"Accessibility","slug":"accessibility"},{"level":3,"title":"Screen Reader Only","slug":"screen-reader-only"},{"level":2,"title":"Awesome Components","slug":"awesome-components"},{"level":3,"title":"Landing Page","slug":"landing-page"},{"level":3,"title":"Modal","slug":"modal"},{"level":3,"title":"Flexible Heading","slug":"flexible-heading"},{"level":3,"title":"Table","slug":"table"},{"level":3,"title":"Form","slug":"form"},{"level":3,"title":"Navigation","slug":"navigation"},{"level":3,"title":"Button","slug":"button"},{"level":3,"title":"Footer","slug":"footer"},{"level":3,"title":"Picture","slug":"picture"},{"level":3,"title":"Animation Tips","slug":"animation-tips"},{"level":3,"title":"Resizable Component","slug":"resizable-component"},{"level":3,"title":"Slides","slug":"slides"},{"level":3,"title":"Layout","slug":"layout"},{"level":3,"title":"Geometry","slug":"geometry"},{"level":2,"title":"CSS Variables","slug":"css-variables"},{"level":3,"title":"Variables DOM API","slug":"variables-dom-api"},{"level":3,"title":"Scope Variables","slug":"scope-variables"},{"level":3,"title":"Invalid and Empty Value in CSS Variables","slug":"invalid-and-empty-value-in-css-variables"},{"level":2,"title":"SVG","slug":"svg"},{"level":3,"title":"Inline SVG","slug":"inline-svg"},{"level":3,"title":"SVG Basic Shape Tags","slug":"svg-basic-shape-tags"},{"level":3,"title":"SVG Text Tag","slug":"svg-text-tag"},{"level":3,"title":"SVG Accessibility Tags","slug":"svg-accessibility-tags"},{"level":3,"title":"SVG Group Tag","slug":"svg-group-tag"},{"level":3,"title":"SVG Defs Tag","slug":"svg-defs-tag"},{"level":3,"title":"SVG Mask","slug":"svg-mask"},{"level":2,"title":"StyleLint Tool","slug":"stylelint-tool"},{"level":2,"title":"Tailwind","slug":"tailwind"},{"level":3,"title":"Tailwind Directives","slug":"tailwind-directives"}],"relativePath":"web/css/cssBasicNotes.md","lastUpdated":1627725673000}',o={},c=t("h1",{id:"css-basic-notes"},[t("a",{class:"header-anchor",href:"#css-basic-notes","aria-hidden":"true"},"#"),e(" CSS Basic Notes")],-1),p=t("p",null,[t("div",{class:"table-of-contents"},[t("ul",null,[t("li",null,[t("a",{href:"#css-basic-notes"},"CSS Basic Notes"),t("ul",null,[t("li",null,[t("a",{href:"#cascading-and-inheritance"},"Cascading and Inheritance")]),t("li",null,[t("a",{href:"#property-value"},"Property Value")]),t("li",null,[t("a",{href:"#property-order"},"Property Order")]),t("li",null,[t("a",{href:"#naming-convention"},"Naming Convention")]),t("li",null,[t("a",{href:"#css-selector"},"CSS Selector")]),t("li",null,[t("a",{href:"#css-normalize"},"CSS Normalize")]),t("li",null,[t("a",{href:"#css-box"},"CSS Box")]),t("li",null,[t("a",{href:"#box-model"},"Box Model")]),t("li",null,[t("a",{href:"#block-formatting-context"},"Block Formatting Context")]),t("li",null,[t("a",{href:"#stack-context"},"Stack Context")]),t("li",null,[t("a",{href:"#float-patterns"},"Float Patterns")]),t("li",null,[t("a",{href:"#position-patterns"},"Position Patterns")]),t("li",null,[t("a",{href:"#flex-patterns"},"Flex Patterns")]),t("li",null,[t("a",{href:"#grid-patterns"},"Grid Patterns")]),t("li",null,[t("a",{href:"#column-patterns"},"Column Patterns")]),t("li",null,[t("a",{href:"#centering-patterns"},"Centering Patterns")]),t("li",null,[t("a",{href:"#css-logical-properties-and-values"},"CSS Logical Properties and Values")]),t("li",null,[t("a",{href:"#css-scrollbar"},"CSS ScrollBar")]),t("li",null,[t("a",{href:"#css-opacity"},"CSS Opacity")]),t("li",null,[t("a",{href:"#css-colors"},"CSS Colors")]),t("li",null,[t("a",{href:"#css-border"},"CSS Border")]),t("li",null,[t("a",{href:"#css-background"},"CSS Background")]),t("li",null,[t("a",{href:"#css-text"},"CSS Text")]),t("li",null,[t("a",{href:"#css-font"},"CSS Font")]),t("li",null,[t("a",{href:"#css-counter"},"CSS Counter")]),t("li",null,[t("a",{href:"#css-filter"},"CSS Filter")]),t("li",null,[t("a",{href:"#css-interactive"},"CSS Interactive")]),t("li",null,[t("a",{href:"#object-position-and-fit"},"Object Position and Fit")]),t("li",null,[t("a",{href:"#animation"},"Animation")]),t("li",null,[t("a",{href:"#responsive-design"},"Responsive Design")]),t("li",null,[t("a",{href:"#media-query"},"Media Query")]),t("li",null,[t("a",{href:"#accessibility"},"Accessibility")]),t("li",null,[t("a",{href:"#awesome-components"},"Awesome Components")]),t("li",null,[t("a",{href:"#css-variables"},"CSS Variables")]),t("li",null,[t("a",{href:"#svg"},"SVG")]),t("li",null,[t("a",{href:"#stylelint-tool"},"StyleLint Tool")]),t("li",null,[t("a",{href:"#tailwind"},"Tailwind")])])])])])],-1),u=t("h2",{id:"cascading-and-inheritance"},[t("a",{class:"header-anchor",href:"#cascading-and-inheritance","aria-hidden":"true"},"#"),e(" Cascading and Inheritance")],-1),r=t("h3",{id:"cascading-order"},[t("a",{class:"header-anchor",href:"#cascading-order","aria-hidden":"true"},"#"),e(" Cascading Order")],-1),i=t("ol",null,[t("li",null,"user agent normal"),t("li",null,"user normal"),t("li",null,"author normal"),t("li",null,"CSS Animations"),t("li",null,"author !important"),t("li",null,"user !important"),t("li",null,"user agent !important")],-1),k=t("h3",{id:"specificity"},[t("a",{class:"header-anchor",href:"#specificity","aria-hidden":"true"},"#"),e(" Specificity")],-1),b=t("p",null,[e("Specificity (Selector Priority) has 4 bits - thousands, hundreds, tens, ones "),t("code",null,"0000"),e(":")],-1),m=t("ul",null,[t("li",null,"thousands: inline-style"),t("li",null,"hundreds: ID selector"),t("li",null,"tens: class selector, attribute selector, pseudo-class(😃"),t("li",null,"ones: element selector, pseudo-element(:😃")],-1),d=t("blockquote",null,[t("p",null,"Universal selector (*), combinators (+, >, ~, ' ') negation pseudo-class (:not) have no effect on specificity, but selectors in it have effect on specificity")],-1),g=t("div",{class:"language-scss line-numbers-mode"},[t("pre",null,[t("code",null,[t("span",{class:"token selector"},"h1 "),t("span",{class:"token punctuation"},"{"),e("\n "),t("span",{class:"token property"},"specificity"),t("span",{class:"token punctuation"},":"),e(" 0001"),t("span",{class:"token punctuation"},";"),e("\n"),t("span",{class:"token punctuation"},"}"),e("\n\n"),t("span",{class:"token selector"},"#id "),t("span",{class:"token punctuation"},"{"),e("\n "),t("span",{class:"token property"},"specificity"),t("span",{class:"token punctuation"},":"),e(" 0100"),t("span",{class:"token punctuation"},";"),e("\n"),t("span",{class:"token punctuation"},"}"),e("\n\n"),t("span",{class:"token selector"},"h1 + p::first-letter "),t("span",{class:"token punctuation"},"{"),e("\n "),t("span",{class:"token property"},"specificity"),t("span",{class:"token punctuation"},":"),e(" 0003"),t("span",{class:"token punctuation"},";"),e("\n"),t("span",{class:"token punctuation"},"}"),e("\n\n"),t("span",{class:"token selector"},"li > a[href*='en-US'] > .inline-warning "),t("span",{class:"token punctuation"},"{"),e("\n "),t("span",{class:"token property"},"specificity"),t("span",{class:"token punctuation"},":"),e(" 0022"),t("span",{class:"token punctuation"},";"),e("\n"),t("span",{class:"token punctuation"},"}"),e("\n\n"),t("span",{class:"token comment"},'/*

    Hello

    */'),e("\n"),t("span",{class:"token selector"},"inline-style "),t("span",{class:"token punctuation"},"{"),e("\n "),t("span",{class:"token property"},"specificity"),t("span",{class:"token punctuation"},":"),e(" 1000"),t("span",{class:"token punctuation"},";"),e("\n"),t("span",{class:"token punctuation"},"}"),e("\n")])]),t("div",{class:"line-numbers-wrapper"},[t("span",{class:"line-number"},"1"),t("br"),t("span",{class:"line-number"},"2"),t("br"),t("span",{class:"line-number"},"3"),t("br"),t("span",{class:"line-number"},"4"),t("br"),t("span",{class:"line-number"},"5"),t("br"),t("span",{class:"line-number"},"6"),t("br"),t("span",{class:"line-number"},"7"),t("br"),t("span",{class:"line-number"},"8"),t("br"),t("span",{class:"line-number"},"9"),t("br"),t("span",{class:"line-number"},"10"),t("br"),t("span",{class:"line-number"},"11"),t("br"),t("span",{class:"line-number"},"12"),t("br"),t("span",{class:"line-number"},"13"),t("br"),t("span",{class:"line-number"},"14"),t("br"),t("span",{class:"line-number"},"15"),t("br"),t("span",{class:"line-number"},"16"),t("br"),t("span",{class:"line-number"},"17"),t("br"),t("span",{class:"line-number"},"18"),t("br"),t("span",{class:"line-number"},"19"),t("br"),t("span",{class:"line-number"},"20"),t("br")])],-1),h=t("div",{class:"language-css line-numbers-mode"},[t("pre",null,[t("code",null,[t("span",{class:"token comment"},"/* specificity: 0101 */"),e("\n"),t("span",{class:"token selector"},"#outer a"),e(),t("span",{class:"token punctuation"},"{"),e("\n "),t("span",{class:"token property"},"background-color"),t("span",{class:"token punctuation"},":"),e(" red"),t("span",{class:"token punctuation"},";"),e("\n"),t("span",{class:"token punctuation"},"}"),e("\n\n"),t("span",{class:"token comment"},"/* specificity: 0201 */"),e("\n"),t("span",{class:"token comment"},"/* win */"),e("\n"),t("span",{class:"token selector"},"#outer #inner a"),e(),t("span",{class:"token punctuation"},"{"),e("\n "),t("span",{class:"token property"},"background-color"),t("span",{class:"token punctuation"},":"),e(" blue"),t("span",{class:"token punctuation"},";"),e("\n"),t("span",{class:"token punctuation"},"}"),e("\n\n"),t("span",{class:"token comment"},"/* specificity: 0104 */"),e("\n"),t("span",{class:"token selector"},"#outer div ul li a"),e(),t("span",{class:"token punctuation"},"{"),e("\n "),t("span",{class:"token property"},"color"),t("span",{class:"token punctuation"},":"),e(" yellow"),t("span",{class:"token punctuation"},";"),e("\n"),t("span",{class:"token punctuation"},"}"),e("\n\n"),t("span",{class:"token comment"},"/* specificity: 0113 */"),e("\n"),t("span",{class:"token comment"},"/* win */"),e("\n"),t("span",{class:"token selector"},"#outer div ul .nav a"),e(),t("span",{class:"token punctuation"},"{"),e("\n "),t("span",{class:"token property"},"color"),t("span",{class:"token punctuation"},":"),e(" white"),t("span",{class:"token punctuation"},";"),e("\n"),t("span",{class:"token punctuation"},"}"),e("\n\n"),t("span",{class:"token comment"},"/* specificity: 0024 */"),e("\n"),t("span",{class:"token selector"},"div div li:nth-child(2) a:hover"),e(),t("span",{class:"token punctuation"},"{"),e("\n "),t("span",{class:"token property"},"border"),t("span",{class:"token punctuation"},":"),e(" 10px solid black"),t("span",{class:"token punctuation"},";"),e("\n"),t("span",{class:"token punctuation"},"}"),e("\n\n"),t("span",{class:"token comment"},"/* specificity: 0023 */"),e("\n"),t("span",{class:"token selector"},"div li:nth-child(2) a:hover"),e(),t("span",{class:"token punctuation"},"{"),e("\n "),t("span",{class:"token property"},"border"),t("span",{class:"token punctuation"},":"),e(" 10px dashed black"),t("span",{class:"token punctuation"},";"),e("\n"),t("span",{class:"token punctuation"},"}"),e("\n\n"),t("span",{class:"token comment"},"/* specificity: 0033 */"),e("\n"),t("span",{class:"token comment"},"/* win */"),e("\n"),t("span",{class:"token selector"},"div div .nav:nth-child(2) a:hover"),e(),t("span",{class:"token punctuation"},"{"),e("\n "),t("span",{class:"token property"},"border"),t("span",{class:"token punctuation"},":"),e(" 10px double black"),t("span",{class:"token punctuation"},";"),e("\n"),t("span",{class:"token punctuation"},"}"),e("\n")])]),t("div",{class:"line-numbers-wrapper"},[t("span",{class:"line-number"},"1"),t("br"),t("span",{class:"line-number"},"2"),t("br"),t("span",{class:"line-number"},"3"),t("br"),t("span",{class:"line-number"},"4"),t("br"),t("span",{class:"line-number"},"5"),t("br"),t("span",{class:"line-number"},"6"),t("br"),t("span",{class:"line-number"},"7"),t("br"),t("span",{class:"line-number"},"8"),t("br"),t("span",{class:"line-number"},"9"),t("br"),t("span",{class:"line-number"},"10"),t("br"),t("span",{class:"line-number"},"11"),t("br"),t("span",{class:"line-number"},"12"),t("br"),t("span",{class:"line-number"},"13"),t("br"),t("span",{class:"line-number"},"14"),t("br"),t("span",{class:"line-number"},"15"),t("br"),t("span",{class:"line-number"},"16"),t("br"),t("span",{class:"line-number"},"17"),t("br"),t("span",{class:"line-number"},"18"),t("br"),t("span",{class:"line-number"},"19"),t("br"),t("span",{class:"line-number"},"20"),t("br"),t("span",{class:"line-number"},"21"),t("br"),t("span",{class:"line-number"},"22"),t("br"),t("span",{class:"line-number"},"23"),t("br"),t("span",{class:"line-number"},"24"),t("br"),t("span",{class:"line-number"},"25"),t("br"),t("span",{class:"line-number"},"26"),t("br"),t("span",{class:"line-number"},"27"),t("br"),t("span",{class:"line-number"},"28"),t("br"),t("span",{class:"line-number"},"29"),t("br"),t("span",{class:"line-number"},"30"),t("br"),t("span",{class:"line-number"},"31"),t("br"),t("span",{class:"line-number"},"32"),t("br"),t("span",{class:"line-number"},"33"),t("br"),t("span",{class:"line-number"},"34"),t("br"),t("span",{class:"line-number"},"35"),t("br"),t("span",{class:"line-number"},"36"),t("br"),t("span",{class:"line-number"},"37"),t("br")])],-1),f=t("p",null,"Styles for a directly targeted element will always take precedence over inherited styles, regardless of the specificity of the inherited rule",-1),y=t("div",{class:"language-css line-numbers-mode"},[t("pre",null,[t("code",null,[t("span",{class:"token selector"},"#parent"),e(),t("span",{class:"token punctuation"},"{"),e("\n "),t("span",{class:"token property"},"color"),t("span",{class:"token punctuation"},":"),e(" green"),t("span",{class:"token punctuation"},";"),e("\n"),t("span",{class:"token punctuation"},"}"),e("\n\n"),t("span",{class:"token comment"},"/*

    element will be purple */"),e("\n"),t("span",{class:"token selector"},"h1"),e(),t("span",{class:"token punctuation"},"{"),e("\n "),t("span",{class:"token property"},"color"),t("span",{class:"token punctuation"},":"),e(" purple"),t("span",{class:"token punctuation"},";"),e("\n"),t("span",{class:"token punctuation"},"}"),e("\n")])]),t("div",{class:"line-numbers-wrapper"},[t("span",{class:"line-number"},"1"),t("br"),t("span",{class:"line-number"},"2"),t("br"),t("span",{class:"line-number"},"3"),t("br"),t("span",{class:"line-number"},"4"),t("br"),t("span",{class:"line-number"},"5"),t("br"),t("span",{class:"line-number"},"6"),t("br"),t("span",{class:"line-number"},"7"),t("br"),t("span",{class:"line-number"},"8"),t("br")])],-1),v=t("h3",{id:"css-inheritance"},[t("a",{class:"header-anchor",href:"#css-inheritance","aria-hidden":"true"},"#"),e(" CSS Inheritance")],-1),x=t("ul",null,[t("li",null,"Most CSS properties that affect the text node are inherited properties: color, font-size, font-family, etc."),t("li",null,"Most CSS properties that affect the element node are non-inherited properties."),t("li",null,[e("When the "),t("code",null,"unset"),e(" value is set on an inherited property, it resets the property value to its inherited value.")]),t("li",null,[t("code",null,"unset"),e(" value resets a non-inherited property to its "),t("code",null,"initial"),e(" value.")]),t("li",null,[t("code",null,"revert"),e(" reverses the CSS default values to the browser user-agent styles.")])],-1),w=t("h4",{id:"inherited-css-property"},[t("a",{class:"header-anchor",href:"#inherited-css-property","aria-hidden":"true"},"#"),e(" Inherited CSS Property")],-1),S=t("ul",null,[t("li",null,"all elements: visibility, cursor."),t("li",null,"inline elements: letter-spacing, word-spacing, white-space, line-height, color, font, font-family, font-size, font-style, font-variant, font-weight, text-decoration, text-transform, direction"),t("li",null,"block elements: text-indent, text-align"),t("li",null,"list elements: list-style, list-style-type, list-style-position, list-style-image"),t("li",null,"table elements: border-collapse")],-1),C=t("h2",{id:"property-value"},[t("a",{class:"header-anchor",href:"#property-value","aria-hidden":"true"},"#"),e(" Property Value")],-1),q=t("h3",{id:"initial-value"},[t("a",{class:"header-anchor",href:"#initial-value","aria-hidden":"true"},"#"),e(" Initial Value")],-1),F=t("p",null,"The initial value of a CSS property is its default value, as listed in its definition table",-1),z=t("h3",{id:"specified-value"},[t("a",{class:"header-anchor",href:"#specified-value","aria-hidden":"true"},"#"),e(" Specified Value")],-1),P=t("p",null,"The specified value of a CSS property is the value it receives from the document's style sheet",-1),T=t("h3",{id:"computed-value"},[t("a",{class:"header-anchor",href:"#computed-value","aria-hidden":"true"},"#"),e(" Computed Value")],-1),B=t("p",null,"The computed value of a CSS property is the value that is transferred from parent to child during inheritance. It is calculated from the specified value by:",-1),M=t("ol",null,[t("li",null,[e("Handling the special values "),t("code",null,"inherit"),e(", "),t("code",null,"initial"),e(", "),t("code",null,"unset"),e(", and "),t("code",null,"revert")]),t("li",null,'Doing the computation needed to reach the value described in the "Computed value" line in the property\'s definition table')],-1),_=t("h3",{id:"used-value"},[t("a",{class:"header-anchor",href:"#used-value","aria-hidden":"true"},"#"),e(" Used Value")],-1),j=t("p",null,"The used value of a CSS property is its value after all calculations have been performed on the computed value:",-1),A=t("ul",null,[t("li",null,"The used values of dimensions (e.g., width, line-height) are in pixels"),t("li",null,"The used values of shorthand properties (e.g., background) are consistent with those of their component properties (e.g., background-color or background-size) and with position and float")],-1),L=t("h3",{id:"actual-value"},[t("a",{class:"header-anchor",href:"#actual-value","aria-hidden":"true"},"#"),e(" Actual Value")],-1),V=t("p",null,"The actual value of a CSS property is the used value of that property after any necessary approximations have been applied",-1),G=t("p",null,"The user agent performs four steps to calculate a property's actual (final) value:",-1),D=t("ol",null,[t("li",null,"the specified value is determined based on the result of cascading, inheritance, or using the initial value."),t("li",null,"the computed value is calculated according to the specification (for example, a span with position: absolute will have its computed display changed to block)"),t("li",null,"layout is calculated, resulting in the used value"),t("li",null,"the used value is transformed according to the limitations of the local environment, resulting in the actual value")],-1),I=t("blockquote",null,[t("p",null,"initial -> specified -> computed -> used -> actual value")],-1),E=t("div",{class:"language-css line-numbers-mode"},[t("pre",null,[t("code",null,[t("span",{class:"token selector"},"span"),e(),t("span",{class:"token punctuation"},"{"),e("\n "),t("span",{class:"token property"},"position"),t("span",{class:"token punctuation"},":"),e(" absolute"),t("span",{class:"token punctuation"},";"),e("\n"),t("span",{class:"token punctuation"},"}"),e(),t("span",{class:"token comment"},"/* display computed to `block` */"),e("\n")])]),t("div",{class:"line-numbers-wrapper"},[t("span",{class:"line-number"},"1"),t("br"),t("span",{class:"line-number"},"2"),t("br"),t("span",{class:"line-number"},"3"),t("br")])],-1),H=t("h2",{id:"property-order"},[t("a",{class:"header-anchor",href:"#property-order","aria-hidden":"true"},"#"),e(" Property Order")],-1),N=t("h3",{id:"property-order-summary"},[t("a",{class:"header-anchor",href:"#property-order-summary","aria-hidden":"true"},"#"),e(" Property Order Summary")],-1),O=t("blockquote",null,[t("p",null,"显示属性 -> 自身属性 -> 文本属性")],-1),R=t("h4",{id:"display-property"},[t("a",{class:"header-anchor",href:"#display-property","aria-hidden":"true"},"#"),e(" Display Property")],-1),X=t("ul",null,[t("li",null,"position"),t("li",null,"display"),t("li",null,"float"),t("li",null,"clear")],-1),Y=t("h4",{id:"self-property"},[t("a",{class:"header-anchor",href:"#self-property","aria-hidden":"true"},"#"),e(" Self Property")],-1),W=t("ul",null,[t("li",null,"width"),t("li",null,"height"),t("li",null,"margin"),t("li",null,"padding"),t("li",null,"border"),t("li",null,"list-style"),t("li",null,"background")],-1),U=t("h4",{id:"text-property"},[t("a",{class:"header-anchor",href:"#text-property","aria-hidden":"true"},"#"),e(" Text Property")],-1),Z=t("ul",null,[t("li",null,"color"),t("li",null,"font"),t("li",null,"text-decoration"),t("li",null,"text-align"),t("li",null,"vertical-align"),t("li",null,"white-space"),t("li",null,"other text"),t("li",null,"content")],-1),J=t("h3",{id:"property-order-details"},[t("a",{class:"header-anchor",href:"#property-order-details","aria-hidden":"true"},"#"),e(" Property Order Details")],-1),Q=t("h4",{id:"display-property-details"},[t("a",{class:"header-anchor",href:"#display-property-details","aria-hidden":"true"},"#"),e(" Display Property Details")],-1),K=t("ul",null,[t("li",null,"position"),t("li",null,"z-index"),t("li",null,"top"),t("li",null,"right"),t("li",null,"bottom"),t("li",null,"left"),t("li",null,"box-sizing"),t("li",null,"display"),t("li",null,"visibility"),t("li",null,"float"),t("li",null,"clear")],-1),$=t("h4",{id:"self-property-details"},[t("a",{class:"header-anchor",href:"#self-property-details","aria-hidden":"true"},"#"),e(" Self Property Details")],-1),nn=t("ul",null,[t("li",null,"width"),t("li",null,"min-width"),t("li",null,"max-width"),t("li",null,"height"),t("li",null,"min-height"),t("li",null,"max-height"),t("li",null,"overflow"),t("li",null,"margin"),t("li",null,"margin-top"),t("li",null,"margin-right"),t("li",null,"margin-bottom"),t("li",null,"margin-left"),t("li",null,"padding"),t("li",null,"padding-top"),t("li",null,"padding-right"),t("li",null,"padding-bottom"),t("li",null,"padding-left"),t("li",null,"border"),t("li",null,"border-width"),t("li",null,"border-top-width"),t("li",null,"border-right-width"),t("li",null,"border-bottom-width"),t("li",null,"border-left-width"),t("li",null,"border-style"),t("li",null,"border-top-style"),t("li",null,"border-right-style"),t("li",null,"border-bottom-style"),t("li",null,"border-left-style"),t("li",null,"border-color"),t("li",null,"border-top-color"),t("li",null,"border-right-color"),t("li",null,"border-bottom-color"),t("li",null,"border-left-color"),t("li",null,"outline"),t("li",null,"list-style"),t("li",null,"table-layout"),t("li",null,"caption-side"),t("li",null,"border-collapse"),t("li",null,"border-spacing"),t("li",null,"empty-cells"),t("li",null,"background"),t("li",null,"background-color"),t("li",null,"background-image"),t("li",null,"background-repeat"),t("li",null,"background-position")],-1),sn=t("h4",{id:"text-property-details"},[t("a",{class:"header-anchor",href:"#text-property-details","aria-hidden":"true"},"#"),e(" Text Property Details")],-1),an=t("ul",null,[t("li",null,"color"),t("li",null,"font"),t("li",null,"font-family"),t("li",null,"font-size"),t("li",null,"font-weight"),t("li",null,"line-height"),t("li",null,"text-align"),t("li",null,"text-indent"),t("li",null,"text-transform"),t("li",null,"text-decoration"),t("li",null,"letter-spacing"),t("li",null,"word-spacing"),t("li",null,"white-space"),t("li",null,"vertical-align"),t("li",null,"opacity"),t("li",null,"cursor"),t("li",null,"content"),t("li",null,"quotes")],-1),tn=t("h2",{id:"naming-convention"},[t("a",{class:"header-anchor",href:"#naming-convention","aria-hidden":"true"},"#"),e(" Naming Convention")],-1),en=t("h3",{id:"layout-structure-naming-convention"},[t("a",{class:"header-anchor",href:"#layout-structure-naming-convention","aria-hidden":"true"},"#"),e(" Layout Structure Naming Convention")],-1),ln=t("ul",null,[t("li",null,"容器: container"),t("li",null,"页头:header"),t("li",null,"内容:content/container"),t("li",null,"页面主体:main"),t("li",null,"页尾:footer"),t("li",null,"导航:nav"),t("li",null,"侧栏:sidebar"),t("li",null,"栏目:column"),t("li",null,"页面外围控制整体佈局宽度:wrapper"),t("li",null,"左右中:left right center")],-1),on=t("h3",{id:"navigation-naming-convention"},[t("a",{class:"header-anchor",href:"#navigation-naming-convention","aria-hidden":"true"},"#"),e(" Navigation Naming Convention")],-1),cn=t("ul",null,[t("li",null,"导航:nav"),t("li",null,"主导航:main-nav"),t("li",null,"子导航:sub-nav"),t("li",null,"顶导航:top-nav"),t("li",null,"边导航:sidebar"),t("li",null,"左导航:left-sidebar"),t("li",null,"右导航:right-sidebar"),t("li",null,"菜单:menu"),t("li",null,"子菜单:sub-menu"),t("li",null,"标题: title"),t("li",null,"摘要: summary")],-1),pn=t("h3",{id:"functional-component-naming-convention"},[t("a",{class:"header-anchor",href:"#functional-component-naming-convention","aria-hidden":"true"},"#"),e(" Functional Component Naming Convention")],-1),un=t("ul",null,[t("li",null,"标志:logo"),t("li",null,"广告:banner"),t("li",null,"登陆:login"),t("li",null,"登录条:login-bar"),t("li",null,"注册:register"),t("li",null,"搜索:search"),t("li",null,"功能区:shop"),t("li",null,"标题:title"),t("li",null,"加入:join us"),t("li",null,"状态:status"),t("li",null,"按钮:btn"),t("li",null,"滚动:scroll"),t("li",null,"标籤页:tab"),t("li",null,"文章列表:list"),t("li",null,"提示信息:msg"),t("li",null,"当前的: current"),t("li",null,"小技巧:tips"),t("li",null,"图标: icon"),t("li",null,"注释:note"),t("li",null,"指南:guild"),t("li",null,"服务:service"),t("li",null,"热点:hot"),t("li",null,"新闻:news"),t("li",null,"下载:download"),t("li",null,"投票:vote"),t("li",null,"合作伙伴:partner"),t("li",null,"友情链接:link"),t("li",null,"版权:copyright")],-1),rn=t("h3",{id:"css-files-naming-convention"},[t("a",{class:"header-anchor",href:"#css-files-naming-convention","aria-hidden":"true"},"#"),e(" CSS Files Naming Convention")],-1),kn=t("ul",null,[t("li",null,[e("abstracts: "),t("code",null,"$variables"),e(", "),t("code",null,"@mixin"),e(" function")]),t("li",null,"vendors: external libraries (font-awesome, bootstrap)"),t("li",null,"base: normalize.css, reset.css, utils.css, font.css, base.css (margin-right, text-center, float-right)"),t("li",null,"components: form.css, button.css, navbar.css, dropdown.css"),t("li",null,"layout: columns.css, grid.css, header.css, footer.css, section.css, navigation.css"),t("li",null,"pages: home.css, about.css"),t("li",null,"themes: color.css, font.css"),t("li",null,"main.css")],-1),bn=t("h2",{id:"css-selector"},[t("a",{class:"header-anchor",href:"#css-selector","aria-hidden":"true"},"#"),e(" CSS Selector")],-1),mn=t("p",null,[t("img",{src:"/awesome-notes/assets/CSS3SelectorList.c7ec6bba.png",alt:"CSS3 Selector"})],-1),dn=t("h3",{id:"元素选择器"},[t("a",{class:"header-anchor",href:"#元素选择器","aria-hidden":"true"},"#"),e(" 元素选择器")],-1),gn=t("div",{class:"language-css line-numbers-mode"},[t("pre",null,[t("code",null,[t("span",{class:"token selector"},"p"),e(),t("span",{class:"token punctuation"},"{"),e("\n "),t("span",{class:"token property"},"margin-bottom"),t("span",{class:"token punctuation"},":"),e(" 1em"),t("span",{class:"token punctuation"},";"),e("\n "),t("span",{class:"token property"},"line-height"),t("span",{class:"token punctuation"},":"),e(" 1.5em"),t("span",{class:"token punctuation"},";"),e("\n"),t("span",{class:"token punctuation"},"}"),e("\n")])]),t("div",{class:"line-numbers-wrapper"},[t("span",{class:"line-number"},"1"),t("br"),t("span",{class:"line-number"},"2"),t("br"),t("span",{class:"line-number"},"3"),t("br"),t("span",{class:"line-number"},"4"),t("br")])],-1),hn=t("h3",{id:"关系选择器"},[t("a",{class:"header-anchor",href:"#关系选择器","aria-hidden":"true"},"#"),e(" 关系选择器")],-1),fn=t("h4",{id:"descendant-selectors"},[t("a",{class:"header-anchor",href:"#descendant-selectors","aria-hidden":"true"},"#"),e(" Descendant Selectors")],-1),yn=t("ul",null,[t("li",null,[t("code",null,"E F"),e(":所有后代选择器")]),t("li",null,[t("code",null,"E > F"),e(":直接子选择器")])],-1),vn=t("div",{class:"language-css line-numbers-mode"},[t("pre",null,[t("code",null,[t("span",{class:"token selector"},"ul li"),e(),t("span",{class:"token punctuation"},"{"),e("\n "),t("span",{class:"token property"},"margin-bottom"),t("span",{class:"token punctuation"},":"),e(" 0.5em"),t("span",{class:"token punctuation"},";"),e("\n"),t("span",{class:"token punctuation"},"}"),e("\n")])]),t("div",{class:"line-numbers-wrapper"},[t("span",{class:"line-number"},"1"),t("br"),t("span",{class:"line-number"},"2"),t("br"),t("span",{class:"line-number"},"3"),t("br")])],-1),xn=t("div",{class:"language-css line-numbers-mode"},[t("pre",null,[t("code",null,[t("span",{class:"token selector"},"ul > li"),e(),t("span",{class:"token punctuation"},"{"),e("\n "),t("span",{class:"token property"},"list-style"),t("span",{class:"token punctuation"},":"),e(" none"),t("span",{class:"token punctuation"},";"),e("\n"),t("span",{class:"token punctuation"},"}"),e(),t("span",{class:"token comment"},"/* 仅限ul的直接子元素li,忽略嵌套子元素 */"),e("\n")])]),t("div",{class:"line-numbers-wrapper"},[t("span",{class:"line-number"},"1"),t("br"),t("span",{class:"line-number"},"2"),t("br"),t("span",{class:"line-number"},"3"),t("br")])],-1),wn=t("p",null,"Using the descendant selector without more specificity can be really expensive. The browser is going to check every descendant element for a match because the relationship isn’t restricted to parent and child.",-1),Sn=t("p",null,[e("For "),t("code",null,".container ul li a"),e(" selector:")],-1),Cn=t("ul",null,[t("li",null,[e("match every "),t("code",null,""),e(" on the page")]),t("li",null,[e("find every "),t("code",null,""),e(" contained in a "),t("code",null,"
  • ")]),t("li",null,[e("use the previous matches and narrow down to the ones contained in a "),t("code",null,"
  • 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 b?11?nw(!(UrMhGj00000NkvXXu0mjfNIV7C literal 0 HcmV?d00001 diff --git a/assets/AXI_Write_Burst.63cb974a.png b/assets/AXI_Write_Burst.63cb974a.png new file mode 100644 index 0000000000000000000000000000000000000000..9d55f15ea052fa54ba45b7948c211f68f241314e GIT binary patch literal 205107 zcmZUaRZv`Aw5_oO4esvl1lQnB@Zj$5P6u~)ceely1oy_>Y200d+vUIK+^1W;tE;PD z_O7|snli?>BYrAMeM7)UfPjGbCL=Ab0s#Tz2>}7+0SEQ@k0G|x3j_oygpBwPHBZR1 zb+2hoJ#}K=2)ywtUgN&;Th^)k-$?95^6cUXxX{L;;wA&K()6V;ss~YKh4l!cg9Sf# z#ihj+e*QpH{)z=nUq{M5e8pag8m??&3}V^5Y-Ran+ctIFu9PQqc;Ua%_;J+eec80s zwzztGvF=yi2&b8e9LRY&0tyUDg8dyC{?#+vi!RRp_yGs?jiN+aWc+7rRm z)=3R58*~r&r)b|Qk`1dO`1AVy-}qf^=e>4*(*m3`=S=aGD1%K+x@&Ewyb_A(hs@as zG!aU9p(u@W8Mu)tgu#a1tzEnT0|N8F^v$lOEj6{?rCnj3?)~ISq|D}gjd%hS)1+wH*Mo{3 zYR8k|0v8pU;@(3DCst)fBfx%Rk@aR>;^8(n`wH=4Dh<8hPf~xSTPK+?vZaWpM9ky0 zwHJ^CtN8!@&_;P3`MB$T*NoKJk5(0*f`S zKw&1WhuKz^z*i5~PAyh~9;eyMOwu0HTGorlq zK*c*rx2__-5;5*EWQ^AI>*VGTVc)>e5NMVaj-}>EXa$COm$5uTM_EEol3mx%N!qYqnP-~6) z0?>G?o9}GIcHBR%Mb)Nk+akiZtEx)Q4TnS_Y!m;gM#5~R!->nvrKNkf@d7b+;7RE^ z?`Hon!_IptrBAv62wy!g9!@npG=$U98*8soGJ*^z`{+7d8e>Tm zTgEiJ{Yw_>jZxO9&RbFZ%R;uTIz}M7c$0!_N9+#aPj}^eoMsHCo1Ru;=`Xd`x+%@! zG3b#16KfjhUut1qOJL;0$@ALT=T~r#L)4`lkGTBiIC3ts7>ygVG*CRD>pMGLWUa0Q zHd~sCbD^tbz$v;qbB-Atc<%nxQ|s)wvx=gfFJG~lv$w|a=V`g>hn~VVat(9oK7Kp0 z-TDtb4|IP*l;XZ=b@6{1`*gHI$uIRug&4OZ&=i9Cio}f<-@XS3Z9x!B&IXbkPs~xaU)w zz&eJNCGjaNnUd`;OiYfT*aWXXh;7DKH{6r-J+~>c;hY92?h3-BSCuL|P6{<6{q-iP z52J0Uk~#Pd=FY5OOf<{?>HfJ2GwH*SNZasm-f6Hy1W~UkFz|cTUg!s1EzPb8_VzUkiQ?5K8}SeZ~@OsA6BkV zxH4`E(OR+e!HS8VkZ%b{7Q(F)oCMJ35_zv9d9N1l<9YCn#VbJ$3Cb5a{ld>h!p{yL z=iPL0dDMuLIQGUXkfkqUe7+bADbC?Ah;ACIcS zcdA~t0IOZ9HV zbbfTc6<9S79x&J_gX!?Qx277j=U4HO6x3W~i$nLGc=SX@`=LW3)b?^p$%zn)fXUVy z!G|w>nPa;+w1+MJr!DqAV6guzjh{-ZhmHb$D55x6^X;Yk<7LYKz7cTC4d9?QczqKBA-pU2m{COcsgt*Rs()DC^hfUHBD zNUdKbm-(*kF^WScm_(g)+CB!mA8{~vU$BP%yTg>%q{~(u2=kxRwC^j*`SwVYJ({{8 zC0l@)?nj@&BVwG-+HUSmav6;K^`3jG4MP%W^QChW!(;|dlB(d#i6|>?3)62(sxGF$ z>3ep2*CGNd%NybgGz`5x8%#)OVhn9VB8*6;(B#fNX@ncD7bbfrM1K6pQ25;%(gL@6 z2qHyRgb~mpH)%nltmvRCT-)USvFXZP>Z_*`=xEd}>m;4z02$Em@5=>(6+6I)!MLbg z(fY7?q7VCro137=#GLtB3Ua90F?JkorIake)Cz)pt%g+=UqG(%yyW@Z_!_OOX+g{_ z_;N%-*=L=$nDU?MK9$DXh;ON^>gBveE}>Y|&lMeQ)5GTF1FF~}GyU=15|}4oh-gx8%O-q4UzG>(Iylr3C-hsrSY%T851or^t)Lwcw5LWUFD!BE8Tyd`5X7z%=rzyenEe_A>0*9;0-(J znHT3E#+eZla5m(B_A~|Psjtl1faF^UR_^2W zYPq|vV>Yk8ZRYbXH#rexR7g_^9{@FF_T60*c_3?wVJiAs{J<^84C1LG3HBl6&R~7m zL~X9`oxSq!fVaAjyC9NRQij6LemrwH3~ilh6+|PRBt5-1l8;@0?}3H?0nvqH*scJy z#f#@{i&O5%V|rdo{U8Xh?%D{LHcM`73x5Rmra~pRQZ6 zY{FA^J+9Nh^fmVw@p1^LC5m#J-TF$QN9h0F3kb$v7~+nI)q>n@H;L#4waHnleo)$r4o*;k_vmv%6cB%7OKmA-k2QtED zW1f_FgRb6h_NZ$yBY;7zcz8e}@ExP8)@)`td>) zP1o(^?I>E0_E`YDPbl8gL1#N-v~Fd@f3zJUYSN_u`p*b&-Y1b-ajlOy67<$Vk1FBL;kSXV$3d2Rq^k>$ZXdO2{T|f$RuGIh zDs_W>zedj$>yWx*wCaiCw~Xv-P^$I$^RW`3?etG=BB7{zunki5IfRHl7rohJ>vfDn zHR&h_4;}(WTWuZ1cMDqMl1-M9$s&TpgS}bJMhbrWm{ks)1o~sv;92hTeCF7hsBa{Q z$48sS@(H$5KqEUHB}^M)vLYP~P_mQii5bR^HHj|kVz{ohv@O&SB0X6SjQUTl4$w5% z<9f*2rCab;jIUJWB9S`m^K3f^t3`nfIE#-eSu5yw_}xnF`&ZbfcVK>U{T`@e7?9Yf z)mxN&9j|*du1&WK*4@o$f#>D+kB-C!NNw37*0AyLwbfndps4)&Ne!@G5P@V|gzp^> z-j)%$dN}pYSgXL@t{yf9AB7o%)A@uFvlBw2(<0^`PkxsNJPAFtDos*dAb3)C)0;|I z16GaZZa7$?|A@9iZb#r&@|&>HFLFd_nU-xwWYxGz@qf9j(fr$v~=JN7R)H0?7x3g(o^Fa;$8ToMKjRVhZbuWB#vT>z9 zuv8}46$VJZc5w9^Yb4qrjVzpJ{ARchtRd%>*+we+M$N7R-|xDIato}OnbZ`%f)+L; zplu_K;D~A*2<`54_w2*d(Vbgb|5wT_cqA&veGweqmR!T2VcHsQDW>qR9xH~7I$XxI zHll^X#J`Raw8g@bq69+4Y{Jv=mcP&OoRsfyu9T>a-7w-c`MF~L{Mj{)T)u5wF4UEV zCefMPq~@(dIbwI-p$9imgsbTD@+XC8z#v2CrsC(73uNAdH}1KDaaTjoX{qgPZ4kd+ z!}BC1Ga990lDT)1T>XZfCj(rw!J@st)liIDRWEg3xapP|sD}~Zh1UhuT*1=32QNl0 z!nCsfUCrW}dnsgjE)4jVAMu{QX5%FyLqOSJ(J^y3*!rswn%}K{TJ}x)?$r`8 zfwBRkt_(Gi;nn_{a#p<$3Ex@z^( zy4Ko({E>J?!=x+ zIV8IDl*;vY0D4SGdwKvjH6A;{v$B=XX{)!va4s`CB3UWDs)g4 zBiUqihx15H!n2Fep$me=m{!7Wgr(JX#ZzD1+iIQG^+`@34MyB_02&rn(r{p8e6l?P zS+D_}=Los0TA0v-x3*=@X<-CX=t;7@4!pK^;hKqARhv2j#vG`{wf-CGV4P*YNUB#7 z?Skh)V#Pwj0loM^z-XGUSja_6s_U;B_-N-W8v+3Hx0;^dJ&A`#c~meCxug#3wxzl& zCCX;%xN$qwn=M4Bu*Bq*}7RpV^uNIf6LO=Z85|)QPRbYM`BBWZJ$Y$|Y(V`go9LteU;$UK6XV2p4RmU~lU!Lu1JWBsxp=Rfay8CreRpR6XczewgtbtBI$l|+=D2VC2*VGuF&liAd zDeV1_K%~=BUmyObHB`0z03$3~;F*K1O1lkhc261?Xn8{brpjL>Hm4R_duME zt^cL~Xp%>fl|y#2_o)BB(t2k&t#ZPt~$AUipYTvvWpi*RGD55Ro45m$e*o?IqiTT^oD) zETkk)fTI3;e^nNgI-J^VmL7Fc?yiH+P!S$G>-hDAi#Ube7L3csPO~W))o>4S)p_Yx zR~AM0c9cTz%1Sw#GJ68!%<$Fa(M<|F^1w7>UrCZDo2{+q53}1S8iH zP((JxoFUQ~d^3UecU$pNHyavhA%H@_wuK+H$h3JMR!#gRY`X*e{MK$`Vl9!V5dh@!pE4%8$1N$bNp~qzGoB-NALR_d^Gw2Z2*GPj z612x;0YdS&*r~|Hnc6g-Ddn9qBk@~BU{Mc=B8Vc9!8X)VCOM%0)Q+UR;`!2|E?DXP zkimdM-nyDDHob;bztziuM3=q2GK@DaL(hQ%*`6Yk(;Tn&8au}oh`ADXIS>yG$e5O~ zYnl?(nOPZJD%YCPD1(EQJffwSmT<*g1+xh-eRyW>A#>fnOiFo!f*OEI)cRU?5(Vp^!~f@&*`hIRY^wi97~BFQg(n^5LqYnya@4;i|b*KXRWsN|BE9^AJwDgs9?P~Sny+SMSt zsQbN&AJYwJ9wBD1g`UhRno#1fX`yB0n6I^2HY}e?OKwz=(;9c2r+gv1@^i`een8~Knh>4 zoHINSSD%Jjcok=Kv73RK1W(c#?ivb4;??{ct<{_|?$S8kCsMcNLpdpOfM;TOWh5Z{ zLyol zZX-B4%60@KKtodXuLn#wW(Wp-SWH20*-LF=WGDM7+ik3vX>wULLh^THF*0dv7D&KTKdk`Op#Abn*>dF%X=xiFZ50LuMeTPa+$!cqF1)5|az=~H12lVV;-lz!_0 zKe0(e*iByEMt(s?oW^09FX46rgiV5QU+l_UmY_9JIjuoiNNzzU;C*8Z4#+jSNBm+= zZQHo>PuwPzeVsITD5YM=ewTVK6p0~v7HSSoPqly5dvP|Jf48%bI=D6+k*$-}ApG8p zem}_!s{KUym^OCTw`MB%Oz_exZe6JT(dkUluE4RB%s_2sTBzN+v`G~*q`^sK-N50= zF}fT+RdJa8t4v;5Gum#ITCq!wjg8`uZ^|uxdSOxZ)Ymv@2Sac#4_46?@N-vc8&)er zI{0C*-4;J0gH9~dDE~=B5Q?NQ65!Q_6FgA1*15_fwfG?P1|#1}vJ&Mcv|PpQWrHNU zno{G>l({M1t;(tQ0(F1zL|2L*^eLHZYedl`SXU3XVoC^E&1pms;kGI$Cn8lss?jn~ zx;3b&pp}Jav>KcDWi@>c!uM8n8T-sK*(Xi)q3R`s5d5JQq%XNLCaa)adc~Db9sV*P z`upzF!}hr45;0uFeGdL0D6|`;((CpDAx?=W0M_|iy7(mGnaJ#H&VhG{>iZGF7g!Zd zW1E5$TyK7HC-?9j+gNblX^jGbgm^b#6j z84GU2;eh*1PoiM_y>m8o5+pd!;4mo&V+|cR;wis}k*_#Bi(FWB+GC^5)q7>76{~7h zW<-!Q_8bgf%iX>*A+TlVL3027Jl)KQ3%>hKrhP^T^eSjaSY#}qwAj*xb4Wzf%3icU z45sEKwS#Zw8QAN73fp%ZpJ92dtaWo*}Sz_sT5IC7Hs zR|Yk-0GM@$BxX%>yI>~45cBD2s;#t9Jnp3aY@}-?HfDF%D*?Du0u(fzrFUJy3AM+v z!gn)Eho~l)Ir~TYAk*xSFk?>GcWuiE8NloyaMy2Z1hX(zzp-b7dO&nc80XOFk}H=> z-wcc!DP>Lkn*u!pH-Qm7vGehPlGKAZ{Yr3uJn;=UojDjo5X{5(OUjL#GOzG|T_?nw z-z-EdrZ8=!u(ldHsu>d_Wy@9b(8Q)*L=vnEs<1cdHdxK(lL)sYAJ-)Pd6GH2rz>lB zCTU(4^ujy_yt~ap$y! zkI(lgk8FzTQQi2TC>sJ$j$%9bGg-8f+)wiFJ&tAiRs{_e59FpZ?(G^SOV`wKG7P`rHsR|#cag@8z`d&j_?;9_+uKQe$lGCUviqqUMyF5e~3`%iW+2+QvIKFW7vQ?eH&{ z_1~_#G9*{hw?{O4E#+;-w^50W>6Cdg?Ofvv8v)B`F_BmwzsG(O`z9Fo!&P?1-~%NL z?K}^Uomx`51i!#8ZPJ){)PnWYNNBXtowrLscUOIe8H-OwmJmc(!v#t+GN|F?P4Pq_?5(XN^rtMP;ARgoD zEE|iG_}W(M4tCRQYsH$F)$U!=S$~|(#Uay&<{)`)+~z)brMy~uAJq&C)Dx)R%jd$ik?e4v!tunxKSsJh}DP4Yu!A%*)_Q0o0 zZzLFESM0GWHU)myXiPD@3xC^<;Kv4qnp(ObJ!{b2-C2Sq+1jwy!4S4)!T#AAHeie+ zfcmhxrSn`dDj8l|(tO3HVu{&Z6W7a%B@kHHmwFEy=tyEa!}c4qTWq_Xp=el7?x*&0#L{11Y$JJS$whi9UdQ519i8vHLLb#(q6=ht~$Dz#*#*T4N$bar#U5E{|i zF0+V1pa=QNi&`TNkzy0y60#;+SymxWsBrTQ$uBOV7cj#~PY@%LTRa%gS6C!@d zZ-_I-on5Z=v>>biW#l>(e?h(1K6CwQ55EZUc%db>30df!#z=?2XQDF zSXQVD-*O1wE`2;3d<3#Q27b;TXq$I>nd5#9AET?y_#Yu>O2+9o@|?)y+)r>C5! z$*h~eO(osVZgSDKP^9R*=_${u#SHrRyTyIn`%xUbvdlPRUmP{e`|F$9M8jtz=SySh z&Fa%syxzMx7fE4p`28Knd|u96#^yLu0QE$+ow_HS9F^Y=UaTK@5w)=k0`G$_q~`<*X!KI;00JF zsBog-;63MMbLfdf7(ORDb{}nQu8HSQsz*~#gOV-qd48o)(iLjGVTh~_BF=}2mjUTE z77|Q;JYs<>)OGM9!Mr7B364C${fWC&xP)K1YG#2`sD8HALfL+#ccN!Eu}K{9+<$w& zef`bE3;(XOwu3F7j<^S!6;Pac{N0yx;aaBjT&$EihV9&(k@Of-k~PCYVh&A`F_56QB(-BRVw$DzLsF|o>9$vR{Qw#o_#2A$nvq@{Tj3R7!!FSqvV|k z%kNI74cNvp`F7y7^ywva1Ma8ZwG>yH1Z>J`IJ^#c6pYWi__qJ=i7E2x37)m>>AoOT z*uBBBBaBn(e7HfhXAb6Wn~9OP0@XFGwxK=qF!bBqXa0cSy_Qn6kzmkzy`CtT|G_!b zX}ePg^a$K^;x{ONI4ih26mm^bMthMa$XkMMYU$W#;%*&Ln6J8S1vwHAp-%B`+&8z- zh3_uybzzjU0M8(fvo>B2xVv|WF8?GycW%B2R(T;1V$Li6r%l*dGB+86Nj0b;jTD`PBwS58wH6$-|WaHeFMEO!%8K-SeQF*128WS zm)=Y5|CSr$@@+iwHM0M>izz;O-28@I4IUt_x6-mu_3R)NRm;78ZFDrZHhNCh4ElaP zscRFMIy~+sdOxCN>kj9>?E+!lkc~KA4n+%P7Nf}Aqi=Jav$y`4c4K@GvnE9^9O zla-&ej0Ko}t+4q|LHK=F*uNdTKIy`glRPCHfAO!oSm|wEDTaD~o_iKvtcv~gdlfru z5u2fEZKf9NrniHF8FQW=;jJ~hb?2ZH;hy!)HUGeFy8Gfqv)1AmLY#zyfKMSl+7d2GRAJvx>zg3rqk zi}){}HX8#BtY~fQN)NsDB>Y~VprPmv_$YQGz21@tQ3~A05hTk>!&L(en=P%4HIK^Z ze3;M(6ZpODp=;CmsM7-WD?g;Nd)2lyE0AC*=KV}gUTSts+XXQx3on}=@1LcY`ZQ8! z^La6iS?@Xa@)6mFNr#aI@H7T^3{lzMWYtHJCD$ zcrq(aJ)BMaN#5>jeWeNgpH^s#hj^OeI5W2Bw0M6nV9=ZN69!5@_{n5Umek0mh^VIV z%eZwB(?)*d%S}4$`)7b+Rh1D3+?grgJ>+{jmewA15B53I3;CUzH-b%X5RR z>7^4$K=E1b?>eyQI`~gGGI8+6t%~Iheb2~G3_Y$5ROK1>S|Z|az^?4 z*q<<(^heuOv^ti&fxPOF2UIH9^eL=$d+@WR!j|`|N4I$&uW6lUW~mqtty6x4;q&u$ zRjilSaexk-7XPO-z{-1YQoyHo>_?RRdc*SJ47iJrlX#!#e&Qy1zY61TCx5?u>+JSu zXB5i-Hso9cb{o2BwF>WnnbbZzt-7MnV82-DvCZ9BfSfD(p+jNi&)uW zBXLEp)C}6rl(fQO*vZ(Ci!2sCi4)|wf`(&OM5j9Gs81T|M|gBpQBiG@ofHy1;+Z|` z6goF_vgm`Gl4kFc1^#7BT4^8WbV=svu5XED{7r}L^SinM*Mvk=&_$hVQL&}_?VKvY zi2f+|_x@sOf*CGOahvaGnQx>LX5o@fApv5jgl*cu$*;DAb4;)Q4fh0eThYIsG9_f< zi9;HRsJq_>sJ22AB@)Z$oB?e5O2iE`7He}7@9h!rNg>H3)@>?mNoE(B35T~bD0SJo z$pjvQYd2Zw{6l+jTYBKfl-W>t3!b;b-j2r?s;tb#xJ^}-dSX?d`2?@W+}Znap|>N$ zW1`6(eoqj&Xuqi zMfD`Kdsio1g3@L!@+iQ)hODt&dNmtYafcpK$W_ zDr>FoL9Ou_`n5yvG(ksv!8b}jWwgn7QQ{XZpM2I*GBe@RB#|s%sV+@^Uba(UZPbJ@ zeGbAg{~ye6E1>9Gc1;UW`S59j-QFj}x7BtGX*Vs^;XA$xw7tLQY43?KOMZHL zpBvrHU$+dTsvW6Ua?T=gF#Y98xpb_int+Y$h9nRL%G&r>Dr<^#3+2VQnp2kJRPZ-0 zrYvMpXoFz1D*EkmA%tFrQ{8E88Dj}fP7yQQib7n>%T zh&rt2mB!MbojAu+3?=1px(9=D-S8?cBPaGH;axY7WnaiLR-64HXR5vf_fs7y&Ei3d z?{};F#m$$Ehxd!i_lueD#EJT-P@6sG8>pklUFBcU#{mGLU6V8u3I(``|T~a$LWW((%I48-H=3{icTmEefJR zlQSGSTZ>I=Oi21pCZkJvg{9}T4q_xn99Kj_%W8A24Yo_<1_kMrAEc~lN_C+!JXg#a z2MRC2zsrEStapF7&QRTx_$jg-j$xGWUP zh=nbyIt#Z`Oa7f!%A`7|Hv0eo)u8hvYz>A3UgtC^%_Tk5F^5pWz3lc~lzXu<@rS>WUi-S`{oj zj0muCnY#jrbv1^#Y8x z%3IMB$9W3opdsScV^c7NodxPN)4+68=@dE>QMeE!cEN0EC4{Us>zaJO_c9j!p2(Pd zPo5~JBJ4AWRE8e%BZ5+`RxpCp)h$!kttRd?8V6kOL|Qaj#A}F~XC|U8Ec0gcg+*QB z{5Bl#{uacTBaM!f=l&9`I4jgLa1-65Tr1w%U`dhzzL_1=vzi2Z-baLW;NJ;3f4!0P zC*Qd<_CxI^F%ersi&qnDYRqr{R%!R0tgS#Dbst__MEPJG%HvpFr*Z)z(wNN5g-u z{X`dk;)~*7@!;aL2(YWh7yY z@Ph!%R4m6Jp#~du$`vV_OhfP-x+D|gR-A z#$PO0WK*$v5U>B73RxoFONu(BtJ=$FQn7EDNW-t0D~8oPwxCg2nCPvio?-&vP}H>2 zNe*u>fNFc+W9-~refSl&T3gFmTU&%?kRFCMm8CrIz?#u3MTjTT7i(WTT4N@!@;jxZ zE^}KJUbk_oJwqbJi!+AYS}!WDc~;0YQA+^~erB;?ESNBkJ;xMxQ>|=lZ3?0$4zQhr z57_tCbc5Z0?lUX>$8>p7W`eR$Cm*@YSY_D#$fies01kVA4mFu$lTB3x1mwC`EY_tp zb^do%oA386Qo9}c#=7{pdROgkYDz@kGCQj$Xpt1zN;xQ^3B2nSZx!pSVyKwX4 zZ4+=TXHZGrd8&7*BIh@m;&Ar|p50wwWuw_uN`i*&PD95q(3^irv`W3Q=53bcEwRxT zk6^X9xfxSWe2iCwBS2}k2hVu$i0@K6YHprtzlv96_Iewl8D6H@ANj$G{Tow_XE8j* z%Cot5MQK~qe7(?=wz1l<-sxVUJjX__>R>&s?P1_dZKF^Cz}Zef6LBPrb|*1{wZJ}E>owj?dVdELKq)O`)T$5IRPm;ikY zxc_F9$LFQ)_a*=HCF4L`>;f15DBeuS40C^PJD|kn{#e>W_C72z5WDTF`$WA?lwrr< zF~k5j$g9I`pc$%0;?k|oM@u?7ZQ6WOQs@3ZDfkmN81eu-cpT2GaZL_*{QSnzQo(+5 z*P&IVa{O}k16c7geecx0!_c)8@JSmfy$&e-;_^LC^QW_V@u_gAP;Wz1yV5*+fv~?# z#m2aR6+HUE;(r|lI4Sd&Ejh3D(Q%nRx03{LG<>pDkI+%GcsSY+p3iTW@9W(~ zr(U0ps_s;e&K^^ZjraPgzDM`VdR@#~n4;DZ$t&#S=QzD)yA%6x0<-YFQqfz}Z$9`e zhq1S=2(kC0DRL~B^g2h^XG2?guCUE{{_JKXdRcnXe=YYnw|Q6|!bGohLB^B{p)w4> zjv^HxZXe9X#BS_{fAs=eHp{NC3ev^PqzWnLTVz+_s0>Oq?T`PKj28tVy&MdL+9zP( z^Ru-X`_4y?RN=*&XJuR(akAGI_|B;2JLG^RjQB%+kJOwF(K-4h1KtLiE?g`BK16Mz zKdePCH7*K2eN;~rQV;7@HuAf zk4X%&^(tfhAZwb=-nykyv$AND^Z>weKe0IqmHlPVCFT%r2DE_fH3aKa&evsk*}!Rm zsS5Kj^qg&AW0fRbR8DZT=>Z7=C>U{pQtE)nTosV}JYTlzeWeG3oj~G`AF|!Cs~SO- zEkfKr$Yfu@k>HU^_vwb7{^!-NF&I3_=4^QQ4tbQ7|;c{0-kWagGMQM4;kdA`Rh z%e=OF4Y8IBz%(}+xdu=DLXD4?$^UBk=YRn?8$mF%wFbh7hslIUH$LDRXX<2nslE2y zU(1gy#%@vst1ISp>jrEw6iiW=lN6C>p!TJ_#C!s}UU5jt@B&5c=`BOy+{Rrq=QDBs zz;zO8Q`Yrg*zL~<0B+a=em!!MJ9&|To#M;q^WI>+!b|LIe&U|j8KkP zd8!F{YV~AhBU4b$a$qWa$AE((wAH#xM!q8vOZP#hO^3UYK~IvSn>wACr^YJDijvH@ z;-4s9ug0cFp4HJo1alzEyyF^J|L zeaL^zpZDO=>WB5Tle9Icz=DD@Wl=k4=!|CLvqI%*=8UB07uczFGTi{DR}V7$cE7o` z=iY6qn}I=<6{xeI2eamEJ8Nedg=qszbnjm^ib-I=mX%up2Q<&mAtF6|XdQv;=~;HQ zzeMheuzStm=(J-<9dCjU5nmFNcq0EdJ#1~i1LQ-+mg1R`)Qe;r{KlPo%bD$LFC1+r zIEMKtOm0s; zM+#ko<7l>yJroto8K4E4j=g5ctmYp$qHVhfpsR|iJAd!bw4K6ik*-6*OJ0Y|6UuYH z3m1}jZCk%Rek1z~ic}GX+5ZU8dmaI0I*+F8Im?@gq-rJLUmp6Jc20}TJ^xxH5w6Q) z6=v%?gg<3cMAotTMS*7a+SOHs93xP8T26q zaAeMhFV~t^!j4U&!B{|@DjWYsd$o$t+gK%aUP0rVbUl}L-=~JMx)Zz698}_{IS`^P zuZbunEnE_nLy*t5dxMhpb^*m`*GN*{tEr7dY@worTM7{6aX609wU{jcq1`-k1Ky=; zRB==Ydqghw{3{FH5!-vO@FT2jD{v@yn1zYroSq90V}Mq-%4XmH(q|JaRzsV4YE6AW zh^ogAFK`zA7bCeUTFcLwQM^Jesf!lcqXwh5qTA6}0mbd@Q_V!BK1wNtBsi8lkMSMO zfx2;~7pt_3OJ?m^!xD2w{59+-a+vbF-2*f zmW|E2M5zv;!2!2Fw?Z43Q!N;x=5CK- z9{lr~$k-%tSkFf7Bu?cIM<&MV>RqiU-||T+VGwe_K^>;ufbRGl+_xW+eQvU$@bu`V zGN*gwve8w~PhNQsUNigd%pb1v3pFL}of07`Y;$lt&4W8m^>gN@Ac;dyP)KcmHY4*d821tZz8u&z^i ztwu-oVjrzVa{~Vi1lZ#$w;6VL#FGa@`s*)NeZUqp$#h1tWWo{aSuhDl%S$cjQ$fOA z!SaY$RiET~hpV246@Khpsa7Ue^H7Ph6F`HnB~JJR-~DuS226qhx*@oAcLQFvu)d8{ zO1KZ%;V87L8a?10Sn<0gAT0G!R$}r&LC78#eR?R|dKxPs2h-A@ajukChPQ{6?QAPO zF@|$vtD>erN5Sm5zu_@^IBazzlv!T5vWIraeqsMi_(HSCrnjek8g}Y_R{dd!vXDrc1vR9r@pRMUT8T3)7$#yf>&o+|P-){3 zE;l7U#n@j!BkgJOWC^~0Em<fC znZ*t08S(w}#44RzRs$wh-a#HeT!0DqHM>zWvEsKy9ljT5Yv%xwVB?RSPeHqN#Ob8m zhA$RMQb!O)I-#hnImI0P_Ys-C(FzV39kla zJ9}5BlJR?_*Ij1h1hWf)XjL@@&cGkOid_b-gGYK!`t^A(Igc0`-T10Gy-RwF^t}2& zK?gn62~cPwAup$5J}}%4qA%YD;nO4H;>A*eIy_@3gF(i?tPrh`P_A?*6Gb^BN~$Ec z%ifF|@nKdHamG;uQb51cskO7x33FfKer1QBqDRYNrQTH(7zo{@ALBP4EmRyPDWDej zFFr-d0>MT#TxNlKI&IK!IGLlZg;GdLq_FumRbLuF(lLG2{TlG zD+=_quFxlT?cvYXTMYuCK3VBy4g_cqZdd>1qpT7QRN)Ea#VfAJYN?KJdmQ-TRri&s zH*!VYv1`|z8j>UTR~FHpbUlOKQieF}gSdb(__|=e!BKvq=_@&WNVj)3%H;J?V6<14-u3lbz^+ z8)l>Lio``F+iQvwu(dd;48w{(s6$!F7zNVPWPAHXlc=Ax6{6D3jO&NI5~+@lfX zGLmiV2nnQJ^pas4w05M4JzP!pQI@I?1u26awL$ScjJ30)J!ANuB-tb2Hf}cMwA1&S zhh)c3>fyMjW~KA_GP(7eu*+hNJfh+s9V-V=Pk*pKl|JiL+z&Ydj&5!^FT&(QQ4%?Q zl>KFHjM(3KL&%3%eVVJ-I~Zbpx%%{f=zw?o*6f)5VuY(xnwDK%Xa~b|v_<1kS9op$= zyKT$iT?VGUAujD#PE*|qSc@u;CADbhOGWWuwNz;ra0E-}NbplApyRA#v^_3$&#o@) zH<6Fm^2OArZAEi#+yHAn?x}4#aWo!>QS$p%{B+k?)2&G6Y>q$rBr;7ld{<@Rl764dE4;aL*P-x}`+o3Q)TlA{jBp&$KgyFI=jzy9R3&^w zYGd2Mry-w27$;V_6s^s1P9?=`xnGWaQF(elubt*dyXZ|Uwu=gOxZZ-@-X>PRBw2q# z1qY^=NY3uBM+Rq}ODI)^4Bul#x^Xwxt6{D_2hI6pipLbW_9KM!6`R2`sBN{74#q>P zfW>t!8={qxx%umeEf|HI?QCj`THRY$T9<;>%)LjUiX^7c*%am$U@f~56UT4GH%J{v zjq^{s)#i+Gl+Z<%X3;zkuZ$xyb-I=sueQXSSyYS_>PeuDro@z3bWryv_o#BhID~JA zmB~pPc@F&bA8n^`M4#H@V_Y?azK3VbQQU))Yc(CQPs)i07+VrR7&J6pN=o>fu)o8R z7&a&*c`))soloVrALQ&x45`u=oxlCueT^Ef?z@f#JZt5yAZaFY1779~I}-!VR@@3K zanLEdg+y?}&$Rh+s_%z$qNhJOhu}_37K=$N54>sDNK&c-c$+Um`ds%(V)R#7uK0uq zIJ)xxvLAiZRrTdC!NAu8p?k-CUHye_``8qIh8H){j4OmiXET`c-0emw7A;bmVz(D* zDPdTp0^77vOZT#d#FnB=2nye?YpOiJDUdkTYfSo;z)&g8q&D$GYp-BB@+8F?W2)aF zTE~Zu=W=UT{nq~{kZE6RZncR?kD5?>25pbu`|#hE?2yg-Oa;3U+1%yaOt09&ug>N< zIQ)%B@AE~R6`ff##=RArC_5xQF=R0T7;b`cU0GAT5Mw`M!W=((5d410^nNP&sMQN9 z5Y;o-WBeYHHyg)4j28RuF2tw@x&lNT<9%<@al4qw_QL=FSbz-3S4=N?zwpa&`|n03 zrdv%D77&iYbnJRWY$}Afz>9afB7e|!I%Ii2-jo89oKs-tag@awePYG0(wCQAVH^+{ z?ks=(m-ht)2341YBGby%G7o~-x< zkh}zT{f~j0!Yx=&GCk1u2UKFTe~9MGk;+>$pjW!$EszlxPzMZs+OA z!NC8a=^UdY?Yb=*+qOGaMIFDfZQJPBwrzE6yJK4&TOHfht$btLpZSxKRHbsBv-ezc zRR?GV;F zzAeet!g#0Ct#lVVeU89uo(mHqYUClR#ZcSqsL-`ahAsj^1YR*~bUymifSsq#BR;(j zjeZFSZtj(n2D6UEo9d>$_Wu6QeUEg(V=cNAaUwky}W2 zt^k{5o0D&rTjc`~Xy%&@I8m@dqEz=YM|p6wD|x0n{UgYZKN?KZJ$qwm=gLm+GZfs1 zVJ<4>AwI#|8>y&CP}Pe}t>JKdB{N}@SUq}CEuL=htpCufd{{T6BH*Ah*$xBza8=18 zg}uXIrbNCLg%L&QhOwGsjonCIJpWlNs9ulTsnoo-!$7+p<_V=Y(P}|G5-38OCGeNW z6k@K3v?SS^OFR$b7HdBLR46 z%c(G%f3FMHIRtc%U+`AIuHr=r>)xu~rw}n((fNz{q;+fz?Ki~e@FTWZ6=KL3d1ttG zx`YrPCQsk?J)xHHXk8hU!n}%Avx$AE6Pz_u zXHlNcp%J-c$089`U~U|8wB8id^~-q>OHK9dXU2G>Fxx>B%8X?PvNArtK~hEYr5TTA zkH^wYkaz+SrqW_{tsIP)Jc~8?M1tiIR*OCFwWanV205ercVNZ>h_s_qG`J09 z*FJuWalB_!ydy4opTCv&EQ` z)zsaoWy2CGmpQ_L=O3z{KsgkCJ_fT$(gciF0)wz9W2(K;RB$wGMN*wc_PYN~3mLQb z>vB#C2Xu+$G=D>n-n%Nd7KHGU7lM+D=hxeIE$4Va3figCr#Sql>b(SLh91lXv+bv= z&~g*p`-dl3OCCw|@^qnDb)t2yM*yJL+=8{O_NS6_i;M=zniDAidIoRgPkISiHMVz; zvr6?sjqlv8@vVg?>5qnP$@N=!PM9v0#?x|tM)?uj{Nj?Dp(A^tN^1!}!j;gOcTx?_ zS;MmDA+)Wsn}Rz}{R&0u=_XFH1HefI&t(X~^HyU)CY-xIpfvgs!$om5qb?Yn^es!j zR-nqrw}h06nEcQo?4RUrm-%R$Rh)F`~+&t1+{_WWnHF1Aqa)+~4O`rTMJUMf=Yp@AcNUAjFp zVi?-S3En-n9CC~DKGHzG{Unuo+V1h*n)xt4&816hN~{201KA&7BA#2nTrZvCj#)V% z#kVPKIXMJX<;vNRC|k0=Whc086Z%N|FCOQ-S)vaD0E9>HQiAoJcCo$JN#V7icZqC} z8h&{Z7p(E>oOMK^Ug_Nco&((nWznE(ZpqeojaBc$sH@8wj?8q|qodVhv68(7#${~8 z^20W$c`0P?Kfc)tPj=S)J?#fC!PP7PYxgxbcY}d5H0-nXqzv;=ZO&f89M(`tO1gFFnQ&c%s+=Y~;eQ9g2A%1%Jp_h`jyi$Bz9mv>pu zt9mRWBV%dvQ42my_d0ubfpJIQxa08pw(X_MPhgI1yvYSMvyrA7lWBz=sRlT_RfniI za@hgpn9SIQw}#m6JHNN=M$@q^8mQaXmId);>H%pBt~qJ?%dKL2-!+CRmjy=c0`ec+bntsZ7~vu>JIQd}~2pjWVu3Hin=Ol?y{_ z3%<9ka~IFT?=!HT(<^&5)q1Z)znhwLOjJ*b8PT*xJ|Avw_p%5y}|yZ3q_noV#VtP=1_pjKj}N%l?#P%tYBQS2}um%s=P@o z4}&nLc?&YPj7rfB*JQ!9i~1Dde9m<6+o&!^w#c|qqZRs&&Ij^o*{Tc03{XCSjZ~F%Aq^p4 z)eX-*wlpd2WMt3kJ|Ido`~M-QDqzu_si~=bl zRV1qgZ#!$vkt(DKf5<;gfUSappc%q&!YpViZIw`+v?H&yJ$x`Sct@ABq2AmEml;%H zw0SJStZf5cT`zV($S^SY?RYp?em4vz!sJYC-umFgp9eB4JbVjy9Cw`MrG-IZw~d=p zKXQNvA~zBZw&U}%S29`mtmatg7Szy&GH!H64`GxfIhaammFx;vXTykfB)%oVL=7E+oU61CO09 z-pL=IF7gni9d9NJj|gX%Qm6%j=a+5u*sc=DulCRuxgbbA(K#};Spx1ICwLDj6XR1Y zGR=Ie;^JCJCuk~k7I1S>s*~r|QYx*m+qR#|Ipw2H`*ZaLmjjb}+ZSBjQ+v(5O9fhG z`CX#DD9Fb+N{|8Z?ZH?pLTh5IeH6XB54H#saYweG({i{B#2zRm73mOF7=9x&*5xmR zD{bt^jZWw702kc^EXo_iGtzKRq6WU% zyJa3&>RKzLPZHCvD^8lgj*SDxN?$(`Q$q(wpk2a6l!?*I2lJZy$Ea!%fn`mxx@zMA z`biWEock(5z9l`eYgApR`khx3S_BuvOr!;!2Q;+W0vUIA$aYOx%T9BG+}!D}i~Q&3 zdCv~bslLai9$O2q>L}U}a3VsJQiV`p(75*PCHKoCL>=ISN+{|Sv8g=$?WS;Px_Hp? zl;0H}t!Zq`H8kt|&jzw+qw!!>EdrEIse~tmK0825WZ$dr#O!B>=8?ma|0yITm${9d zSuT|p@7Nc%1s;e8qgw#Zqhhtv3&&(d9DnKyUSZF*8Ubb_qmbq^$tm&YE^!UKD=~v` zb^z~S`pPo9v`qVwPP0YaUK7l+W-zfnjIdR>L!G9EqGobOy8ok9QV{-hKE-d#p*pgD zp`iqWyEjb3U-=dPy%tyISsP(!6Nu?ro-I)mST0dx-A)hP{I>W2nrW`T$;_FT?3s+G z+GEZI1jm5&Nu=7W?R5@4%e2x=?vG=xZdrb9u%zlygOVQ`%9`0}2_uCMW;1mFgW9M9FG@Qs+!u4J*>Rt<5uY^9XJ1!J;osb@> zNoXjSP0n2@yalF~fDzn6&ob2_tBZ$dtNpS_#+QPXpJXT$Ye$cG*XEA%!(bu^My!|w z&EwZ&2(v(?n<~mRw34yn*_LZ=+jTpFzP;veaaBwCyVt?P%foYv9+)L2;iZtI;9rQ_D3+y$6Doix~Av zeFIp#WI;=q)#t(Ca6Q)eiL=cyBCTMXEnC)ht+RdEI=c?d!iM<=2qvD003nCan)Orx zFZ!2$?Cxu5-yP_`*ngJ5=9(tiFCoozNuRsSS{PUGXDhBfsk-WGaJmxAcN2ckGgh?b z9x}2TE8~7dpIhS1?-Q`9+m~RT$q{-eB*elRxa!sq35A%L*0&?U8H^&@M;aGTwT&-G zTu{dw{wl7<_bqK$EJ*oR8z_*@+4XT@*E64US!C6G1B_llz9ape@(TTx`Etb6Gqsad7}xwq4opZ{$-!d<>I4P zAk8TU^>xwn(He9Gw4l7e>s^D1=YI=QCRnLQ{*&-}Y|Q--)xQ`0PEV*RWIb)aPi?;g z1s3PPU3{J~?ANXSr}WKtFt_YE?CY8s$dmnK*FWN)Uu6O!5I+0l#4i^>Wc$CDr2kHe zp4EL1)b+Z(U%vP5XY!)Oa!w=BZ8A}qb+Jq}S&Fv~A~f(JJQE~VHZ5o^TF;e!54E&z ztpHMy%}AS*_KP}90EW&U&Bq04bQG=qAED(3+-U)`iM>${PXj?5lv z-!r;K+|a7~7+cI|pxB2UU;FJukT0=bhNek(zMw)1zT_2=kbF(U&ZO1N4E%?78N*%V z@%(w`P57xaSWbaPqB!stU)L1VTT& z&@Yo0zks>{TKVtyn(bob&+-0B&olPdKj52Fi}dQ%^W@c4{`f8XYRzoe^Znkq z|9L%#r5wdeR7J5WDp$=zbM|NR6K z3QAGbus*(kYJqIZk&2NRJ8xqba@?CHUBj@R;5bq^w1Q(bce)}R+J?BEM6LdM?M0$b zSa=2}&Z(o?kLI37^8aqh*UF8$fMSkfJ~;8LEdVc`u6Bo-NNG_`te}d+F;~ja=xJ-O zkrK*Twe*4fr#cF7HPUDTro}EU0ON^Fm@})N2Il%NE!q!fJ;RiEHNa?-`K~}IA5xFu zc3cPV!E>TN*^x9iB1>%$tKF=~5_O(}o(fxga&_qq6Hp0j9nUvoGNnoY{4lX;JwRFb zeudgSL%}ly@Ag#^6Ulq1xB#!8`gf0`{Zf)ekf9zIweRD#8hBj?40iPtZ@~StXC;03 z!-Txo+Whqy-aR~);*uo+X$L$EJpWdxgi7gWaQ^9g1DO7*V=OTQepHr zk5iqNwU_H4g9yU&;-Ezas@0YWhz68mL}=~)B531A?lyK>Is#f65$ z+5Of+E(_a_E{5T;h`09F_w7^;smZ;=^1?J<|28EPwu1^=RfBitXi+s27AHqnR1c%* zIUgdF@bByTtd3@^r}7jr~Yv zF{+!YW*HQpu4}FtkJ!e*RPPlPu#dvuL#XAQ8lCZ4m$3Mg@Sv>unWyI%KdIzLv*_VO zQxwLrv}hwj+#*#g*8W4`#v3~cLyCJ<2BVW?1WDg%(;+h7MJ2~*)XKCfDGF9fUe^&# zolGSO-hyZiikJ-_%!xB7ocSAE5X!8qWFR_dZ4{V{@F_2yP_P@5|1o$L30GN zx|rddb<=i8GCW$TSO}_Nsp+5dYrCdEtWPY2>=1@AM|3Eq@7zXR%SnJ5^?+=W?EP5? zVZrC>ZU4sI>$r?QZ1=Z-EY?QTjSJl(vy5jzGWW%%@?T|B(ZBK1b+U%03gh4?2@e(X;G)%3##U9c zFAyLrcj;&L|4@E#^BA%81EQn>ty2T{mK*M*AZ98R^pj9ks%FU^GK%BR zEHEtGuAAh_^oca4ubiGcx8GmyNAs6I0EHN&+~Vb9LYysSe^#uqw03mqqsP`TMSg2s z(vlwhz!sX-2;fOEbi8^#21JF{1Zx!!#*1K8$Er?AQmo{}Keww{i6r=!E!c{rub**D z`*v=Q(|fL;qg$kU{xPq1Szq5;dP{9yI-;-3G=Obvh6ZOwmX295B-XE^6m4Z&KP@3n6F|sd zMI)>P`*!M&LED|wN=zJTB>kup<>49#>)F)}YjBPMLO#fR{XFvD7OMVCFfg{}o6qj& zy8lDr?IAYF%AUZb*bOT%X;Du&RuBUaH3^SVpnq#KPY1kr3*aQF(t!=cv^J?n_8^#t zo0Ykt&D(7bwGfaYEe8vykK?@NjB|)t>{#2Zd1rx6|E_)MYOwF9;i#d9s5L$|P}hP` z9k__}T=_+&4mcyTNlQ=59RI#IR^yp^EhqDo4!;5~|MlG0oaUr-fp^$ii_TqEri=Ud zXIuC7p$b&i=%TfQdvZ@6kq5_lzm{PENkZEQO}D_{-ldUM!Q{1x!p$z+SI%n)kOU=i zeSzp~O^;6FN568&FgKn4QBn9BWnwvjhCtWkcPsxHaSrk<)@c`##d5k$sOJ2T5mWn; zSzE7ic4T`%5W`Wr;8yGQtoTQUIsDQJ?2FD?Jx5M&j+Ku4wj1mMHc}gs6{b9?d<^r7 z!_XupzW!i?#xBbN?BYW>3520$>J1g%?JGcMVAh-7pO2tr$!drwTI)|eXwTf#ZGHde7!Yk+3>($@(fT;HsHL|l;+(79*k7w-6#UA9L9fP zfJep1vGWY4o&a1EqBBo)ABRF~KQhw;Zb&>oqwe~s;3&1DMzUjxJ!hg#2I{$5rYYRC zA3sj2*eI&-_N-d*TKm2|w)NFM`^e8lp$GlJRRGAF9(4oJS*4guU~q5kZI*(*Uc>0; zB{0%B2YiT-DW9^q(dNnLYnzbKjb5Bh^Bzmn@Jjd2ve9foHR7lhsm@`3d+vbNSu*QZ zweT>r`sMgiWzH8BUvJ%n8ydOf9CsfYcWBtb_Rj(f48G3SFW`wDUX-TD+lreQ~h;mD@Q~=-^ z>1&at|Fo5iNb91&HrFpn|A*`ldO)!IqfU4bB1TBKtO$l)6!SlsK>4eC20pA|<*>g<|EWKPXeR8`NK{?1sNCwXaO<%`h(I>{c;N!xqMhe!%_1iTzv* zH5f9n42WX~86BL}q(jyLnf4$xDxvXBRiM8gsnfX6hUt=d?#JkQ!yCxuzKcdLXypS( z*b)JL2PN!9a-pm)XEkP)eddEpODPlFBk&nq2&xr%B%p>*o4;JJ^=2Gho9 z!wk8boBk`GB5GZx<4h5jwBisbUo_CiP$?^UpiB6MDsGj>}DUuP|Z?M~&U6-fr!n$5prG zF#h}e#?h;?35H@0(|_$T2=H;i+p~g1XBhYWhIYZF7;KXV&MEkUNFucG#xbXCy^X09 zGpVxEY5{6Ty?3<8WKE2Gi0H7v;FzcrxcUd(ov>SiD6d16bq_g zxMDGe{Kq^lM=STiwYFOEG-_bHBID)g9u2R>yV7h1V!DNysQGLPrWMF2zRN$zIXD3o zot;G$5clhJ^muF-vp}o#41;wqFn3LFtOMYftn#a_#YQbwRS7*_W&$i|oTS#X_!o85 zLhC}dtypoS5FI%YrhIgJsSu@fqLxHN1YUW^QG|sf?ZT7vFrg{crXWW`?J|?zv z_STxeTx$rcPwKjel~A}Aj3h(owMm5*8VXK<;!unL@BT50Qw)S;2C;DxohIWuoJnso zCN`2K6-Y0J;9aU|FZyTXhUA=gMLnLP5v_mv^NU_-7BCS zfwHN)ItJ)OTp@k}HdHkI(xRy65B3AC0RJcGe=5AU332ocLrV!9yI5u;UD+?L>8?VL z@H1dN15c6bgy%pU1}r3vaS($OfjVV5B;=7 zIGIe>gOl8r9IgFYq(6E&oDhpKMU11})2{nJOqhY_GBa$<@y%fy`Yc$v_jc0HnE5Y4{6 z310GYWAZtX-Xqu^yDx}>J&V$RH)7)SNUEz&!nZciS?H@vXdDnua3j4PO+(2au)nOP z$2h<{ENEPE3`Oy^X1Iy-TqwMb26e63N(}%8aX1_)7_Qo~8^M3EgXO8M^w+MMpfarY zpE#211CE6LVue~y~t7l`5{)gM;;&`c$*FD)*Y zYgkzJLGDr)+iTLj+^5hV2UWrrOEsCc^K%mNJu&~cbu$0b`_zNZG$hM)Cu^Bo`+UyM zjD&hrIIM-_N~7OdtSV2yidxLvb3{MNZ=E3(C5)V6KbvQQ!Y=ZM=L13^+3Ej=>Mzax9?fk7`HuyW$JON}pgNShPHZuo@8vkq))QnFOe}pCgS|v| z>*IW?W?#j9_r-Z@-#TaBc;{npwf~z4#+f0GE?hPF$C&>x^Lgm3!v?x5fOQS`#nEy@ ziD8bKu-dj+QWld|>|&hN6r<+l<2}k*1Vj45;>h;ubI}2x}Zt{*AEdJ zpXlIQ;lh+&2DKqeCe_xHIO1^*Ztm~7>3SWkrNl`-q|-MbBYpoV2PC)~WpdlT?0N-F z&g@kstRnZNdKCQ#*5hdey=LnH)%C<0sMb^ZGWzSdHdVFIF3sgBc0`lghzpU4AK?(? z>KNKfcNV&}o6#1Tr8JaJ?~na>#rY4k0FHDGoz)yhRqHF~`s(YW=LmWLD)e7MWij-| zihSge<*vNYKgQMs5780LV{-!BMurY|Gz;W}Gl`6$RGrjtGZ4x&Ons3E1|cPBZ1XUj z8Rcx!Q&%C=_#a=YqgYK1Fl({i}0?`Tq(JDdUmr0{@O#xM`J*c5B!K zKEqC*RQ^Um2Wg|^p#V+N>&JB5ls-%bRAZ}jn@JBFv{ z`7y`U(-e}ZQ22-jPhdLDwToiSS}|qVQg|A7jt;gi+fLeg%ShC4bXy?ofSxas*oZ|= zYnhU}uS)le{iFXd#!f`%V3B^sIg3rcR1u^`t%VA(Dze9)Tpxsj9niEQktRo@QU4EO znnRH%kS{C;D@?HqyNI(vXEindnk144xjCu0w%F9dGP_(chyF&}fM+_WH+5E7DXa~1 z4vwik+;{i}P#s?oWpQ8=J!lYJH&kV5y#ui4T;||%{4v%X9zJdhXu5SPmR2!kOLMAQ z1sCHf8ZTfcoy;kqhZRLBHf>uhk$J?ZRJe5`1F9+OFFgRn+V$^+jFW1B(vQPC1rSEj(V? zxIQF=%3|BwA6KViW@j?hGPmEtR%0f8nlOX>@Cg-dPlwZusEx=&14ikJ9S@;-Y3rz3 zThP2Opf(dS)`9P}4THRND>G1s7uCBuXFJSKD5s9OXl$;HZ0U@Oc2)#uYNIqF9idbw2DV%9&v3lF4YCgY#L+OR zyELXA>xGc7iLg8QXOjd4;rhI;W2>YuYD9)Rm1`#3U=o%|dhA=HW)?;S?ik&RB!ASB z9J!rZM9*elNzV>fVQ8=(+!Xous3D}sbX_cMAH~5%RH%{+ms0OGG0kF@_J!FOS6j52 zfNfXm5fs_o->HW&I3gyr#ZPWCC(EXH^xsc4>C|Vs)PlV?{u*Kb-lf6=e>u|P)Tpc>-HE| z05k>nl-Jfjor}`v3jYCyaVD>wg%8W8u{?7&s~y&;07xb*6iXLyfp#vqV4^bU)6EwC z`AK{`iyBcT!$>9sa;NH;ks`E^gsmZJ;&w$3PKegHxmt-)IJvEyFFG{TreRC8j_E6s zn{tx_o(d}}Idtg3$AAv7+o&*6tSlOa!SD;~A5bzj)pbvU0Su4+sumy0%)OXtDk z2+=8^JnB5)6AFVhr$fib?c$Dh15R`@4E?uNhA$&R)JjtRg~U{M)WVqmce{}e+a_i< zJ99S79_gB|>MjOH^9dM?W|;!R4CWudl$4G7i3L$yjNOBG3}>58S03kA*u=li4^ROy zmWGc$k2FhP7dN|2)dd%^gq<0-Hf1_gR=S#}9dTj8G_zbaKjXi43I zsYU1Vmd4Yb%sDrwfyb1wXf9eqfG=M#u&%XLBKB|?b{SF-X;@}xu}{^22reNolRdT% zEp-gBs2$RDEJ{q`7ZlgM=|BTU{Wan;d@_w4JbOgm$gb1Nk0uh0pWo0JdBr*!w97Lx zHm=}?|5SEtvoD{&TMB9Fud+^G)M1?oLqk?K-?Mbf+9B-%O3a;Ga(&bl;`dpDs_tZk z;H!Zx2l~zKe>1o>$|SXm5hij|D=u{4&n-L!&ewKEwOzQ-hdbbjDO=~ap#yVK;* z7co7K0%DQY+?ctR$jt0828I9zC+>dzwOl+FIW>~Qg_t8aXTvy3j?tQt0>sS@`9r!x zt8SY(q8~b}!@VV37Ng_+jsS(91*aObZ8@lOY>GtJo=2LcCio%2F_bb%^y=0&(oc|c zJiW~ECZ=FLkt$cR2wBV|6{75kwlnm$u1)+)ebB50lOQ}e+^spC#=oc}R%oK8{(aYc zyhv%XsA)#00sAt{m7IZM*>W^>_h@RN_e(q@j3w0~4J6V}Sb>h=7h8vWNLnL!2KjviEnMe^^vAM&M{DNC2YA1jYAW_R+{8Qa z_5DG`YJt;Gm*&ZVCWaps&3B{GD}Y0UsEeY3Z9ZFDUQ~#ZBnHaTy2(#>1AktN$WWS?gD^%l?IX@yL}J2}oxx%;C>Y zkY{Df$+9c>*#Hpv)LA}NPj$6^RrPd#fqj*O4h=5F1^y%r-~ z9X4Joq%ShV4|$KFm6`^bRiBN+9sONoctIGDPB`jFFCCHnR%W2lkWn{xes6PBaKQ`= zofC%HbXO-TWD9NnI^>UXDVuy>Az7#iIv^ZvD5IE~w1o3(X)I%S&(TSqUVGmnDZ-Gk zFd?Sqk%Sv9BDHR0*4Ecl7R7)9K4>W=|2BffSDeyVdgY~p73CzIsG%Lc4l*2QZl(ijdsB(X?<{zG;THtM>+Yg9Ok!Xd$ykX3lq}S64}>vm!^fRq%Zxax;4yL9#rF@KNk1t^}zPn;;tp4%?Z-_ z{yJy|=p@9R3%n!Agb9xLsKvMmcv%jM;#z&NlNW?awej2O4r~zJ`!s+wnE%#yYcSYD z+ls1tl8Fo~Nh;=;mV0xS1l(}4Ev8|`bGYa|!8VP$>s%wiy}Z`_{MkhHq^rdYs- z1h71)IE_>NiX#+wkYt(jGj{KNOka%D``!<$n2jk1#Px5yRw^x#w5M1i!g5d`2+>3V z+?&hTB#L!JSYm0O0JN?LhJin%{Lt)4cn9HZ+%5zzjE|ZB$kzO+QSw-fTp(+iH+13E zd1t6sG?=i5z=ML<1xMDkFx0RddFQ`tLwnUkn@`(_J2@Ic=kS~|#xX*c02lAjt3RS| z!WC_5_2CA4yMc~`6=Fv*gis{_$%elbFrW-a{G<($xHerz*w4@z&UQQx(NJHDS~07V zjJ7O>m92;`L9ElMzZdGY3(~qFRB<_zYz{O~98yVr&fkkkWstO$IoQlSKE8mD)_Znf z+08R}T|*|Ee>&v|yXR^(T&Fa|_oM2bk}F>iUhtbdDMVWx>o~h`FMLgW8k5Fzs^ESI znL%r$>NiAquhp-330?ok)FrB-l#4SkKeGr#k(#)XGA@?wXX*fxZMEt<5$78V)Qw8acLB zk_O7EgPB_awy8*biPcHgHQH;@ixY1MRR=NJX9a-@n+VS^b^H8C`j9fNSh-B>X40tMEsXv2SP1><(NBT6xmiaZeB zZ41L=-gdTOXFewvvo-s&mwI8Cv?EvaPvp>sk0JH0r0CxPhB7rd1_WWNzGcWb$C=s8 z+a(Tu^N-1OfDQ@4p3^DU!SBuTGwOQP3h*y)J(U|}dyG@iMf{I>=hjcwr%_=Bmnt0Y zexBAL*LsLB&J`V|303JH6qPeCx(}fZHo@{nJ*$fTEiB4WUNfwVaZ+_k9N)iHoF$LA zE*{wj_Xd2rI)$WC0hn-s+Rj!oE1Xp6vzAGs0j+>CArJA&*Rv-0$jJ1ndl=k#0{-Vd zcFze56$TigavCbQpf*qn(#crwiI)5jwVl;u zmdkn^6Bw(ilVYuI6|44|O^{tw)xVlZ=d_TuFDoRf;vu*U+FE$wOAY0sI94oCE&O$r z31CP==4e7fR)+5ULBV@ypjV8N*MxR1;K*I*u`V*7z+UG5WnqaU4N|?4b3t044gQ?1^axdFP^qO`A(i6KB*4I_=x62Hfh*l*C83SM&^;N z7Y3!6g4It2po_RP#Ahp&HT=y!V`df}R9B+9y1u}foTorOleLQPfHOiscMhpJ51ZGc zEkUJ81_K)U|Px2yNYDk%lVK#Spr)^cdu#T7v;pW761J(+x zR{#2h0`G0_=S|R>-Hp{EWNnaK9W^mvPqU+8o(sUnu-G@4)o?4VePHxt%I@fBe2l<5 z$867))bu}_AW8qBh_M^y^+e@8D@a41M9YK3StJAFe$So?C0DNC9Uig^1WG471TB%$ z43(OjLBTA{mF`*dg%b;!m7M3By11D!tVZ1GtW)=HNa84N*Jgwf=#5#J=&L|(G@Aj; z&80G=BQQHIj%nv+1w)Bf4cq*drpExn-8TuGQSD|j-gusjq_mG?)4&FSU|ZhA)W*Vs z-ut~bz|aQiC=+Im&ab3>Q&!_(G@5BO2`crhri30-PHNq?k7bznYh~=F6lVpHJ2%p$WLPiCs}0m?GU2p)=gt`Jmqk znScLaN=Znon}lQh!+jfh<^eijhl}{g4VfdHS;AlspS+~jsl2#o<6SW^%^QXynD!L- zNNf*+sQ?U{w*r0{>@V6Z5ohWvNm+)_%oe12VZDs z3qj@SS_^7LwB<(ll+(>@t8b5w#-W(DNlEVFQ1{ZWD{Vv!v7oHvaW8z9pZA zgRHX2HDd`oEV~=+ie^{<*{k1ef%A((bh#K*%Zk(@>?YDpfPBUP z)1531H5v#Cnm4Zq_a+R|qoZ)s%QeQg90SmiBx*Jj?hyFRFuIklx;S~5r>+R0Iq4%X z8xf^{Gl}uf*!GKt!07uX6{)r1+rK6zL=6$ z6~%BH=)ky(&dvSHVjfHvvNg%v{m6p~-CJ|K>_koVOAU?Juyqp2SvVqzxd9(5Gr?<*2EzAT_?uqC1-A;WH53)bHA| zdU+t%cp6-Gd}kV=+4FJCbfP0dzNpYYIu`VY%2`De*c-#0%+854LH)!YC&IW5b0Q7m zl1VpVFBtDSMqoqCks5xVAykOCtWtsDHmkD8o97+qZi`Ia9-k<2C78V!t1k4}z*B3& zawqVZ{nI})7ckFs6RfwoVm#aFa_S`!lU%glXA6|0#&%jVRa~ZU0sdNv;T>BY@6aV3 z+yS#ABDjcnrisJ{`th)ddsccB7WEfa%ceK$g^vXs2)ej`NGd)O)e5`z_9YmEE0nHE zPs!>r@Sh3yAU?@JkmQ@J0{lE3?DL3_m%Yspt%5-_L>{oMo5<2tA@+=gy+3rVA^GQ( zwr8^Id452XUQf@LG;Yyc76juKklY9<{5Vp*Lvhi^IK)D@)&Ze1(~j55DEym(nH64G zl!&^csFI@(E55H9lAL=7ZlT=iB3?NaV?2lVD{Iv0lj>xD?1M_;~9lfjF)pnIe6Eyiaf>A;2h9#WDsAnKR1(y z{?IC>RiH+t199LWZvw|dlgk2=f3qtM)CN2OvnI~fVwkHr_c{tI3M6}8sx{dx=rgO) zIdT%l<^^TwnXq0-E0C3#;6BkslouV`MoFSa``T=?H!@zQ+3t^W(hlw4RO}Wz3FGrO zuQw#Qc&Sy|b+=E3y4wTHOW8b76b2YbENYkm&J;XU$Q_G3ik*hWZTE~REsWoytnO0V!LzH9=WJ+y*$Ir!N=% zCl@he^wGV9^!dp00wSlJDUC72gdGjic?}#ydlAM&T&#`$Kc5p=>YTIaNZi3*Hv?5( zMymI*@%X3$B9ai1`sI6Jnqa$}Iz@}_Ky6|g{SWy`NCEt1a?03{Y#=ef|3Zg6`B+fL zQgM(QU>33|dKr&}5T8vtYy1PWdJ0;c7||lO_)f_)871^jty|5(U}h`h#f=^`gii+_w(DL>5FV@?z*qUPgG<81%^_MJ?4a>Fl`)+MR zGKU&F@@KVYDv81QkwoLaCJ1IP1OM$C^Z|9^wpH@if&v`J=gX$g_ANVojLvEUm9U=o ziJm5kR@GYsFznwJma}XST9H<3C>f@hrH+Q9<#~{36J{9`iA^|V-sEo72EHhIRHQeK!lWy1WVCnM}{a1!sK5X79d_)HpWFq zNIaqUN&*rYbZ5yA>p4*;j6=kPiJX{9TN8gEgM+Gvo1}?@9fybDa_17T(W@0)Z`uuZ zYl6!Wp;wIf05Q)mpzrnan=0=dgR7$hE9SMD@%}j*SUnX#@o#m}TTg*}M<4q=bJv5%&=yfyIP0P*fMs4J1|7*;Zd@xuq2(p|MZQUm5t z5vRTF6bqhrzY;_r%XHLaK{49})lpklkLi=6H3k5`JiX?~$+=oFt$>MlHj!{+ z?74;Oub#>1im8-Ih3UCa+GF|`M@VXb<)5@rd%U>Id0@@?LniQ*GQRp&pa8qBAjQy1 ztZ+VhP7S)Qr$bBXKYlxo}U5&`BRwC(Q}%V$6ny$|BdONWhP&4dVw(1_nL#wNAVuA$is4+H3d8#Ltv#Ve{= zhg*k>-x|pOu}8H+^0)aDF`nn)YJU)gjsQ=2?R^~?ams?E8&mh*D+8mGqYVs>KQ!xU zr5qwHg0#$N1ozQsQ`*HfP{^FaPrTHNWKkLZj8D$WzDw1BaMG6h0E3Zw58pL;K%^&W zr3P6|l4%9B7s^|fy>v?7z~Y)JENK@Wf(t#-D86D7voT{fjpXs?*Wvag5qlgx=!`GU z!Z;Aw|8hl=s-8uWjr_&9?(lZdJ7lbiDIuQ*WfjxS%$8}fJ8#0U%@`Hr2V@CYpv^EBTusrK)}pn=>7qI^BT)se`htJ@%tQ5(NGShg)oo?F)3Q^?e(cuL zGG*9MY%Mz7fcB|qh-5B6m2p$21oaiX8 znG92lLC)(6P0I`kXDtS}%j_!BDLw24(H_2Sk`?R2^I}b6!GQ=TWlL%JTd)shJoTYg z4f{m_kqa%RP<=>lG$YcS(3|M3GID{i0D+w}%&n^vC+;l6$k|3}j~M#t5*ZMbR7 zHksJAZQI7gwrx9&ZQE*`G-!;8(b%^7q{%n=)_VWV-%?|Wa@d7Ot;&Y)F3(ra0o zg%|{7ZEM_wJTh0H`Ic@#R@QjI%P>{#;%5-Rh1tR)Reyw%m|{$zH$HhNMxJ>u9!kbp zbiCe6k+y+&DX3h58m2wB7~1;bI`HGa8r%lIL%P6!D}n#Ul>%HmOew(+<$bg}oy%o^ z3#q>y6SE}>WJki~^a`lFO2t&N5=l<{y8GUw|0*Z(n?YtTE-r^eCKs`!5jWA>R?tJZ(BY{(6pP#Tz=kLuiZ* z!=T}Wi3%9}!h(u`XGMppG4aB(oYd^1bY+X_ues?h^xGfj;CxVyxL7$KEIHs6Tn_OD8;kE>& zd+;a)#m2vKJx-11+lK;zoOEMBssNSDRNEZNcDC&+ zXGCYZ9V)xpY?F&vvCZ>3A4%PI6YD{<54Wh0n+_6exdR0q$DXjjah!pI8kz<&gGCW4 zZ<{OW8ckh$op1{&epsLGXx^3|RURTL;{tXvObZ7yvGdHf(abE-DxB_$W{G=ugf?_e zDD$r8w3e5MObb2TDdi2FKvA83c!5+Og5Y(%_}Y|q6l2vX67u+hum1A% z{~juY>_r1c`L;mS-hYD-vyqaY1`TTNvSut8^c8cg5zy#7aAR2hj6|oG^nq8iYg`uU z#+GnPl!`Lp6p89FRsaD;26zKy8ghTV>0=P(y?u|Z$4sJDMSBzjkCf9{m||%G;sY_T z0&psn1GG;S}^(aT^-g)GH|h zoey8_;YEnW_{4}l14mmo5nP|3R3geyewzC;7Z|Ke2zV&T!*>n1pbFTd z8sihSsI=TftWyd2Bn+#R{9`x)Yzjkc`L{?D3>P@E>m&1wMtyH!ChjJb=pxiwwFfL* zwK+)bTjWOW|246=_xc)G^phX!!#M7|anGBEgB4s(QpcuLu>)Ot`ZYPvnX zo~BQUSCU>fO-fIV%flmP^*mnUjWzli02I&U_y_hYC57`g?6)kKjqhx1W&A3J$L`bW zJYnB#PBIr){GGl6zVsbO)Cp1&m!66KYa$v-g|hq)rARv)Ng=u_Tbohrm;&q2@56G} z-1%#M&ml^ECrHzg2&z=%=lmPEI(0DvMxnIi%}y}+JCeD|jZw9uti_q`fVwg~Q?4?N zb`f9`-ZJO@x7ZmLxV)QV<*rY&S5V5{C%isoi>9t_aKK7T8&%3K%`p4R>Z?^>&-xN7 zV(UniQLG90rIjebbevTSueH2eX3rdVF?2+xr?LJj>8VO!&f9>EXxH}fo<8dp=-x0rGxZf;X=po1>PrM&KD zNm6@JhbN<^rzoEea(_tzqIa6-@|=P`hnh>wY?E*avK&gpP7J#51z*$X!32b;{nfYk zop04tC<(pbS6MeNBq_ZO!;iOu4_8Y{d^J zs=~4qd|=m^F*|+d1uG{d)WKuN@zslAy6dJI<5uu-prV=#aw3JN0T_Ba3tfjYt8vumJxVEtjb(HSOh>)A@(W5^HsJv4fy zBML~PTTT}lt56jeav4VUDTlElcxBaVo>T+Y1VJH4a~VAc6xB^y)nJ%6V8Es0kO%_< z9HaKddRJbJSo*|8b#V;xeL=AXX0lInk%Eh>@ok!O$ZH?tLa$Ws&Z|UpICmDl6R%~T zsvAx}8MJaskMV=pkuRv1p3%0c4U4=PnNy_W|B4`qAHH5ke3cL7WB~GTi~ACVY?q+& z%cf#R+i}$%pepMIfL=}mWCxCS{9lGqO5r_N(MSghh0^j?51Ge{gupv3ZmSc z&q;34Fe1*L&QV~s+@Iy;h5ONE?O`PXlskZ?b))3xWPIbOhIZjN$N_UWc0t-4o`cHh z$1p88q-ykqKxa^5R^#C$6cj$++vfH^{cCf9_uGVL%ycC^D;l>C3-hh@=5HPg3S4Ut z_vWHR1BLuqstQF<0=mY#Oqcb$Y|UY`)4*T%+HO%K6@ZR0vWBc;W)kx*VN8`uxG?LD z6tydG-A6^yFQk6*S>Z1WWyOWfq$6#Gl6GJ7W%jQ>-miUUmEj+zF0-|J~}jhnjF2chOMVl5~);bR5a_L_#j5*upa#Z&Y0Z|;8|(hN3E z72}3r0_AGRq0%Br;3tQ5jLt6%2K8v*t#8^Cb_a){rHL;67WG8!o|_c>TAMRAKV+UX zB_j}SnL^HVAgl%jcTD@*QA-$$eVD*XH=!vyUpJ*`pTs4AW3R5Oaa{DVUGRQdke`xl zbK$oGu7mLLWYf2=>7_5|Fp3!cG%Vky*;CQ6eSH?qbWo zv_OU5ixK@zghnYZl8|rkD7=IJLK&016UA*V>XK0CauN-f$gW5Gs5NR+7NHeApW9rM zUY~sFw|KZqc*SjvenW3cBWIe#v@TgqDL*;QF~#VR{c*g zlW1iR7k!68`WNLAEY{}S6udOwT5uMNl`eO4ZoV45iOy&5iwVgQHPM8+%TS@Ib1La^ z(1Y9WnlivqaqP)J+(haPYBcBO!A*HL=O^u7TO^vj7PC5`HMGPkbvmSAwdAlQsU6*{ z>>$HZQeLN`NXzUgHF?bE_b@0UR3Z>+4GY7XX%W|34lYIr2kQEk$HXGnf4pyhbQk4F zEsI`v6l%C0Cd~G9nu%Wx(PvwTVIIRP6ihW-m>B=f?_Tj0XBhy~>;>nu-SSKI`rVQY z4VLitqk(UuRUB@V>GN6YirEUj)RDAUiS=`!{U#0SN`E~#f~jmyt?yl)V*-@wi8M_F zatqgTz5dvCCCV&A89ycD4_fN@N6)5i6yB$s=dJ+9IF#xH6x8M8HcNGQuotBTFx3yk ze@$WimqZNT)ph@=g>0HuADPW4(zFj&H?nQJw3*k3r#s$k9503t?1fOQ)}Z4|V^5S; zw;$!Ue!&NMz_z3rO7#SmIwcH5-)D9aSlAh7pgjkoVLo4wJ5p z#|i#J#yo9}(Von(d1h@ba}3%%1evE->aHZ%DxuTnrc#L4xKd@`Jh z!MLF&s$ZPxaCY4W0>ZA(MN3S9cYpQu%pme{a=2}>0QN#9&nD+$li)YrS z3&BFlEsBd)^msJt(5{hxO!1AsT-s80&6Xu-7Pl^qd){sqNTYeC^S8Kb`-i%HQnXpNOE`d{J^P|$Q=&cVL7 z+)pk2Dx2~3p^yi!wwXxlmC)-c-es774R2@{RR@(xxs5S4M6)8Xtz9CRiJ1T-FyT6l zN(s=jqk#}9xwNEXKKoZRkjRGXEXaniS@SPgj}2`A`oELY8F4S8u4+ivy$sbf&OksA z+6K83aiIDKwVLS5uLMRz`7cK6t?n3HG!C*qhmXGJq=MlKzL?*UVsBEzbGv__ssK5! zmAu%T7e%fK)NCY|48O4?-RNnN#S+C7;fXR<$w*AKTrtHujGfovb8JW-|9Hl%BFyGl zMU$}<0y;zUX_QYjc4JXQ3eCDY!sPm*hHd=yK(Qyu+#~yhTMXE^S5wU>Dyr);c z+_bWj&vE?aG_~9Y%n;vVhQSg^ph-^QOe9FQ-Hie$9*(IZA|VfzgbI`_Vt9OwMY;F5 zw8v9lpWqWcub!i>mHJvlp)%DQy))&nF5|K_AKIV9jLvQ8$sA)jMt?Jo^E`pGqfdxI zHKqX@!OdAS@2z|O2uA8rcOe#}uaJLS|^^Pp0)& zpbzOIs4#C&Qv3XDb8?4hiD%-1KJDA3yczq1riBpMI_~ZVErj8t^5rYN!^XIWA=Awd zUxw`X(Gl;wWS^e;f9V!oawdR&0N=7{4*t}-g90Joq#xxLW-N7ZF62AH9#})bC9>0P~nL|YW7sYXcVCg-Y z?YGv#$3p(%T+g<)JI;C&n|W2sJ2#5m>HD65n|;1w97OCd;>_e5VUm6VlhZ^2U5mVk$_AK|+1yu*4ZpCI!Gj}Lgd9`dqzymcr9wCmk zyW`PIZ1mB?NRd88@*D+56z51n2G6-B7=xlI*{7x`2sv8O?yoa8fz)nO#N(sk$K#FX z*RndeuM7m<`1_0>C%)(6HIoBmLfO`tR%Q3A8ty0!c-s}P-+SH7?Kd5Oe%;NA`AaiwGcmD1<$2 z?GZ7a9gSqK%TrqgZc=#8OX1PTGdHutapOZG*8$99v0A4B+2ze8RIB*u-!)Cx5y}b2 zDx{Vu9epu_>eeNpyU4pnW16E4zurghz`lPfbihTq+tE?ol)SV;6S>lEipp+B^@D%$ zUfr~yGG_P~m{&x2xXZHaq!dakt9O5r~=+1iO+#ptBoZ)d!4iRCm! zR|ooeH&8pT$tuk?eiWOMVRODB@2L{|hVcXH3uGRf5xN$hWknP~dxriJIXh|b<`@0p zrzH7dmxe-Ow~r}HL9(&NdE=S$Vy=i8iBvx+@mf<9BEF_8XX=E7akqr%5O0B4M|2Ft z5L~C@D>vOJ74IgfEIi96(mktrF$=0S0hB{7XU?J+c#|sBY#lOF1wdlGxJ*n|LfZrv zjh*@2uuFIXWAO>&#FP}s+`8~9jbm@cmx>>$3fa1SQTn3xR#>T{@DL&kMeM0l%%_|@ z?br~w!`Zh$|C`LI1hRHg8jUo)sDa5|vj}l2<~V3cDmL}v9I|rawoKioJx5iEfhana zu~ferGs;b+M+?dS`o%9krM~m+hVOrEinZ1sgzwITsr1QzauD&VTuN+ZZl}V_yVAsS z#;a0u$>dKXcqMBlW|nD_+X|VZ23zO0H_8(*xSn}VJ4GnGtxY9;$KC=pOT$d5%$xh> zz*DAYDJIZT;p~Fu;(182s!JuM8BGpD_%;8K@*aB2*T(1$SKb6nkp$7NcIzr+mfWLP z9+mP*{oebz1goJ-l29fm$!C)U%1oeYD|o`i;3IX_CZ{GcZ;wVx{AvG$yKN=^XX)!B z@VqoILx~uoS1d?tk^5rb$&hBHA$_6A>LU9JG>dPTgNEpd0cI!L!&L@f*l>`0k+>x8+UPOWW5)cv~?)NIj zLj2dl=}3j_@q_FXQi>82_MMhJNs5kuW{O<28Ph9WWcsF}d{u4{`B3>2Wf&JS>>7B2 zyXY`Xyy5RPR55B1k7A}+vG|RJON{1S0i2$3lSL*6q|i>O-Be-jw%V# zb`dj7QkDj$R%H}TzniOXK)C{U#fLd78?h}t<4LL|Ck>$)TvN-G{Lj?lQ7kUF=re{{4wtreY-e-PrFCfLxAYi2%+%U;RHQhNF~(SkCX!viIg6(UFI&Z%R(8#@#r;NkFyeBqo-Yfk znxPHvk8eaw>Xbd|%~9pA%HciSG)0VtuZLU3eQeHMqVA)%pzBG)w5^ecq9mSPY?P62 zcTFiD?-gut={n&2wVLp)f?qwCerv&~t4wdV(R?s0x{!x?!d7A`TEc?bQ2INgZ8ysJ zy=V<{Q-rf_mUZ?~(Ezn8bvr;xhgE2eW@2mbSDO&W8&Rd>#B*^F4uumhD78G z@DC)%SaCnDBok*pBck24OD*iuKdYCQaSS?HT~u>@ZVH_@S2X)G&iK4Jj;~{sUU-Y5 z>%)%bGm?;Gcxd8+B4*?v@v=v#$8yhbS$*^ z)3T}d^SD0k4reCr3Hrq=!6@kr5v;mAdBTL&={~{qFQGscP=8`e>m z1g_^LgCRAJ=7sdsA<5MJtr&gJ;vTD`4P>!H+pDWBV;-LtN^V=hOpLLM7e7 zcVpvDx-)c&y+;Awe$O*nk^l3SFqV5R;%n)Q3CY`^-cH(19@uF__9d_K*KMx6c05la zI(9G0jr?3RD^*|R+@$&C49&TC)^}Hrct7E={UeRb+x94KimDDR^DISA-d2r1B7tf{ zQ~SgB^)}lfO<(nZic($VH256$*01)%3U?z3jop2tLSw!<^*+k1Wz`&wdyFw(mV6aZ z>e?Ey!ky6NUAWgKp$UIn`1_NL_VTyq+jE2!oV?U&%W0)1(<@5F{f?2}^Y~gP`cgv@ z@^*GM@h_ zspf$d0mT`X{cKD#3_G^R5VBf*a~aehrC*9icwOBJSze^Dqn#<`24mX?X~i$gZ~iJ z3eJpY8TdCVz%P)s<_@ac!36;GlI@Z>y&C2B*uaY%C}9j zjDsg}dWC!(QwTblFk4=Sk@W#nP*tFJ4pE}+KJ&hq z1!cQnX@l8tCuj(HNG0G}pityb_(2dJGIH)W@#(!$Y(4wxccvJVpyU%-vam=l z$`Wy8QFwCHFMm0v{d`c?5RGJ&RonvIL6~#!rukqKSYmss(@*7vQ9Y>7Eu%3?a17RP z$XiLVks_QGdnTmG1`F}N^B@%c1=npLPHNYq%tsSORz~D1$SBFN4!>eL$icaZL~>!Wovk{zKw0y*s>_G;GFsA?Ja z8V*Afm1oITC3?Ai4)&%@m5hPpt1v25MJau*I$bxse|CRCz#{b6`sHIGD0u>X; zDO!{F0g|nONT{(P_-iNaAzKNJxsCuZ)Fz+&&xOxgH>y!Fl?jOsT>AN4+IN7t(7D+> zAu3X;%B5RI10zS;;|_i)v}+D0OGTpz*rxx7v$71}S$WHhbtoCCcNn?dUsYQZ??{sf8kjn;kX zmZwRP+%?O2Habox6*$6<%*EAhq{b)~S=n6(M~~1?In*dfHu<&vrkVmT5)P;MmC&9> z@^EtX@VornRvNq=es(8*Yl-w1j|jC5EzR$IO7BG4oyki^L)ZDT0yd_Zlb$~yvVP`n z47CD|=-DdYiaTFiwqhm0f{2+$FW>_9BTIM1P!QjGq1uA)fi@lm`&&E;FSYxh zp=W#1ikZmy23QxjM6%{>gEtJ+z&onIulAf?Ov#a>6Lj%l0o^}}}l%-(X9}CgJ7d zx5y(^b*QMZ!a=*O3CALQR2VP*Tbom1PFb8(dtaxGV@09;kWEa-z81wFHJ&AY@PENp zI0_kaeBT&WDg4R$Z5$#NVyi}F4ShlH&xL3txA-g09#Ge1ufA^-`5p&Nzz5Cf9vnwv zf-CD4^g**!wgP9tiGumXfE99sHU)}qWzaJ1m58`kk9$nBXYO$@cg6`O^-;=6y%(1F zjiggKg*K*HEd!z)b_~uY5|Rv79P4kxZiw#)n`Wnjuj|??X9ySrG(rRCr~G#k_2HJ> zUO$Qd)f9#6)Q5u{G~5`D8pr6dUQBzNy>z}ckM!+TJ$oscm9Uz2+2*Wx{Uy zc`UrDA8OMV4<(Q|jzu!ZocFlSgO_AOQLpvnlSA$5>YDIa-U16BqIlsVs1>U@E7X^y zi9n>ah3VcjxS2aFskbUjLlbG7vf~2>?cauoHCqYLZxFt%GMbtIjLP5`s8PDq;j;=H zA^`!Hs-w9LmwU;!qlP$@=(iyYcQlG4hNuwzvURG=yLg^(|REn}g`6#eo< zUuE3Oy{M&cTysaA6thp7QX%!Q^3u@>B&VYrIHSi}bIs>9oDi>rBSz?o(88 z1wG3#{DI%4<_$9C3=vepJLoT~&K!AG$Ek;8-$WZPV|_Z)nU+Jm0g9K&go^=>l);Dh z|3qT;TK#et;L^%Ii*|st4D&HC>>A;DqepO%tQIKXQ|LwpAiHk>M{)nZv?ot_=8njI zy_VdIJYiKU)Xsx`djm1ErC*0E8FTOglkg#!0ndlR>))c$%2Zgde;7WgxvXhVC~dVH zjhQD&|648zt#ApB*eFljS4C6S#`vRF=7!s=qZX(~hV77b(=Sw(Ql`UMJQN zUu-FQU0?5!wht_t@yVX|L8+Vg_BN4V;u`;;m=&=;O;91f+uDVEtEHb#>xncuPfDY& z^W{udYr{aJHvD@`VhGf$mPpx76vvg7#%+*cRpn@SYN9nZ0Wg7=yI@BZRZstqVh5uB zSc(70jv-vWm=X4WuM3kLnh2T|^qXLZjLz7vA99MVU4#^!uF~V$>VM+KF`=!gn0s2z ziZZh;pmt2c>B8&44G*JvcgItMNI1(GY^L1gJUW-ti+I`|_v1 zKm27S+C3kCT`A;GpNfGq-0SnW1U@sAW9-7Fab1emK0BcRQjK*>&L^H!T78IpOL>dZ z;w`Wb3)K~Cf8chImN!J>&OzPG5r~0<9cqb-Cw3DI_-EpMWu~eG_>v5U@?%VFa9)%H z?YvT@B}(-+rfJkf75WyGjuK^WR=|GVF8IgwrrO1;x(Fr(;Ua_p3LE%U#f}mUjQn2+ z1wW*<)^e4f*n0{N9D8d@n z7()vk6^uTW5DQQq5FcxOb3ai>gbS(xTu$U~mzC^Pb$O*i$}Y}*!XHsE`iBlod03m$ zjXsf9%32u{Yx1VF^6h@20nc44y-^IiU!&piA>Pn#E`op2&~Sv1faB@v=#0$SI@fyw zSYY!8lQ1K#)-z;Dj&g}RAi6JRUW51%)uLxc_K;7&muvAq^Gy{K3=8|(0NOeLWNcun z`b^>QLFwOc_u$BO{RB-cb_I>!5jrbCE|T=9x*O#s5KnRqiD6?N&HyUI9y*zaSbSZU z->`T>8ErhXpMC6dQ|fimaTuUZ)HLW3+*=O#<~=4x`0qr@cCzEgt$Co<_wX)Wiz*5PF$ z&ZFd& zoPtX6zP!p^Q>+AX6YG;!)SKQstlkp|(tz`y0q4PlNIQ_%g}i~+5Bjxy${P~J=PsJP zRoYpP!@Xj~1)njdaDlz0-%5!_RQ63el5DV=E#N9` zcSoOvoVb_+Nj({3-;p$K8f^GMaVSY>41iQ@ZRqS00yNzoSCxTIGbI*r-M+fCOw=huDS|Wh!>@$@~uX_~$|& zoLeiSwD{C8l$?cl!XaPnw;>L4lUti>ms!AJ;TIq8Ij5;cs?_l6;m;C&c_=i5PBE}o zH$avxGf?S7Fhb6|thGsfy4fEoQO`doR<}n+mxfyzX}W|OFbtwr3ng%CA%FE{Xe8`Rn}V`d}g)j_>TFBJgj;L>fm_xbQkWjNwbUZF+@gj2FW0 zC7^CG7}UB^Sbu`IRdtV37h_vrhCt#Z?J<~lhoEq2qjpN3@m3jRQ9P21-E7t>X2*Yc zNf|mRFrbw>8}QU}4K~DI1%LycAMejAL~;}}_SXymArS^Pw-g=B6*>A}ia}QI$D0t@SaIp%C&!X+E>n?`|Ot1J&`$$3hC_5(ByFn?N3roCw z=5`mO)Mq&>PoU8fA!~KD66IAM+`z;DtZJJ?yyFRRYZFfKRCG5rP9&C>c+PAwtBnfW zaS%xDoU*z?vCQgPrFdJ4eop?y9nf_OZIYAnQ5T2Gr;EhDyfIb1nC02(p&zy-2vT)p z?P0SD0C#R@0i3`2%!M|q7%lywLihKP2CZE5fxFK|3^(r_pTVY_^J|xkZmV$HAZhtF z@B5tXx6che%T~jpddwR?nqX^II_Y9 z&EK#iPOD5=yz2SRIC=tho7bX9FDqA^0kF9{L9}NNqhV(ntSc}+Er`IK8GsN=sRM)` zgfKs~qX*mr6#i`CVq&O3cH8Kx!xrf1s;6H;NKSL4s?i!q7=_qe0ZTA!*x%|oLcUq>IJO!=j0s2-w?Qj>A=(9sX5pA9C-oy}?wMpb zcaua0FU(D8ILT8ube&QX>U>=XUySH~KfjvLv#XG0qM79YX}b9x_#WLU=>o3U?zi!H zKxq55i4=MRZ)7>|1z*RN1kZJ5(I(|yfd`Aok?;lgxyPA7JTg|^|ACd* z<4W%bN@#P!{NRhV#IPLu2M#{pQ zt~3h)gfG|xD+$Tg%9*H%`(-GeclZC-jrwsP_^zZerB{>APf1K5AU$uy=hvX4ZS4-T zA^wlF)6>nI#pI_2!{S~t|<+?uLb z105O^g~8?af`N6B428FC%1zNiO1h&)mf2GOOOk&CYD~Ymmz&N-Bqqyc1hFrtte-PK zH&p1iqI7N&?Hib;lf{Ve%hO4dua7t2uL&Ww9^O1 zc2*`io%ldhuJ+nht25upPlCVyp7cD`zPHd(K4hAGumC#2w5oJ(;EEBnlssg zBN7&Q^(~IYshhy<|1(Nng8(}xp1T8aQUUAt^wUXeb$8ZC>w37z`cZ4-4CJLVmZHZ^ zKYk>2+V_)$_o$Lr(0-#xZLL-GDLHU_?tt$|In-a`Shrb6){9y>cU~tqL?Dj)APNJS z?K*8jGX!g~K|u10NO7GXSYJ{FTw8I8V~#XSCNba9M2dtXZ>a4*30p@O>yG3mk5(HE zpDQm`^@qGL+@#%XJiE;mr}(GU$f+z+Mz4dbMl%C{*I}&_t=5oGbC15RdZ#bsI$qN##DMGaSMHl*)fbgHAYJsKZm~Zj|2?z~uq;%JL;09^}+= zYtmUN*>&++{maeyX7bU^UY19&=ivU6z_M4xd3uF`d3ZUJ(46S~_1ONicRK0`HNh*4 ztBrsCrP<_6$dBECe!Q5#`{B~Tlh4O13C0gVD=P|cqABOX?LGgPKD&)t-ck-M&tX}s z<|AAyUCQB^JS59!P|A|~uQmE|!cMv*=X`OcR0Oe(P?vV6UsI~$^GhPQ zF1*3732YiPq7f!tF4^5aEJAg$a^;xZCUx|uZEN+CVelJMwN`bRr^B2RyXxtFAo76Q>_jZ=Enrd`48OU%YR>|p0>Cw(Rr1N1< zWkHYnA?3EZ<|2H#XPZYYh5k-jZoE3v9DP7s`Ac9ttEt@miohl*8vZww7;>HU&|JD0 zYXVl&$TGF3nE}*qMeGoM7540O(Zyz=mrx;Py6JA4)=gYrH{h9(wl~PBLRy}j#b%S* zRdjqy0#@Bt4{>fUshiM5& zPX0sATyQ;{?W1pyN#tyujKqSjjBFZ9pZw#V&8F|5J|e+}5sOX~3W?4?OOp%sqw=jj z+CZGp#RG@PHTZp|lB^wxf%bkEKfv2<=5w|6|JC!o)vZ&UacOpIo#$gP}VMxgd ze+3%H;MlPpPvCr5?QdQwQ?vRIrQ_XPlR)A{{gTiFR?r;={P_h#z}u5^Nc=&)Oakp6 z!4w(R&p5CD=-%sWU>}>bcTF{KCzu)zrj01t0QbG6KOQLSvD>_cfB<8{*5cinL5&vp)ET`&FJcuAZf}8$>gzC<|HbyW7 z`z$xALk9Z`-_t~LhggtaAgK zTqkO|u?!7>U^#E9e86~A?RdS#;2W|~$v~bwFshNj$#v3Ak=}dCtZNWO}4{ac+ZmAsG7uiDha(0U!Tp($}>bu43iMG+x9At!f$;H-Hz)gXY^j z1ydDmbaPdr02Y7!*|D%=PD`W?pCg=)q97c97U<*bHO%1m-JrQBgqj=qxgF*5^Yb)f zP$4hwRx=hu1egL3sj9G?>6xp7M&~(;s5AyjK|wvW(r26dVabRv&)P*NZCu5xzRVx zg+@OgTce!qR$kFWLRnA8`LXluo!H)&Y1eRWR0jBM*r~k{_joa$zpK|Jzoc8g5Pdtk z6&>k=i=o)_o6QVANnjT-4q+?KHl0?^Jg&RK(=>)Dfs;2E3HG_8*}!)EgYHLcWxZ#f?Ih6y0FXz50jBI|W&|9FyB{Ux~2N69rVPv6V~U z+{!!l$mTQMir}+%A_zExhunr zKllat;>z%DK0kjFS z&cG)2PzdKhdsOd_jO(}aLHRGN1 zK=K#Lf^LQ&ncaN-=@@lChM>e%o?^v{ikC=Drhy}SQQfjV2DXMTw^|oZTAqJr$Ej1> z@yeIZP`q(T&x8`}i2*oyv;V~BDvyS;fLcR4&0Sj0|H}f*w~U9OaicnS?Ao|(J>zif zI{l+!<+m|Df<{KC(_@RoFG-9yIem&wZa%CHKQ(GOQUT6%6>@+-X+!4)YQ+l-&K@nB`RI6I5$A5rNY;P zZ|}O(ZS*4oPfZDJ`|8=|q9C}t%Y8z(?4F^=izGL^GHB-3CS-flB)2kH1|0BQ&@DV( z(BrNImlr1?Z>DHK5kGp}`zZcYJIxAp;qDk|Y0*xCgUxaFi|^NJAFMA)*4MsYHpUO& z)zjRl7JjAVI*>xcGq_QGNt4ZiB)CUP5OMHpXxRu01oTf9WLa@p=iu~W$mOe55_fio zT}4)F_|gEm>^F-pZPr-r6>Ia;c@lV-sYNjx$t!|+O^VGo6Ejm}Wk>MGH7WT>`BlMt z(Acs`?Y^-L=Jh@GqWfDm!&*o-<7M%hoO|_Ti7y1a&x(C)*4Q-wYJ0JF9-eRjNr^rm z#KKKm8UtuHIxwMi;y@cgNUMEHftSpb?;IS@%)O+yH&BYs41S3HDr?_4kIa&jXf!z!0GQ)ZkW2!2N~FV^Ci?8@EK+3dP%4 zS5<|@&x#N&zaAV$XmuJ4;tK<%FGyk;ZeKKB-ev|^uJ{Q$q_;PE-gN_a&_;SST+n?S z@w%hxBme_l+JNL(1lrZ=76P7xku|*IU0e%=)~Dak8UW{nI1m2$@$_m(U#kwgt2O@H zHQ~GyzXL%hla%2Not&;3HeIMrL~>iU-%t@FU#4=KzPn}~fI<1jrnX<-1=w;b)K)XO zY_y%-4&zj1iT=(-Ha~;O?M*P?D~MzMd&Gbse?B(R%6A(wR9z2!ehR_5jBA8`I!X_e zutip+pdzaq#aW~ zDmv}5>?NH<#Y7$RGE)hmmCey)iM0~b?SlF~!eo-V7SRsk0 zv1?ghiEfO}9gyLZxpbHY*ljhXaHSFb*Vgi}0xLU_i3@6m?CxCXMTWmyp1R7M8{mfz^# z3DA@bLu%{3geb22>bI}pJ@%6jR0TBOF#4}PurGJ9{7JobxT)xwCz?zXaq!C{xSSZb z-tM(GGv*zF z6%kA#_m=UAu$UV|nXqtQ{UPcDydBHs+WiD5BaN$Jq`ikfo>aMzM{d4j=dmV`yYLY6*r{K(xn72!K@W zo+E~xRjwNF9Bd!yllnon-~#$#uwhs>Y3-?+^e8V(`RYHCn1V6u@3-^xNTt8*!1?gW zVPwa(zSQbP2y~LMXY4{aabO*aCGiS7aftom^&l#D%i=qTPcN*FOdE*^i&H9O8@3LP zF)M|xdzC_bI0<$XI-e<)N%;7?NLlm;!V~Cx_75ucSLjvz2|N&l zBnMs0MQP}E2^u$-t4nYiXSYr*H%mRwzsWZF@!E>q7-!M=f{MSrEOZhr&>|v3X>E6r zDRp8rL%^xDLE}?p+1cvvGFPc$mHEXoI;bK#9hgMLu$^oSj|yk;uuiHz$W%5?MmA_` zLv}8|W_T(dLGu+#W9dP**l?ZvOjVoRR;j4j!7$M&;EugD))RxAC-Pm*6ZQgmY%|$Wm0kbuy90nHj^*?!c{2sR^TqtZlF30G*6LCEcP6 z7FQchQgnoE?8#DAFUukhMU6Ty(goLpcsnJt%teT9m30_5rH+xJ;B;#@ZY7SfC7t?# zLMs)F;wd%EPzsxNg*5vRlCq**Bo8l|l0mG_RWHLq1me<2HMTjig7GZ;jKe8O^l`np z(_QdE(%2dH?A@&C<5-H0pH;_q>6oSgd2$zA*V|!H-ZiD3GSq5f$p!YSuT%$^+~6B~ zC7O4^^ncW#BOTLTT2qiHyVhqVtfU3xfCeasEAvA>1{0+`$H zjtnEssri6T+%D!K-@Z=-RiN_I3IyAm(iYq!v*Y?SGQ`H=k0Pm9i@y>p^7NZ`y28BkCQ)`xtba z_Dq_;mft^mQ#JADhi{iVn&B~vwz!GD75)6S&{i?nu?f(!7DJu^@*#RW1`Md*z%E2SbH3Dl{vuSUvKa6CEo8GJ?-9GzKyu2a21rxfT-ZXt*C z$F@gssY4=fzuyx8&*f*#S`auVehA>H>Xv8rh^{$vQdvb-I;L z@4pAlnP51H2l1KN{Hjx4%N9uiU)oHymiHJNh`Q+}!dOjr3BegLy^o_wZBByy1x5h2 zFcaT|bZ~5lMMw|rEP_zpP^928Oq)=q8o|?1?1X`&!W^TH|6vVXPquwhm4Nk5X)u)K ztdnk{G=9Q?9O$|`U5nm;kfccjPgn4hq7GKJSkoc05xSl;c@|fyu)b*&9T*E6>YCnCb|=r4+~q3VeFX9{U)DBQ5vXS56d@72^;R|>`^7NZXb2NW9Khdrsp1a zQ{SD3-?C|aKKo_-Q!Wmo{|_N03#l#}WB>Kz4H?J8A@w3*i|ttPvmV60b3xqNHsf2T zr=j)>@c4wl{MV&!ESGe{GJsvcC!m+jt;4ofRBd~N5ZW<0JL%!BVn=-ay^e1k?Yisj8U^cRP8h38G| z!T@HwwR1*)O7t(Ut%0gX@AgyNyfs_Q$tRi|mGFz)l?;#zEW)or=0?oL!agjDIS|R*TZ^&J1s%*0SikG>uH8Lxj z#MaD`LIy5X>WmA9;ihJ*dO!Xje?Rcm&T9|!V$OlXap{}q7*pN?;?=H0GEapI)5*5M zsFeyJU%@OocyNVZFuAk?Re^y3jO1|1-^^`VbS5M_jV~e3)>7h{;vcP0A~`OJhT{5p zjEqGEqBtY=Vyrs&{2e9{#}F~En&l+AdiAwU`@O?ru_goS6j~sas2^flrGSgJD8r|c!)-A?da@@b)*+qV_(*M_tB8L09gQuDfgsA>Fh31l{EXp+%gI|Cw4_=Nu1V6Lz48LRf=y0Z7 zg<+At#iUlEF7P$y%anl0w|D`@4{nNj^4{7sQd_NO44A7WoJpvO5_v1>#S5`+f-Ac9 zbx1;eNuy`0`Lzp8&tYWY*{ARpB2fU-?)sQePa(rx0a(qv?RRs-*5Y*U>k8`8NGH?Van=Jth_m>+#L>*4j#-+M$zJ3C$z% z{xz*7px8wWS;9Qu1>wQ&ExNZqB^iq%9oaYCX()=XmyS8epwo3y@2d;kQtm35>1gjQ z4_s4FgY!Rd_EP@3#Rtl*VREmTogW%=i@9(uLlb{=6& zpAm+>jH|x{>a3-(aC*3WvNAc;7-)9FJnwBmKi>pp5AmE_w*2(vQ!Wj~3vfnw6n7*q zHu0G7R)|^%b+8p0nn2zR-AN*lw zigEo3U}nlOWe2mb1MjGz>f~g!Vh4rmTujQnJGIrQ3l1)>6VzEr-Bwg53@p{B!>=cl zbe8#cuKCRb=_F&MGmA0Ila3v8rj+U;3>)qCkde zG@}z?%u-4cUX(!gIQaFMRZCS%|A77Nkp5ybSF5C9xS|U+LV|9cY-aGyjrNhh0j6Dz z%Lut&N*FARaoI>4_el<*pKD`E!Wrp;UqSyXyufzqq@NNaO~g`adgciwU#%prG$%Q{we>0266!yCm5u5m}b9a)QJcys#j=F(9*d675!bEeUwM z6oZ>^JGPRnSTT*Ws-LW0unHPo7rYWGdCExHfK-wvgBnaW@B@_$K84Y`zCwqwhw$@X zW2q}6ki0G^BmpxWIILW@=;A*KiDX{`|45^KFa$JH0t5gYY>jS%!`0vOSE%aMu5ovn zU)8}}V3djTNi0Ck4ec5_92oj+(C2@l0_7NEYbd`mS!+M%O}ah)S?tK6A@veoEk37D ziKZtDFyQX~#}eal;jmTDW7Fm$%`g;^8T=?nX3z|K&xBjq@g6sZdRjmts=1!PBZ-Ce zDjFYtv-~;haIs*rkReYiirz9P1_ZaU#xwl^v39gIU$ynZ{iGmVzUKe*qWzfda+RqH=D< zTRaDaN}_9|EaoNpj-LA*lsZrR`8;Bvr)NlIE_RL}uvUnm0X4C_5a!3LGYgRY-4Skc znv_mnA=pb-2lP$}VsKd@D9y^+u zvs6se99nhO$<{;j$1p31+9a1yKrMEnA+EpNq>3lmy88i%9%Uh|GYm&PHUnkz-yOQk zSn9eCW`6qsX?NDv54jvdy$T?fd9P-Zccj4)Mz5Vpe5#r_RwAY$8*em2>_eqG8=902 z(ugfnw}sS0bQNPCy!0gzyGf!zMsIQq3N;;P^(u$&R7ZN2V)_BmjH#B?PuC*C3ms;V z>{RFZma#O+e~BCbg=MRclF9Tkj)max=Gtg3Nm6=1A%$N1iNb4DI8mfhe;zU!?LwnS zQ@Zqw!hgOikEh#R9=A*&A$*OlJ)z7R+e4Xkjap{;Xozp@W#W$OAgFM{?U{f4pQD#^ zX1Dw-rq>~Q)-XlXE`H-#=avGkQcNaXE25jT5yKdK5)hvJr676}R#lOH@t1h&YK(6c z;3qPASBhmGvmJM_reZIsoLp)TnDPpmX>R{(hu(Vc^nIF#Y1M|y{3+fUsn4}W*Ch)^ z7(3Xs`C&lS^-?wu#Lsa(Qvds_g>HLjqoVgjd+OH1?M%zk${|GoC_6j9ED*Y-J0t%( ztdrJ#7tP3IQ}raUB7dsVt0P>(=QsIwG!$k~|fE%pquy!stK^?ttpqsopuVvK&v<GsT-i@m)q7IRBHHg*86d$00Me`u19rQseT;$g~CzV zG%F9bj&%JjyLcmbfohj__$Z3aArs{Z;E$AtA|23YK8I9q3Not zQRc`{l0b!jY28wCpPShK1ersZ?tU*yvsRzd4v7_dP!Tdkl&ZW~ zRT~{Ri2iyn2oKGR7z;agMpVOE?*U58SEg(}wzP6~^XlyB!v@1Rew79Vy9`v)~$1`St=3N5(pV1DI>XM z@j0Y?AkD8t1uO?mI$8iOJVx?F;>mO;-)Ws<3NGHHpLb7BD>kTwghGsq%hYp#V8@y; zp`NP#9Gp`y%Z%J4y?s1r;2r<-}i}2&dGprg+mQ z2&pHF?`X__1D%|6=8=$Uf9VRGhcaoN1yuUfPzF5+p7{2ecXTX%v`qW|g| zPsnk@eGcmh`=n8st6HIr0vw_~56af{nftL;G9;CQcwK0I$y z$x*y_bP=4i4`~I81SAF65b>9iLsB(tyeF2UK`#y z^ANU8c%vD#bpdoI`jSzus{`7tAHWwKi#09p3*Rj7msESJo^{Flly?b z0hHn}em;R>kFwId6j@Z!9XLMJ`0$hrvJ;Sigk=YPadCNR7WkJdggr=|`_j3Tzn>Q7 zPRx(LxldB&y}7Od)*jo`KX#SlwcysKn~Fl?MZ`sOBfOao?N$hSDzZ^OfP6|FF*Zkr zAiq?f*#}qIh1aU5e8Z|KjGS$puOszOxgv3VEoHrFv_8xSo$Ap2b!N z!s(!a^r~QIr!{~!EeA;1aU`47bD-06@Q?1yhJID}JQ4DM1(>pcy*3-XHc#|K)fxPq zP5rpM`ltcagZ!mWAkAB?vd%<M@D|t;Q4{7w1jbiByT{ZFb2g zPVfwBPCnEIai7MVd_AJTb_#DcN?%Knh+jz_wIz;+^WiOj6M^F^;UNZGhrUg8TTGx& zO&uV35~q1*(5-1Kt9qzxwUMmr$pC_#$EQH4bN6Etu+F^|&6ePM#?H4&;FipmKsFjC$Sl~t=qxbFeUG*; z8C}$^7@Xa<88&|V`ss;m+XS^*>l!r4izFLdfv62><7jwA?Uac1DNgtMFR2sqQ_ei)!_-6S9k<0?YZVJI)A+AoFqU&Ho z#7Xw#RH7hfx!KEqtha%Ti`PHo7Ifu2;CGl)U_y+A9~HkFYGirLPv@2ogDe}IEHha4 zvq_ye7{nxIOeH10ItY81Pz^+28ktp*NA%|&bdjG5lva${f8ICDfg6c4VCzD-qNzdh z4ERYH&#HxPGsF=(h)oo?FKEe%jpyc_9qXBxNf1O7cV|liWAhB@suPOJ`1r|+7*KOk z?Dm+V)l;Gvvn{`gbLI4F%2hh)K<8M-K!-lDZ`*38Qsw{+`iUkJCc818e$WDaI8zwoK1o7l&E^j&tzE;q<5ioiw)ywI!lV%wrp{A%)?sbVEgOsF^z0t*xqN0v68hG07zMld^M-mC3?(kEt9O)i>Z zujcdpC6_F2Oi;IV5s{{qj6*NWD{x3+lHs9Bq0OaK5wnozm8HUHqzqA7olbYI41%r5 zr1Yk=G`r7FBWMFTb-&y6i2jCi87BT^`hON+u~1f&Tz60tu)lB0YoYcMetWA8o%dXb z!?&Z9p3+|FjnCagB{K(zg>ON*6di4JC}{-3kOPO=GL#5mFsPkNuNxK-Z?FL_*TI>d zx`gp~)U9jz2=oa%gVuJuj6cZ+&8gx8iu55ov^6+-=oh?8D&7&|$9zyj>*rytA`epK z^JL1R=n4{rF89RfzQ{!SjfOMv$0mD1cRr6(ur_`#)e7S06$_8-tOsAym@2qZXf&1IJX$fbd{d2?H2@1XvR zs-Bf2T{Sa!YX3|2eu;&UB{N;F1|Lw?Vf~fGOm}nq_8BA>O3c=ub2K>y6&3FJe*F1d zIX^Rai}c;;0)sx<6&V8Q)Vuy=6h9w&KQx42%tB}+Qk3J@RdQ~V{yCtD05+Oba}^Sv zd4oHI`qEq$ad()iVqd=6*-*t?29PPrO4|!~&RizuzELQ=~w~+1)p3w}`Exdei-1Gs7hU>Gjrg^p?AB8TzWDx}1dR_Ylc%)MGWcG?z6> zRCP9p30S50>)6juB|Wg4J~(ODtsje94PC_+;*}?tH{xgUa^bFT?<~&JuAWH+SY``X zoH*r z0m@g^vM)9CKY(0&idqvVQsQ&3+8hF)qy|-C8s4q)*~HEsX#2{rWA%Xm@BXvn+*QkC z1(0ZwRyp3zkS15Iki<2&>W$fLlJG(lsUmitX=hGjV4Nra13fD7)IZ05eNn$p~M(dYig>w(K28m>lpQMW$L^(YXAU zjfu3yF8m_I0^8ygr$t#f(cA@F&e{;ozzxwJbHH4|SH?a6Ni5|a$5(GmxmxUgKZ0}6 z!`X>ti|X!T>P^f%)HLHwE;QB)1L|Y$l=y<(Z~voU)HhjM&UzfPIU~=|c2BHo_QIrN z1dX3e=}QDmg+PGbo3t~i#wQphSaERqkkp4rCJ$0z%o-A@G*JxRLe*TCghuQ~XDEy> z$1YoXhu%o)^T4r#%QhI7{I#ie4@=f|K%x2V;w|XtVr91zLE^!s%A(Ah8vhS0k?Ka! zB$3QfhE{B*a<1I~72=>Zu47AYVKPsQW!rw+<2(xcl{UriA*ndzjF-43VVjngs?^t> zU^OgZDy10kzpvWtH2CX(B~dFgof%Gf|9Hg6vNqmo2)Sa;vzj9rysj>-a{S25`)7!6 zkR5tSXXAL7ASk6@X`}yf>r}(O3?7nhpA{U_D*+7#ws-fwZgMn&cSICIJWN(xTtkE4 zILR%^liUhSqstfzLDd#hwxe%=#Q|kOc>)u8szLo0RY5hK#!02@WQ|TVdsht(9yjXRX(=R} zVOmPKXsw=1si=W(LA;h07!@$ubcvQF%~Vk$gbR(y9x%7ryA9$eF2HI?1yLe?wZaK` zvq}qoSm&|O*s-XJjv5WuQ1$KKSnnBV!I$2wNp_IaqW&uOBw32%kW(*K8NZw2Kz2e; zBNta2PwR&XW_g<`CB9MES&nuDuIb@*h(qf)r3uDHf+9ZrUGu1dxJK~)GmIl)|MY<%7C~u;1(92k4MBq>@NvudC7v?4vX6EIlg2A(% z-dG@1E6pX$hH`ii!=(PC$)7VCt3k+^9fzT#hV_{h% z1+Ue)nwlE1tQK?L{1$+TYK+VzAel{AKRu233?rdIZ_S1|_%@HudT<}&UryqPYSY|N zr%lG4%yX0=by`+(etom!i$T&Y$xL;I6x|;)73o6Mz`}%pgNmHN+f<|K7RqMd;eE=w7kVKqr8pK*==Z=JC^sj*89G81!=Dm4+(_#s9ENbNYH^59wow{VL8{T%c2t1>(1OE* z{q}~IFIG!fAh^B)v>9DWS1f5}8(x=Iq%RPt*EIqgZe^_sT(;f)cBonqwk*Dk*(@Ga zqU_K)UDi-X*3nfx4aARLVC@_M;+Uq~l1W#E!JURF`5RdlV!$#cXvWdwfGnj-Jp0bD zh{WPjRUj{=bY2)-hE!M@cvbSEt&Ucop$x59ClJ2$xw!WLLr+Yc;RU7oJNEoH3G2$b zf-}Nuy`{RwM25*tWgOKV7rs~`lKHu74!^Xh#B zRBo*dyTRj9n0-1HqDZ8CR7uXKWmva_Bj0)GVtl-TP0WcMyo6nELC1xXvQC;4L28yi z8vJmD0zC0UZ+WCRe_c@M#HD4ZBBq~=H=? zO*Dvjk$*qL#yLixXPxV;6<;{}Zd;sZsx#G(^A z`aBrBFp~$0DVkKqCPiViO>*;l3AN`zs#q5goLa1?rb5l=aG}Dt>rvc^i244iCs+ga z=jN6M*4B7^$rFl4>AbY;P$m(IxXL)UkB!;%pD^b9<8T3Tl9@FTWf$b+y!f8HU8m2L zfIaKn9_R9IBqn~z!=lPtT6zXPv5Ro))Jny2TIF~#Q=gRvXyI@;s~XdpeNYlG+KmA* zttjBCK=E=o%ieKB;TRZ^IWgk4LaHjsLl%2kOu+}>1hi4;6mVd)a5WvH(Tga`r0&xQ zvkiD>OE4V35t8NGtdo`^5*F8%&X`Ejv+pDGR=+{~6pY4~YeKt}4Dj5E_r45UL|qd9 z{4*_(k~X50iU_7U1mO~!-8BshMhmCLtrk%QAqV4@@#i`X0gP5mI?VYi+8ky{XS74I z$k$@aJ%vFlNbN)&&%_Y<5-)3GH5B(_iqja^;W!3XlxZk!Axli;D zTwx<3oln|@@r*b^A+~v<>^L=n8;@IP3}cusD}i9fOLa~P)z&vGLE-hRO-3Qn(IAXZ ztp3dYy|W^Of>{-J6V;cRAXI^3NcEeUYNhH4NQ>;MWS)&UByJzDhOq^oz66V8m#`FD z7pz{>keoz~0v*{PVn=wIAIJ|ui9xGgQnmxvpN($0-L2l{Kd)VSp>iN#cb&qb!Hh+9 zzXaOIUJb+MYs$xk*`t8pkO+s7kwKD@Nn(7LB%LJ`aS)R^#*yU=LSvc4k!5|{0=Etz zyTQBs!)x%#%v?+B^?07%ZSIuo!P0A0~+E zO{TInYkx%(aftnF&^Hx=)|jLY95#x97B`hHt0aE zVcI3usumSYTFO9vXfsvX;yQg$Hpdo|^i_lxdj6`rA^i48+Za;^*`}MZ}JHe;k*y#5;WOmstt9q$3h^pfW34+MvePVld zN@aSa1PJb)0(O04W4y&lQQ~S%c6vZpPpINB6gRMuBWQcUPmLYp({!?rxE4KtjT~~@SkGi zy1Qk(aCpL)!#pMWRIUe0=N}L@m%7;O&w>?n{;CABO@|~>PKqenK~i@5Hl`JbVkg_k zBQ~sRK03)MR9NXKQkEy`I9!C_@_4ivMest{c#l~j*-8&6(O`Z%ysYto0UrkmDrI|0=hVUZ%%`|c8FmE;*WREP| z7M5R7v>m#Vxk^4Ef+HQGB2}*yE0ygqk9Xd*S`0jFLPx0Syil7^}IT-9QIom>~;8Cxq3wbBuWdOKdux zzorI?_RWG?o7ce+;UQ{39qp?YiN&FG%-)j1rBW8#x8Ym|x0Ep{Ly}P%Hzz$(0q^I!V8O4V zvr>E2f0I^lPGl#ATFi9#m>5_!#T26-Z`Pv#9T-JQWsx^DOsH{WGra-Rb)cCh{XFQq{M3@uW9{3Ns%X&;!EN!M?Obl&6`aGBn+87-yYk)%#V*;QptE z&ZwVcG;%SDqqeNU-U*xqrrZA>drX9cq_`2L1*VAyovNBcCa4mV#z*Tr!mxJoxCJSX zsmW|-0UzUiP9HX$Lb!{Eno*S3*L3=f`xbgxN|b^@7Srmv+htlLNTwZ#5XVphaW?Yd zotb6`Lkb1(AC}?G4NfWc7Qu>GEgqZ~HGKZ7Qu?2)7xWufNp9~^lP2hlp?S8E9-46d zfd)gW7|*|w9!IMW_kUkT6&39x1UP5}MW!tY(qrB(R*l$4oUpPqOoH$wJrWqoX2SEX zEjAuzu4FtMmGUFJKQsMr%qafOptM!e9RBT2Dk&ak8I0Q!3dqY&<4Pa%O+8XEn@GUj zo*p6fxmmzwyA+n^nZ-be`9{Po_y#w5hC&qS^X=D_aKp-U%bC)P7)K%p!V81p>EP=4 zKoV+qCA;(oqvdO07#dLq-azEYPOZEI4?~5|jC9gGA99_%M zRlT7A={udNvJNQxdY%zgxK}2*D{w*%E-`e?d(7TZ9a<6N&JNO*T~S79vjfcH_fi|` z?!U}Zi*lA{8t#916UR~$4iE6TWk1P9B~8jU-OFrO~o1c16Y(p;tB-FE46fhP! zS7oNvdkLEqsMVkrM${V^9oQ1G+L=RrKVwqdxB#}}tI$Q}A86v=>ZmN`cea7U&h2)e z7AZNKf~l1TI0b!|XoOcymWCAFUm$qeluQuotp#9u1cbYw8dPr>nlTEd0w#&baTFIoa zFpk;IEN<$Buh2v*@2oV%`iVYKD9<>dd2t6dS=aCd+S04^GX9GZ&yx zYB!*fyfuGCNo6!{rbs5uabjMN9!f8ichPvJL`ejh%}Hm8661mMDFK(_4UVil7^o@vzXW@f z;YdxA&gp@VyM!)2Zcq3zyCHeDCkLFpx1=tpFT`_ofslz4-?Ty5H zkv-Fq%E`Dt6-?sTeeKfQF)(-NM{miJW4pkkM zm@X=$8rdmI3>*IoZu-tGg-rsB0;=oSW&!zaHLy zfq~wkn2hhm6Y|BBXf!S0Ad=UzQF#f~hU7f=AfQI`?R?tjHR);bBWVJ|7f#l^5xr9N ztpK2hVlU|ZY=1>85#wo>UdUrePF^0SUJNXczlnWCfFaW@FBDsQJL!-Z<}z0&5eTVK zLknafUTO|bu;=n`qM*n6wY+O_A}_d2XtBt|as5TIjxo)?fZw>9-RHL6MQI@W{jz>Y zWC;8%%-X!TqKR<6D|l)fkvMo;u9QUg2ZMjNn3;a*3d&H~$~ji>SsDLwPcGs~!t8Y7hnx9V~) z>hyZMcIyM<0o^Tv`uvU-!{han%LFdYOm_^gs8|7-4TWkKd=4&~fb{H%juF~rmA6HB z+}>c838>+d*|0^5-N6@CQ@t>Ti&XVvG5HJrZ8rh zq*<^9V%t;PnL+Ev`Z+oSLf^rWwrPG?urG{)Wn-LXJlK5E*=)NrYO#b$oBSWwtO>ja z$@59#&+M*dUC7F1KpPgl>d0 zhL#ehV>40Gq2@1pNz7QgF<;)0=Kl5_IyNrF3vi1fQ2wmYr`>;YR3heN8_Pnr3?A$1 zpHYQwbQ%JdY)fErn;?-h%A<<9*`Tf3W#v3nnIjHQ?NXp?kE@*8xK55IQp9;t+%0P_ zGF!~R6})%5TQnyWI#0AniOOeo&|e%CQeC7pRk%g)$EoL8-g&@1My;e5P2mBUZm;pR zS~@Q&5+lO;r>virwR%R$CC#n|$(He>qE2~c`}_#E$40eUv4gZUmr%rtf-urq{nK5j(RB^;sdjjCl%hBXbo6b zR~C8>86P}gX~Qzg&d=?VdYH@QHh9`b!B{$V@7abs4+Q^O&N}862HU6-s zCqNj~Z|g$2hEfZLvq7bFVusky5VcX?fS5I?rv`U;A-yxk(lUm1)t0r>MfCySudv|Mi1GPLLd+<= zoEO`3i@A`*t!ly<-d%&h1sK^&9Hr^QHnU0}iU_F;=oWMF)dRaaaN+Ol!(XwoW-XW4 z)Pn)5TEZF^#1h6VS&BVXHC3VvNTW-td?0~z4Egfwppq^Yif!_UxU}z2+A1e35f4C5 zvY{*0cZ`+J9w2Mee|4}LyS|RB*6OcGU8 z1=QSQ;1A=2Ia=3tmb&|s?rm*=Xfpl#L$G0OxGVF4pCaJK7>-m1SwxZtvL}poL-eK@ zhPW0jxVl{wOa}(ar?Ml6F^@r&w<=AO;ff9hvCC2kHFa=vdY%SH2QntVBrpT-<03lW zPmbu7DV%z!gW!6Oj_j}c-51!RZXCV&L+c3g)UjpHlm3p!ViNY z?q!o~!M`GJe)>;!?;v=+`3&9gB^3!uf$XuG{yZ$6LVbX z{{amx=4`M{FT-ix`^3&;OD|Qt32&$(Pg3Irw!Raz#V;c4{O097AvXL@)DPXb$ti@> z?g67frR|03KiZVtOzy>)FqAVxIOb3*p~HraL%CKrM<1xR%?7 z0LFp@Tk(B_(wHmtFHAR95G5F=h}tXPCSGK^bOG3A{%PF$BO65eQDz8{Pjy|Da=f|p zUp;N+qOb)IlCD*ipB2{l_n3!qPo_2mzGPSUjBe*FI{Zy%3JQ*;(yr+|%Qo?H)W3r8 z9Wyfg4M0~}VW3(SY2UgadG>cJR*Xp*G~cP`x;V~j>|cPza7fA4fnD3Nzc&0R>RYH2 zqupwB22n_!iV4A{Qg*Z#R2!c_4IS=X&XSi)@5^|%0&>gVC0XJ75;l+VK5)d zKVP%dC3|E$blq2{Wvj+TcjW3&pDr=_DtZ)xER;2}w|xW=5lcQT`;OcA4`~LXp6*-{ z4Ti9n;zhgwmSgYjRpTEPKh9Ic8d+q>W3R@uGoi6WI|XQ%m|aG+3miIlt%RJ5FGg< zC#0taC2~&-5_MOWbqfmp%5dGRNg^H1LAQtgedz(;nvTQHr+AUtBhOgc2&C5d-CE|Nz4|X3r zj|vt$IJCknM^^(f`0eOSe>dC!a+bAl+oNM$quzVAZ;LUgXfMjuwYk>gE8FM!@L#tv zGP{zWdbTzjY0G{Si@NV;ePXP{I0|d*Jmb&jO~*GBCT3VsvCtRRVnz-dc3L=- zZBt0EIB~IA{4y)7CHnXf`?m^&mONB=69V93`Bf@PcQrFNP&0+j-6pF-{ zgL~t~Jn(};8EKSCxd1mIyt-g_5;t!Nab-MsH6(hox}97JqR;IY4lmrXM-`j9XiK0~K#mi+4WwJGWAnm(ci0%YesM z-dv~B5jq6QtG}ItHWqa7kfd3iUO&|_rtMT3GejY#5XEI&WfS8m8~~VMSx@c|_41{4VT$+gm07qw?Eg*|8cMN!jFE?Q zBmM0=qOe`-xd6L9Q|NjjtFowg3F9gpywz_uxdUT*1KPJ8G_daUHT5X4+F3toA3Ede z7a*Y!i3PqdN%=BiNi7} z-#8)Z{SuDwK;3=9kmjteW$rTH&Ck6@?cha0t>JSE_2IyB|2sV%%v$#=GQR@;=J%X! zDoWH>1Rx(Wy~q#4;Kc*F20|aF>iy3Hs9L*zdVugc-B<1?4OHL~XV2F3?Skz4`*UiZ zYY>9zebe}z+{yu7g+Mmj6Sp=+$f>!*EF1xIt>Mjk&j|z*f!r&RZ=`ZDRF_0GMo9%g ziYUczy&RE#{>jT(G167DPa%`Z&WM|tsx;kOTvm)5(17Hpg!_h@S>0HdzxXcKWRlhJ z33Bxf|D*ZrkW~n6zU)&vFGb7wn9-P#IW%<%u6$X|;*J^RBR0E<3h!c*OX6x+|~2 zm*6?5rCbO%h|x%F4Z7H=+C|Fki{)FoGKc&=yB(1s0*QLp^ze)Yzn0ktMr6?fa67Ra zf@)5fVv)xBKi_gc@BX1VAmdbe===BRd|9lw7%g~(0%c*u$m+z64JNS%2T}x@ZvUz- z5TQEbvL`di$;f5qWXDV0=-lkbTI}-evt_x#O1yPl`@4is@Lxv&d%|0V(&l$|Hh_FW zs5-%=8^rWswdR}trO#I0_12ycm<+pfEms-&?8u^G-m{Hiw#>+Q(jpZTPAnm#$da>L zV&cpM>hJfQ1hn|Wb7`$67i*5?LAL4(K7Cum8+lQd{qds>xZ_>Y-CQT~mInU?Z*L6>fEq0OLAZP%*L%onRupYXfg}>Whn9m}-RD4z@ z3f60waw=L>_B8(IlfXJsaGhXNN*?uaf7Ml>Y{N%L_OFSvGbh;~l*l@)Ajxm*;LlJ{ zXKRO5Ha+sHPk&xFn~X(5yMm$ZdHbn1Nlct2oPV-ap)^ii^JM>dl|1KG1b1q-RuL6yuA`}PLNw4Tm%YL8JPWxK0L;6@QP zYPvKo&j(dflMIY?egimcA4TU>ynkdKgsVWIWuGW?k9W=619UFUOj=&AmNHh7sJdP| z+(osmi@7|}l;14Z$%ypLoc7s2R~yb-7gKYRr(r~yVUb1#kYNNyCn=08HDX$z)OmDK zZdKflrPhtWF;&EOn}FTo$n;s2M@S$Be5h?a-*>=h8I>7Xq_z-cJ)7`XeFAI0s#>{S zg$K&MxwYU6CG;WZTd#Gl4_H@B(3I*a-M@EbEL5%bTEv@Y zef6mT`gqJPu$y^=zU=(ndknPBZZ#l)@tws>&Nx{v#E)|;D2)=z!U2`$C)V`l+6+FZi#LVb-|7&Y_fp!^s z2J~#Am^}2cK7_H3goL!cJKkR3Tf8%>a!tyfyQZN~<@t3V2wPIAzh=fw~TJag$$(!8PB@VxIS7M;^R2W?zS&5F1!3IgPJ9s_&c7|CwsgYxl ziQvwH*7qW3#n0v%`kd*!ydR=>h-2K4jtac=8s{Ddl2@1K@`zRruB&wHp26}~}(hRg3? zKp8H@5xJF7UJHo_fWAXkrn$1_vU(4D^rZ5Rr*YV2EDNR{KTtb<{OXk zHo~lu3&t3epjX0^Di-uf0GFdKuB~~Ra6z8*N@(EOC(bEkJxV5sWSlIWOI^9N&N!r) z5cv7c>TL~oIWojbL(oafucIjD#Z^Y2qiXsu7GG_4p-9iq6}KOp{;Ynp@u*x*^4Ye5 z1F``F@A)OD2GN;!x(UaM??LeAt)Nb4twAn_FUh;n+5DFR+aT*>Dr=Kp1!d5pZXjsR zeCCs9pS6Rv`8&ze%KmJmLX^fn_6A*4!VBIW3*JgqpT0cXdDXu{O~b=)rzS6qILw@k zB}2H6vcZ34-~PjZgs@_ASY7r>p~%^6mJ3XJdVY<}(2Ian`k~Xz%T^ZBvLD|BXh24& z_RNMDXxfSynJDx~W*l%uxnp>AJY7JG+s7+VN zT4aoQo+a@?q}%PzK)}ehul~nBb;7K^6AKHBzAPQzC_obTWGGz{1@yz~2)0P}4p`mj zZ%*oUSKphjKCz(Xfg!qF)r3LycsvbNu#KGhH0X!0%f!{ngFa8Fs?Cc>f=XqZf6IBZ zN3#@Sf5FMKwHHO0wJ1(M8~nU8AU!vEnI(Hk8Fu8#<|vXEAhX373sGf!f-a6u0HhUY z?SaVyJP|rnIUlSr`x-l%tDhbCk%vT+YeVBduhG}1hPS5{k+T-1b#n0$5gzG5nnWY+ zzJwLuXXu)1>Gj|DxJQ8ik^(bV&zZ~W?@4cli2p?zUtNDMk%W&@XtXEptICbHzG4p3++hh8OkG*#WKNrtdeMLXgbQUB8z1;`D zA!3lOj5oLZ)eXMWefzidY9LzPylRCwVMlGChwvjOTHC*+x8Gqx z^sE3=L$}M)D;Rh#PU$LK^cb|#^jA!ShiYYebeKhLX$_khv((rXwZOPrsJ&PDT!R@Z z1Qen9iAw)mH`ZxwutB&MFRNd<2uPBBnK}l1X$;N8YtNbGNoKT@3GDy!ZG*@*hAbh& z*Gg;rBUfR>TjNy*B4x*2C76c6X^OR}(fa}ATJNxBshu~An$Rs46=GaqOToqLoob=q zA$1C8ZU5wNoX4r#KYV*2d+Qgwg)%?}d4B23DoE==r=$bf5;vL+p(t}+#Lt^!bJC@O6j>N0H>@{2I& z$}-+gicftAStVNFxl5RsOv}*HZIHJ4!z*;bZITXO731z+#qcw#5FlPJ+WKKXWpdGa zI|^-C%Ch-&y+vs^02Zv6mo8Cnp%ZO`@PkT%M4IJA|;>j6((FsLRbPS56102mqE zOKpre5oyfjf+FS=A0y5VX5k8g_as-Qtlzecji1kDKCumO?+dx>oDQu2lsc`uV2nd1 zQ{d$sP}|3nF}p4sxFE}aa#TZru75C(e@eWO{_R)sHVIY09<-F>{l-ZZ-Y{z^E$01( ziYvES`cN^-5qm^zi>it2sfcWMZ8OZ7Ktbc9`8*=RWJB+ffA27BTR`+4Ijbp3y-Wr} z%@0FGWD5hr>@){kuTP{6suW*1$z)yrF}Iv$`#UrZ2v`fp!EOxQcmyQ9wnJvJX1NQs zd?Rq~kZA2Hx%WRlj>Ee@3J@H8t?a^+mDT`A{Fou%=Q#)f4}qgVSjwMd zL-2EitBm1G`7!H9<+no#5u;gVTiu>^S?)#$d3^k@BRcs!Qj{10_UKE2QpBeiaHOC zsc!@4f!|$?NgYejdPiVxq8)lrY#692|`NW?Q$3&9}yVYMb8qrM}McLkRN{kS)uY|LUx~{l=3~ zP=>R&ph~k1d2`5zQK)W<+9y4dn!g6aivqYoHIJto^P5{H)W?Z%SG6ssC5(YpJKEqb zQNOQlLda-al3>8c`%KIu!5F}ZI@Q%BVQaid;<1mg#U5xOd1llIU3G<%d65w{zr|K@nmsum9qw@Jeje*LiWWsRCR}jB>tn35# zmES-B?$J*4xHbzC#fN|c)b8IT6WYGDb-5h{sQcs~8-gzFAQZiAw6u%F5~kWXYsbQ! zqdQuzaI9Ywj>((|{G{(Fr0$uT8P z+)wPBWx+S9ub-s3VBpKc+piDA3MbhC35TPYGppt%e!-Cw#=pN*C#aP8HXqjXGWK=wDR6PyA2ktP=H#*I=X@4EZ^#7UD5}amg zH4qmCkw;HWeH<KXhOwFWjmXH?&>pI1w{3Dcp=+F|9|+~rqvEqZAgs3lKZ zo|M32JAYx)Tuy>_JPWzF%MnDma*ABHH{G_e<>fy8!8}F1Ik>ybvet*a6Fwf(hunZY zD_#YRY%h!V6@v|m|AR;$kAqX!3PTdD=#_i^MUvB01L1+MoR>vvjC`HX>6!h6QlDM% zMs6aH8G(8bcl_k$Mo&30Znj877#zdk%sh`@^Aa@F&=->M%jpuvJ!2BO5hFlWGc5AY zD9MjFXf(6JQ#-PfR~u`s`JbUA$xd|F57SAaUl&w2xscE!X}Xp)q6$j^Bzm1 zbb=eDi@ zdN!jblL2f8MN0xM*F{&+o9ot06|A3o3wsu2-en>T%d4RD$A#w3JX6dMFG@kV;Leu= zIi3{U_^_G$ujc18GLSe)_}u2@@zScjY^?6JO_Js^Nn51EN6w2}O1_t+)T8)Ahy>?_!6 zeuwKLB^LOsui?iHW81^d7(q;d&Eu^2m;)Q6(u_wnGdAE{g`e`<0k7itK|xvrnH{~64!7X6 z=$QwGiYKA?RGYBkE9%a0G&%qP!wGd(mf@qXJ`_}k2A8DA0|=YIdv}?7T>>@olK8JhaA|;O@K?u@gx|L)AScz z_KzOicwdslXsS3lT4&sRVufHuJ^V3R+E&YkK3muO{fY7W0$AH0Xw+O*~=!+&te`2DBjxGXg1^!skhRmwl39SOOkyq4w}Ko#uo{bIsQhW;6eQyqBc0N|a#9%gkJj%x;?Wn5pXGAHV+y zpeWJ;&uR-6z>RtPfir%8UBaQ2Z3ca$ri1mCN{-RzwXIQ)=fcUse z)aWP1&Ug7^D%0%G6l4d|qi)NKiNpchmjbL@8kWb4X86X8q{{RlE~g@ctT0lRKowaW zBwDHa6&gGv4$yfb<%*&@!0$hD*6bytanw2%C*yoz(zqR~y0$R9diGC4;Z&y(E4W+e zxcBv-BMI|$CFvzA2@{9|&F^MB(Pr(^c=g ziGrE`i^tgjjMKHYM~CphJVs`@;$o&l@OQ0YX@2P#$lf_tOFUwci&rNme<9Tx6wQ)g zN<#8`|7{obTfunewbYs6kNj@rI>Y%{-Exfa-g$wu+4vb*bXliFovN@MDroWSVqg+- zft1FQio#bGQ`vE~p^+astCc9O2d5eo4c>a09+R^9KS2I+zd271NO+bpqs02sKMUNe z?-V@+5&P3C{5p${2PnZ9@8-C8FoJE_4ag|CHpYUjM*6fB8t?c{D<=}m&C4TC?;M#A zXY+M%XB**-UD<5vhpR8YN60!9eVu4$aFQO3E_MHQ!T~!ntWvW+s-~ntD;f~sxSc{^ zl44TK-P-aA@ec%3;;23L*BOyICb<0U+3389@j}SnkKb?Dk+yMdwmuFXdq*SNsePH! z`wVFR%qPu?3&l>4yoY4hJ@p$2GV40$7>X^U@)RT{D%w;1XRbb~NkZ1c_!-62+-Egp zhVC_~rT;LEFXKo3?llJv-1R`moI3G?Y8gBv$RPx+NfqsrfLjTJ;(; zHf@AVME_x&I=IzM-J^|k^BWHa&+pE3+rst%d1i(#Dxmut*j#V0SvAyB(d~1;AmzZo zEAuOfgExYg3;sLGPeUrhpppYf;2{GRxh7m_Q5C^S?YB6iXlMf2vX;ELN?YY)uQ~lI zu6Xk|{BL_4D0f&A#t=?{x18*fn6^Gmp6l3yoYa)Dcr=YID%U7Z<}ep)CZwvmulIWL zJ1tRZ{!phZw#`WGf=*AFV%f(JjpOn_3O=J)9^KJEtsc*XSwpoytz*tuW!ia@S=KrK zp9P>~p!Yg; z5OmyruTyqR*Pg^ok_*o*b%uoKLmW{S-O+RIH1&1Ck5W@HuJBIJBiSEyRv3LSZXUZ1 z046oa&QM`un1-HNSeI?%moDuouq*eMnA$B`d`f?z1nw2Bmu8Tbw}Vrd9-+Vpmnlmg zw8%*mahho`S4Ayf@2G|eclOi1>mlhN*xO46Z`4DVA5X&e0Tfnl7LymZ&!P=;U~abX zP?r@+3zy9Q)!VIpk=__FnBQo3s#45djhI?#14N@a(U1K(tRToS=t>;D7U?mO7N|K} zKOUp*U{xKXNB`!u=x3#3Nil0RS~J*a}i zzMU`yfIZlBoCkpH7%|9DgwBcK)$n^qnL~iQLC{!df9>t@U)n8M}T! z*gW_XRVs_Dijt{-(tNup+`dw*y@Z+XBAlV)>liuPNomqoCs3})R32YE15<2AO*v^; zB4&X-?k~lFa^8aq5dU#3w~MQO8l%I(faP#fq*T@i_#D(WavGcBx<5`8>H-{}t^Oia z22kfHk@6)}CgI5bc0fs~nRL~ax)WP$nucWuFUS>yqe7%&8`85klUDr1cre9_1--&yKiLWp$&eoJJ~k zn?Sc0*F@mTKXxT%I3Ey;Z=m)I_y^0M&}x>_`K8KW)0e9q zNk}CtS96h`Lv@*8Wxs5nvCt0D7(s>|{;4*;;wto-J4qO-V6QD;eZQgrP^Qs!#jMK9 z_?SRHPdOl6YY7Brl?s&N?c zNwzF<7v@s_d`K6I;lUd&VJ`#h9B~QgCEZ>`Rgusdk5w&XTtu9?R%*+~plj3qVb6pt zQz8i}Iq1o-hjVI=M_%@68T%&0vq^S%^Q_By@SXR-MfHKS1`-lV4X>!cu>cgY-C->l zfOOU@vuuhtD~QKVF7rv^v03egIkcUiLS{6;#Ez2q>fs!ZiqGo2T`Kv9B+Ad}iYk@Q zk!xZ4`obTZ$10I+2`qdGX+Q_i&sR1*GK`A~BX;RrDQ(N~C<28U>(jSY4W?X@nV_@perEomM0X8Dq z79#?%gW=X7{ANA!|DtNCGdM02ZGuip^S`48*qCh(525djmo&Wd;k^hO@^2);dftvuw(X?l)YF$iYqS2WiJT@4edlAZ9GMK6q0Pc!$m}DV z?z~o1fF$8hz7B3$00&l00Lhr{oGX&i_h!B`Mc3FG6fcHi^_@ttCXYeTAOFCmOEOYu z#?H74PqKj#y<9->d`}>^E^;PAF;9}<#)gli@xoQ+y0$bDrk${!35d_sTIDo%`1c_D zgA)%ivcZ3>6VY?0G2@|a2o_GrsrRj?mUq7zzbBmi=Jh^v;Gdjz+evkFFK-KR#!Rys zxY}Shnsv&ya*DHM#;`injJ_G-RT+wKjdilr0)a)%0>^i2j>|K)kq@vrFC4oZRS zrDF%wD^`TROG#`C8+Rz;ejj0)fMI4f+KkiCKQ`B8e~C;9Tw5`UV1u9A)+0YZvr%wc zhI9|`UFm@Sx+ZAhw|t2kNgwMZ$oQdWn?~Q$?q9Eh(z2I#=Tr2AZ34D45CgPYT6a2} zs8iK_3HAFEQSp$!5}9-$EsZS~#i7lc3QWR(`mCK4AI8qml6-P!(j}&~)FUNmlKX)% z*Qrr6L#RKV1m25VJtpu>m6DVmPkw=OR3qdC*(AuVk$Oqsd{WMpM# zr^ZC7vy}CYqdh1w28y2r)&Uk_BNkTZi`~JyO+w#m46yKKfie1*d{UcOPWHC!l$A+9 zf-%-m@XW%@105|Xv+xRyHgX?f8(GtAsd|g9_1IB>zW0Og6Iu!reLl*DtC{S`r720d z6OnW_v|~|gE?LgkNzY!hJR}8I?#iZvYP>{~L9&&(V$uHF86&VM?Jtxy8D#>}7w&zH zhGne#t)iUigffCDx_IU#Hg#)w`A`YdfSW+i`T1C5nln()j$-ArGEyXEkNi58mWHep z&5h9p=xU%{Y|A9%!r_Et8FU%L~0HG1Pe+%@pm6;*)d;72&_auoa^~Ss)Dh9F{!7 za40&9>7dCmD7u`F(QmtaNNZI@jjb}CT`_$p;(Tstf8YY9xwFxV)cYc<={%)GbL1Zj z3SEayT;=FB88LmHlzx4b`dv1fIn0(RwQO!oX~GgUF#4aMiAvV0l5LB2Ye|&ITWN%pc7j*dj21RtO8|KO?y1slXnj(>*8lq-LbF^s`5!r3+WJ&_ zb7XTyA!>Jug7`E5F$r#%_uX!=!}Jo0pJ-Chdj_lS zG{QBeLAgZaN;#2c)l?-oh1wRArSh1?I8B7iD-=r^&T37&Uz*~0?%(MgZq1L%b*3g5 z{lcF%f=3O}58Y7U%c;%1Y=tg^e)%cy|4^^tR>i2B952WP{)>jw%sN#~C1#zLVrN-v zrozm2?=eyC4YvuXRf__}W&Mcwjm8ztw|*5}C8>gFN;l(Hp1_GMNE3J1Q?FA4wGvDf zAzi^8a}18%%V95IT8=xP6zwbXT^X3ME>ki*8JZJp>=6TT}`AKaLtgf1_QD#bM=OBRWil;)oFTrJvFZ76{lmz8=>10G`6tN|I#rf2TrBeFw% zL5C-4r;;$21e|FBfuYy`KsY-^V?t3x<-nF;XiVkO>)Ky>r(W$u0?Oc#xmBv<|8gSx z=v-l5C$J~FxGcGO~(1;**io?uE!7JRb3qwV8{xs|hCMs?i5`<~&;l3x<8*`v9> zS;6ECYtiO9ssE~Ll+*0a)vGXfNVGQMQ;l2dbt8)+E8NsYl=q9rvGKuZ1f|5b4Nz@J zStJ|Jml zHDxT$UE2u5Ytk~v^__(3^xR$OVYwxDi8~qrU&dVfnHmP0g11KQk9Uf77(2lo`Z( zmS*zk=pcYheZSHmlOnmJOP1K2E9v7k3$yWE#>Yi7U#ISb)qIF|C#LKdvbuiHzUZ%m zM(=uw2Kn(+stvWuEoIQWCTMZ$SR~s6gsgFZ1VuoQLlH!Lz%=8W#b-tw6s4P2dT2Z$ z_q{uFNv-*Jn>_Rk)%4S(9l#Egg&{Y~XxERCu#qI>FE+QoYG$UG&iYR`^pW7`_<-kG zSmX(qq}5-?q`I=YarlQCtMsrEXXtN7ZxFI?ef0TPtPwrv`}P&MFJr4nP}6kf%td^% z-Dy%$$St!q6EgM2LO}aO#YN7?55xZ2{M@Z>Ss^#wJ4t5tm&B_x(XSiv5GNE1OWT79VqR}0$L$10>fIiHH|XjQx%ETtrItM z9391kx^QECgEU|Sb=Rhvdz6yortMC_^ULq?%2K~%RDJ2Q<64=Ns`B=?Omc+?=fvS4 zasL4#ivClIC51bsLuFMjA%u1VTz*#vNwUuaEqjL!sZa0S;2W4zGU^eQIPCC#GUa^{ zK%qT2GUDscRz0^dxhQQzgU3elIg(j0GZnYVuQ4+CoRdEt$I+!$yC0p%VE5@)zHXw- zEOG~r0T|SoygBCBTvLmueuaeVPUEatj*CTdYk0S`AOVzKyVSZxeT}?IrDzIgDb^ki z7E18-DCG~3`qYuiOft@VWC;G9Un3`iq&Qm=Ryo{7gFRw+gZk2z5DuO$vW7m|mh7=_r=HgmS9WFt?-ZQ!{c6DwY_JT<_ z)_FJ5H5~0tQP?I&z$Ev_%CuawgpnUK=O(INsbWVjl!(Al;90_O6c)@eE5JLPF(w!{ zlmAJ-+LwTzLMyX_c%gBryd3D3%YVhWz>rkK=;z1~3Ad{~kd7iMU$l4ZI@Sf?R}jMv z+CZ5*l=H{GrXhl-wP@4x8>Za>v=TQ7mNt_&+p#4OFNbZnYTdW}1N`WZ|m`3Kg-38kQ7e^39UbUaLCTxz* zFDaPmVtVzabZ_v%{(9PSFaYT`&b5e~R3spaC-=E~X~qJ@GfQBMziQ5m+=Mt{c=uS> z>1u7NPj#+xIGpp=_zD99H}q?}WG-~2zhOk|`$Nhu_^5M_4R*(6#cZzfmRRu8K_usR zhUxlJc?^)K!8qQ&gicS#HvtROv=?4}DAVCvJPo*^VU2S6ZiJu7+zxk)`0*UA%p%ti zEV$!533y`vLJ32o!-6F@sj(e^+oD6>5`SvM+DTrMa_7N=X6NE~bxs{i__$ypRBxns zd^4UYcn2w*?}IYDfsS?zzD!p}r^s^n)s=E?&VOa;W1If?qaq&Wn+^y08cK*sjC&=k z`YBcInIQS(`^DQJgnuz=$DnP$&bSa*uB)Q=!x%SxrU+#(^IKeVKA{)F;|Qg`(ez^3 z?+=E!hjTurIeK(J_LW`NC;p6?BX#ZV&yoZ&_l5jXd+2ge5uqUt^|2zzlkTlMDq2^v z)ub}1lFs|vrDAF;YWlbSKm6AzK4x>t4V6DMNlw;>yeh_Cy-S>M^9tzDO+`x2S{UmY z3)#_c;#=I1f!*5+WsIaT6H`i^cZ}EjA$e^9Gv-kPqfaj+qC8PiTUorBG5K13bMj94zN!6xIG=_ zz^ED(==%&g5`BYb^$FEYhtOggaqXruma{a8Wnz)v5;2pQXorvQ7$GJ2SuJ5>;Rq_LlU|Qp8CXk5S)7$_ z>gh1PI{2QbPCnI9*iVsW=oA_4F@gS=>AuE+R=s2m0c`E|#O)K!oTj!nl2rrx4?Rq6 z0)%SSHPUGDxIgsEL7{EDb>h>?Um>H;t*1oTk_3_yB}?@aO1-}TKE`MnQWZ1|DV-dB zEx&(ly~^z{ZIpZ>Qq+s(Z2jP+y8qvbgL?QyCFyOjycuH@EP8-Fjfa%KYQ+Q zZDV#*EDBcPNu{6t^X&<&XgxDTS_uRnTJhcQ^gY?I7My8$zbd#=eGZKa=e<`@Lvv%n zps*p2NH4OvEKYn>c{KI=j3lqeEm>m;6&*`1F%-`Gsu=T5MP|@0{`JbV|8MKm5$eUB z7`FbCi_{3y^vh>{30vx(jF@jMd;-fBIeYp3ZD zOA70EJnc&|UXAOMm zQ+xc3Z7!cV%Dnrq)UPXQowT_mpNCH=ts)eyJXIS)KY)*Us7PZ)gdeEpY0&n%MTP}T zo-WS1HU~;FEA4X%BshMQ=B)WVjut>h-xIHeXL-3@x|#XHkatV=Ay7p9U_w<_Bqg7^1o;Np(iw#T{RhY^OGwUFv4*Q^vE?}l%Vg2v7a|JcC|tcy4e`USNQrMR*e zyi#;s0+%Jk*$vXN9I$Sidul&gypo6eK6zy@^t*b~!}GZpAO_stz)pkZ1!1!g18TH7 z1r7w9xx5=bF&BS{&(avkd}EOUtw9m>(jRnpANrXjQYmLBZ+dmA1VD2=D3nC>cC#>s zzW}fO2uON88&QoYZ`YrOTUy$(YK`ZJ(Xq8Y7<}hhJ2CB0Mp(>$q7L+PL?i!ieBw)LUpr^beXHDBFVwUk-c_0#M5H>OZo;Tvfj76=M$JRV&RiXaautE{P19d1WR})#fSzo@IeJZK|Nwm+Lhk94L~&?$SoTtG6+) zmA7W^ADOk_Won;1pV27{nP(%cx+IgH*A*bDQLUD%Y7p{r!Lf3AY!pS2R% zt<{DiB{nTjflqdw`|_G7@YTPuSOUAkiR{&b;G1SfiUz8sn2_wT7(l$b>?qZylDgmV zZN8fT{!zioFONmSBi&QHzH~dA>n9B)Lhf(e`hKS_(O5UweYq1S|153Xt1VeQ74aYI zls?k9X)AcRMTr?p2VlG!wG?sxuMKV*nef}^S1nrK?~bY`wT)h}W1%#_Pm;!^l-12{ z110`({PK9r)(?EtnpM2C5Uvq%R%dd}$lP#!7_ndqI8QBH(6lz3bh?$(&3ir`qMDWT zn3dENCq~ZUf!4gS^)STyy36`nT>W+m70E+KO=Uixehnu0na1}iu?hn7U22TkGnC4v zzJRW124>VJ`kXb#bF6qToemBj8I7-zaq6H6>w+b(i8dq@v-Q(uKOx?IrA`~SHdK}r z`kgaOa^LH$rs*G4?((k_dYe3-R7$eD#m8@q$T5Hq+|lU4@NRm=)zP(6gi%cvqm#I%^}kg3j@lgU**lpyd|YHJm@1f=*&0na=(gsBqRo zMv@>Sj;RxtFL!Ak0lpuNw(e+1@glrc+iIGtkm6*tVjt`>-n#DO3;xP0RO5*qkqi|c ztiOBvIZa>sSRoS9<^Q@gc4Jf=UQ+-t_vos2(*Kocs70cV4`7?rDOKUCSH*D5ao9iy zLkCIX)Dh{@_zeqyBK?c^Ox4?fDrCUHiIgMnk)*g;27`n<&sq;bT~>guYT z9no*$W(<|k*VM=EV4FmW%7mF9Wv&=jj^B0fM{v>-e*?KkE{uzg$h5`RTT5M_xR2~aIKQ>MHtCgR z%9PqSbdjg6Wk*YXWjv-x3~28IpLOcN(xivUQ8(uP7l|YUD_o1$=}*62jYp3WWds0jKMY36LO%+e`3S zTTNjy_)(vY6OMsfOp>J2Cn?yeae9}N$Rt)~!3`$UhyfQ-4-#rSZG40)G-&Q0hYim- zMfNzggm9Q|-pRT`!_?c78-LC{pyp!z9ty2e)0ezH%plUP($r27m{?$rYTCEr&sN5X z?iekO)foKL+K&N6CG86=Nq(CWSI_|!zK9mXK1Vf4bE}a_+;(kVcjLm;WZsYYridA6 z(}qh0>yH6r!mMihX-Lc|GBXe0AY}gf+{8Z}Z8~P2i$_nEK$wg^f%{U?Dx!Ofka2y~bJ6KG6tg9Mz zQ^u4W5hePIF;VB@yZ2F0ZhKmbcr9kF@ce%k zfI%tm^$tp+kxCz{M~DbO%bo7uUf(6Z~?f^iBpO*=qR#!Jnmmgg4f!& z55Q20EDrxjB~m|(3h1#*-APvQwkjHnAXVA=wGHWdasFHP+8BE@egrJp)prl46`Ak zjMTa~KMzpXOLM(p-WQ+{ZRDq9U4VI$c(J;a5jmbBmSXMTw!~T_Amf0!42(foz<=PfXRAMbEBV+1;p zz0Z-gjw$Y%K*79^vKb$m3_+R zi`NCWg;W0*3x#NP?r#HOm9>fZ#3Q`ddKt@DB?KYf@MaT zW{Eqfrhy|Yivzawi?1Hjdu8?sNBX!HQWakL81hTMD5O779*1q>s^%dqgBxcLU#M59@5RB0(WN!L z@Lyry)m)Vtv0KKlF_?y+I!;Wh^WZc(6*sKc0HInPMrU?%ul1m&408#{jk6WOgi==7 z9k&U>jI_dH`JkIZx5DJx-3Ls-Hol`d%Jl@VL>RNIBE0O*_Px=R}oLt)&TR z>C?K%xMKR~6#vMC3KeAr0cK%_?!m497Bc#<$1QnAM z^kB%D@e}`tAp&C=N(Cfy)arpdzGK#6UK!w$YM1 zwLLL-_PDFY3EZ@OV zzC}o4u@TqooZmq+MNW7ajaE>)75A)EUx+-6=@V;fL-5O)a$4S5ON;ml%P_PXPoXc$ zFA<5MG3f;wRD5R`S>?J26FCEa4+rMqd0Utaqra4BLs3E|$!yd?y~+T2((B0E_Xenp zexzp?EdT1AF*RE% zu*WlDroT-`b+->?bV28}&>@Y&;KSq=MET8i+`@Qn0^Mj}A=!i=1Cwy8hFLKJgPIC5 zz!E_$rx$i!#q;b{+M;WYR+*A@p=K!>-;10@Y!!`~r z^~l6=0oTGG|G>g^zhrVmvR()}`g&KgsZGu=Frsccyr)kw5t1hlMC-yOya$e2Ki4OY z?ID|gf?g9SOF+Yao4T21k+alCTjHE)D%JN6GV$>Vg@5X26e%T7+fF`!eN!i*f9Fma z=_d?Pj(WORa(-Y6HsQe3DC8XKP&n<@%3y$H;W*XI$29O2va1N^qB60SwMs?ihgfk+ zUEH3Q@W^H}{;5?9)n_tZRU9kcHQKS|8mh~R5~$9Q*?}pZN>4k8N zsj6Hz+#`d^w?>WQb4}EMgqujYqwZ5a=qdTUwzM7gSj!igjXC|?1Qc3y}5%`aD zkvj7Dbh}NZtCTtkUeYGCcmBL~|GNgJM9zPyD+YuBCMVm#oY;T1)q9!AOZ1fgN7Ffm zW%j*)JKMHhcdm((jmfrc*EiQ>8`EUhWVd&)x4i{_ppTeH?q?T6O=-F2}zu#xv>$_Cg0`b~M-SeU}#(kJaBaV} z`!kbBZ&{A)lHl2rl%d*9qzHGY=-6;RT~>Ux0$I(KlhY0iaKdrw6mA7p#vJQ63vY@9 zRm_dc{t$gqCxsa|C7MZtm@7YnGH<5M1Pb|%(p7!Xtu`3e2;UTXMdK2u^M z!`|ldB**aiIVRHg#Y9-z2F0}l7XF3BR&`dH;rP}DYjyKLI+Z*JPVX+zOe`5~MuK)aQoz zPr3dw-8KkYlr6Z?b_%PFs3xvp^`Yo#RsG?_xrcGQpeZ!=%zTIVXp{X-&CWEjxTc|Z zW%)J}pVkWy#?xopSFoV%ulGG(XX98si7`UhJ^gvnMHMZz5x@q8|0?#OP4r)GDh=Un z6+lf7Z&}nfJ-Uzb$Q53k$4(=%#f|L;Mk7vmo1z_qjhwsBNBIKeZE`X(>-(>O9|bnn zfn(6*>3o^k@w9UGO~Sn?e7)f&+T^)?+PB%59E$0*)YDwBrB~wO%G#mu*Dn0N(!VC^ zc&K4|P?jk7!+OXjVO{3r7?rrck^i2=4o$FKuJPI!l)$$xq#fea21K9y8VN*wt$+#D-!Q6k4n6 z{`mW?dsas14Qd4y2JnA3eKEf+NK)?MLRqaXG<}5-y2ZOFUhld`Q zUJV|)4gy$Y9grhIk;d6gr36Yctd9=d&1}Q9Tunrm9eAu!nItOy+w}5gg%9D^M)cK% z5t}~T&?>@TD_}+?aZ?m_^o{&SL*jy7SdUqhs}lum$R>1wB(zX_2(dp%oUuz8-fn-2 z;S(7K@%w-viy?8zr8s<5(8Oh@pOmJ_W2$&M!|K_y5ryo12K7Cm8ldF&FSjAo`0a>p z`|Aq&HC}KnQp&aB^FHq*`6Qvw%?Z=PV$>teoig-x;CW;EU5}LhZOQRn9hI@Ogul*+UZU%7sM-|A`)Fno zuVb!l#N8S&Qdrgg>AyN|kY=I2sv_Pm4~~37o!OfbU8{1WjDj zcpR3oF{7|3Ig?_NZ4K&~F^r{E=UW{&tzqY<;-Mh&)T!jIG;D$qae)rkC@$9RQGGig z(UuMrQ}w@I1%NfxT!k%B^GRKxI8g}l+}4nF24jbQFWNH%MBP??)Vk{6#OQ)3%j=86HM^?Clfzj-Tf+^t4Vs>$ z74BlOC9APZG#*IQQ7};Uj{9+VFbpw0ke4RmU>xaKfwQ>HMiq-Y0qw_&Q?(WI5dGT@ zlx4PK0rMROs}E??k&zl>^mLPc-H*0C+=kB$VF!YiA&hs_9)>qjnp$Mv&Zo|g^WGZ* zEYvLdE8o?_Cu=~ch1zd?PovgDf6s;9OFtLnCu-YbI&+0NfRCFVT#LCZuDtBsH8<{t zPwoP{>o~8V0#{`i1#ta38Lyot$js5Zf5_SyMr7<@fZ<3!h!WF{zf zSVSWn;jtRk2x*X@QX)@+PSuv;cH^q)O%8_RrwVCPc?^Y;_~KH0@fGIF3SVgCrJjQxl$_47a`>$4IHl9iN+c zStsB0mc|@}AKXcdE(EReiHrdS!jRX`o>sZXi#0$|B)=*dk(a7Fo@fYiks6tU_h`!; zk^zfV#OafUsR|kAQO#0R%F{8gNQC3pWF>;gct(zO4_ap>U&t~L8ow`tF?%E-xQ&&V zu`fHC(wvy3^tCW%6RP0DE6id8mP|GZVXP%-;YCPdsH!_S@b*d)6(tz*-8~R~ovSFQ z&wwfeWgB#JLpTY_wc#`e^BFOIYF5xtmxJ>*xiJWn+nTgvf=yjc8ow;a+owLWnDMww zY3+AcRz5BlWg{6qDB&BwpkyIgMDC$b!a2M(xWe}Tz?_1FCScht+#`uhx z62j5+xEa#-bPiR$1ocVNMq*LxUo7lzoDE+#ibggSdBm*^W6()K7e>euV3@g3TU*(e zu@B7>ZF}miMop(6efM-HjiPoRLA3-ycy03$*wS%!m@yk$TRIN_Ss{`;Y<`c70THq7 z*~W_Hp;wnt@3-ux0GU4S6wQDIgYDcoW#&SUaFEzMnW z6h{@FPkJI!1_i=;f~$sGwU1o-yK+IQcn6O=t^@-JS%GHJ`KaQy7qkFDxgm*#2(VnZ zN|2ci+xjP%#v(3<3Yc(Gkqcvl4$9y;U(PVS=?OZjLgRBzseA zZB)dl)~0<{2VhE=qhC*y6g7Hk+S)e_FO4AhEI3Ml(wNPw&bRd>sd=}${h)kGD=4}* z7*$r}ZL*-&*!j2 zE_`7l*0_G-h>GUZgDsinK!4GSaOKGtmA;h`juR3FpB zm0r!^Ys~qEra-A_JPTRO-v}2vA>IRP*NuL^L7zH5Z=*5C6!^hF2 zm$t9fxZ!cjhn9iUFhXyF_QX-_lkARA?Alv4MbGtn(lQ~hko9u&o)AaBP`F^jrHr57 z+JyA9NEfJAGRX&d72!kiZhz(|7XPP)_HWrDrl5D)jgfL6Lrz8TZ#Vyks3GFeZUI5z zu(t#ls6WJavUm@WK+flW%bXM*%{6?Y#_TP?HrqaUPkb`A``aC1cA2=Ho#$J^0*s@Q zZOviANxkX5=s0bnos}WS-Q~^hs3ZB9%k7xH6{0QGrrvca_fIF(p4%-`6DCEHeuO(i)v8U~;C{b`!a`LKaQ5{q%f>vjR`zZj!@QfG|_y+=K0vhC=%g>J&ZC+PB>%~M=_7?UDKIzFFn4z9B^G$S z;CWf$AIe)RmgMy*Ev*i~n-BAzklGH}3aTag&kuNQypEHU^%{kyGgJ_r!S1DEB+KU4 z!1P&n@(#j(H6hlSwX-`mDA=EPOO31QW&;Fm`cg*wV0$cr1Ly?ySt%qPC2tF1Sd2mK zw}NAW&y_UZ>c^J)>1K5L9w`OH!3IS^O5e7+QRb-Mdi|b` zH``QqY{|SAU6>BoKjw;Uqs+al0Ab1PQkZDLDl6^<>g2SaXLa>;JZEsR{jj3;fWt!h z>eVSz+a7G&=jBob#cfZw84(t)r6!003@bjp#ES|1bH26& zhbB=*HAgt=7odNR%c$Fs`SqZc;jW-prlt|xUsZ&s7aTyFz=4j<094QCJ0hjJB)4GN z;4Z(04Ojko^IvR?X5bZ4^KA8>r3#jO?{Athg=FxX|I$}hl`Lq)EIPsLM$G<|*;eeC z$~WaJJI2b%p2n=&(s)Z{b6L+4Nc)kRo)6E(S*i%N8p>&_e z73>jB+qRTt-or3!2y_)1Nz~_t`4#OIh!-z1ur<-CXHc}(7t)w_+(WmZz2OxA|7sh& z%>j&C;lS}0G?t(i<0((p1v>M51b624;f1>6W;fevRqJGr0&=#hi7Qye_KaZSp|cQ2 z@H>=W1jRf${y$gu1g4%Brd(`0i*@UiePmaxCO~bK!3EGVT-Lu`@BV~9GQJ2ru*Sb$zejtSpj%%XJ zy-8a9J;$I_KGJmMuBvJme-a&+>vW`6RYE?ST;Ggth>T8NO2gXdOf1sDsJ>enpwQYq zFzdWy4L>~^ONXxG;o3%N_TgHbPkWn%GhP1rd#s$kT`P}=L41yJ48;8o8l7GIkS&uY z#ChKmKy{b3>3X}@w|inbg>fHANe=T51mHKfM3_TlhJ+XxhJ;s&6o|KS(Pi;}k4ovU zlQy>NhVhbEhkjhgSVv(jQd1Bs9-duZ6%s6*>mq{X?qOP;LFWYv5D4+YXuDNjukb`uy<4DN|U)3MEo8lL#0AF?3aL$2efO-An;Mr!cgMsD;!+;<{ zU(?!2yL<_kp~p2^20MvA)5xa=`-BRUiF=@?DwMiN@6{=d4z>h(r81j;+NDc8Rg;zG zxvyL9fvwoi1GbMC8Z29rJsYsvLozLr`LC4iVzYnCnEd*acjRgJyeBEdiE;IX6%EillrMH(39ut;mb} zl^TAv!R*@pdEZYN>W&)Nzj0eCOU_XEq@1ceN`IIF?WlAV zRN8nM#*&9@&Ut|)V$?!D4XZM=P%%wt9h+BF+Nmm^RI_;FA_a4sg@}pgim{BQZhKwy zgkjahT}mFWU|7#RsEH$nJ9-o+gsH#Z;al4MQddtcz6x$|l@&bFg-JI`iAh^I8MeK? z(J`oo?O+R){9n$RgotS~d-nVdk7M)9FT@g6H9onG$&fZhn*`YE*9CWC)=q&{ke{LQ zKY?LusC4#Uw`@9Ba{ip|V`}3phyYjkO`rRhdojzS=-Z)nZtKYMkdYAtNLfQOj0j}O zco3?a)CH~&gf?e-uvzUej??C7ZYpc|2le(aK5PB(rbO~_=DS5TZvy2N1XpT@GN9d0 z|3Dv{*vxWDQrf6^yQ-YHHanqY9uYv-z*vgx_ct*ZuQ}qF8OeBIR&*2JC`o4=DQyyL zYVQMvi$8hZ6n$<}hyXK4SLNmK9TCW;`mg$GX$bJajM7@pE zAN4~$4qP{Ucw-)#b?m#2ZFcO%6y|7u@>lBv6huMS%d}WO z{V?TR97})mHEiykmc2_>E-94A1~lDN(i7nGo0vJJ1xIX+6;K@BFkxkXbJ1XkA9V$h z6rkRCY8qmQ#I`@2eQ^Jntw9?|m95S$Hbj+riD#K>y3WKitK#rF+ zN=?$$iPfcgf0>iZg%I3k3Y`QU&F=MecDY+-xM!Hon>t~6pW3w8Y|A*b!0Eu48-4(~ zZxP5;fdH4T<md?IEpCl!w;Y5r17F6-&4Q9TBgXt|Etktu*>O3xbQ? zqQBVvReq}zaTjwp9Vc@m>Y_NQ2$ZY*MV01hKLIPMq3>~S?~sM=sgaSmo&U{fd1V#b zUc_Fei~{qzBuqHc2IHs|Omm?)B6OEIz42haX)%S=HOcl1ANI3HVb0L(yWkpFn&o)d z={T`_QhN;O7NzIzPooiEf1`Qd@YxywxLHlgJVyie!ve1&>RcrE?wY*YH!koBv&n^lvQg9rKg+8zK5# zW&nt9=U?qzDgCTJFSv`F+n(}L>sj$|C0?D`S`m(`?9INfHm3oF>mIv?EuWlM*>#>UoC#?aDa#eY##gwuolFY?fKopG3~fdrOgFDqp2Kz5d? z^9t)qreT}6HSwY~x!)J@e-r+vLL*V7kziARd##8wOGJZ5mpJlewM}mTBT@s{4=n$- z)c@-RpoM8}D|qlFj48#AV@RZrGT18v!`-Q8DJ{J`O&X4C7+G2j3k==jje2xK$Fe_b zjTSb-3BFn&oPp|mwenEB;os3Xx8eN_06yFP+`lAIsH@r_Y~6sqT}Tr~u5SI0`0}6U z8fNt2Z+*OD#6Q(@5~yd72@Rb@axLd9%fzV*M4k1F^dgIUU1*tQYNWm_e|F@<#lE|X z`d?{PNKW$W(EW{QPQW*PT{2MCPxsA{@^@h9@gB~tZ2kEL3gD5ny;#}vfLs}JoQVF~ zFj_};5(frHWsA3z((79~1Xns)R3dFUnIZF|Eq;XhPo7SV9M_%V2X7)v78XuZRDF)Z zB`Qto(%?<;9H&y!FP|$N4SBl1D*WHrdIE$oF_qD$!LhNh@v(?Rl%1eNoJ1vr%AA+V z*px9JL@`Z+4S0U=1O^uHKt{n$kxgOJ!7=a*<2iOdJnyQBzXj3=LAzAbijl%ocGx_SRNLSucgxxMw! zuMtv3On?|Sy`q_W+ODT(<5a<4bQ=GEn>KmG`M~2zcV3IrS8&E*k5I|Mbx{pB2jC5P zQ1eL1(jh@`$=%)MLoGxz9mIrRUPjCw$5rg}^)`E#OZC=oGS4N%DI)`+ZGE^MTqO-g zJJIJ{rnUY#vGlefDdXb96{1@=@ORDlgsHv5A~>T*)E+nY(0w(F+gfT%F)m9N*{f@mDLt{jE*)h6sn=!d~$wboJfmtM!Q~Wt%G7^lHUJv8owwXdA z1+^1>q>C?1ym*-fvFz~lJ91XM_xFRap`$D!xVpHGOqtmQbiH$>< z*ly?^3F{I&Kowo6)dU{CFjp*IS!eVxfQk%7VB=7Uxiih6!3+goJJY;hpYJMPd^tdD z#ffa3#JwZX1?dSpWtMoPz&0i3!fUpK1)lrivRYr5=#7uZ1kSaGYC-k1zylWr%K2>& ze@eAgztv8MmZJCbtGQFWl{LIUQ;G;>sjdoX)r@IgWtpZ*PPg-U(y=B1@^EEk)t&3- z&SvBi5r9~}P?`8?ZMQC=UgA9p&fVhO2)pXHuo-!9_{`ZZv1~6kSPmjN#o)Ys|1dH% z%;JjUdFYnDScC;P0kT!}xw515XZ5OD7MVxIJY8yAe&~usd|547L<9LXG?zw^ zl#`OK9iq(-d6`gzXt{QK>YTM}g;q==-MZrbQ5U`YtI*EM1p}zmhSX613xNv{-&?9)gu^~!Ar&PoS{mRhmyk)jc{);XJ<9usP?9cio4RlJ$>xNB~I6|nx7?L z>zhrr8Ho;p*E9(;%`IVu=Vr#sdnFxWR20#IDz2&A9%~8iCsS#q@14G^hRc%Bpdy6;d=j+3PuXBLr1bb{B-(wve;62k*W2)Q6|xD z+I%h}WU@MBEy}&`3e;y!A{3@xTyobAgvQL)j0QCBNI-4!9=+Z1V7VUf ziaTjzyW8|$?vBmkboM@abr63{AI1+r41}Ockd8e%H(8H&JS)sDQsltE1bpb$aWlwH zs-4KuT#^v$$*%7P#{9NkYpzSLxHanr&*Z#!?R6*tJp73rG(@6t5~xD1e3KS8`?)-6=5TCMG7t|+vn?eFM5>u4qw zC7L`vg}(Cad4*@LMKS#z*nGrJ^=VCe1U>fmut5jA7?{E1tW*iXjVx&hC*uE4u#}{E z9cOTsxS2=NHmni)dXaA4zU8pxMcH1OuZCV01;|Lz(^1%z(iA;~w>rJw5W&r^z`pUyP-+giHUDedhKH_fQxrk*&5);(B(`erT)m4WOeY9_SZcJ!8xr zOheQ0hdQs4Z`Y2K;EeN+1pQbVyTpB&s-1E|4FGQUlwI>f`i_~5eCx8rgnm_o%eV7! zozappk~5TAe|WJS^H3K(f56&)IetEg?s@%`U`F)vXfs48dLcJ3-LI2>R!4T7fTtvr zq*aZ}@*taDqplIR(Rz#c9aC1m92*0{Zrrd4z-=jQE*h3s%JKGPdl<%f_<`_;ci`+iiB;F(HUei;2FU^`Hhg~`TEd@7H)UsY1lH=)e z5S;>u^P!>jX{_1wc&x@trTKmLn@g*sIknB?Ue2e1#*d~rS z&Zo9bL7^jkrd@vvZR3P@Ma*U*FmWv{lFixntj)Qgu~U^wXb#d~R4Wqw1dg8-N!PM_D5UfM%YRJ|w?u&3QYD*-T{JIm)+`0}UN=;Mp(739n@Zx&VSA7Ae2N z)PctNlrz8aG>~86gBn;3IBdsR=)kNl=A1U%=kF|L(8{PK|JgI*+!R)+6Z#)=rjCf; zgza@WpYG8rZu#qmJRpg!v^55>TZ#%vOV26JAKZN6dUihX=5+ybGkq>nHh1WZy3lPD z+X9a;2YDOfm`A3{4=>tF=8|#9;g+eSI@CTiFj)Ch-??YdupA21$LZFFno>336qA$v z3Y!2cY_D_NS6PK2sSW!bl$#0JCUPG9p?<6!rDuQr zJ!y3?(>&%X-{ch7CS~-PwK90yD?~@2pJ0@^Prp|GsyqB3ZenCK5nZ#I*4gImL!zmh z^+;zwwr1o}h~^!RIA2$Nux&blk@C$^qV*#CfUN|j>z;Z3u4KVeWMh)Bv0*;GjPh5S z7g1pxwa2|bf!i*H;VF{vUN?1eT5ZbOUdw>LPj;gcN6hdJOEL?{#FEh2*lo0P^Xc#6 zfAX?PF0R(c7H}RqR?#v2?HkGI=L#W#?fJk>kW7x9&=CFDCC0rRVQTW*M;xzgD-XYj z@I#~Pax;$*MG;E1aGAnS^Jo8Fg!x?^-71Jl@(5?^=u<3wy{9E@1AmqS7bsRlx)y%k zNQ(l$dSI_LuPdLa?}bTfa_{0s$4JyRL*(xYU+*Fu`R}BursJF(HIElB^8})$B-r-v z+q$6y{n#Q)){1~NZe;t;O8;uWsXFZt&Duyga`r{hA1ck@Dqi&JIlo5a9(Dc9{vNJ@ zf6=i#OC|3Gx*xR@1}{zMy|sWGT(5LbZ`}9xGsJYMj!f&`19exE*j+qiKZ;~TT*v?F zINuILm}B3Y(h@iO>Q5xQtNTZRfkrw z(i*p?s`lv^Q^TPKiy$EHP*tcgL~4uf1^<6&{h9sTFBKRy^YclL}tP z<=MReIpQ^Y8x`eHopr7JM)_ul@vF3U^G78zs1u6tPf9c&KQUs&YYXO@PVWI zUEy}{<*tYE23}P3Ns5Vo%JnMEV%X{aTBE2hv*i_8BRDGE$*cv>4Q8UAded1FhHus` z;Ag!o`o#haySd`RfD(sWwJFA9Kwcn&{jM3AAg*a3r*c>T)EE z0w8b0eX#yWk5c;ZO!g-qyfVvS_I+rXf%&s{&}%jl7p6C>7^i`#T?J08|JDzkuWov8 zXg$AK#Da8qzKAZao5I6Z3g`RSo@NAB5x69X`-UN>#`*K;|DQ(0D6y_3hMRM8jbV)T zkb^GFc`Z9{McfLE-74sW_+7^TOJon)(W?ywW?9TrC_&feK3pLKw3-1{BRj3@Irha5 za1`RtQ24*Jbn|%%Ka$C&kpC*!L*LOU8rNyeP*gKjkIdOS&2$r(d+o^o(N+WDK3iF1 zB2RTL6p~ZPFz$(*EpYO-JMS6c^4(>GFS}dFXIdfT`-;)0_DSE*P^KL4PHwNVEz-Jh zv=6S&^YkY{efXe~zn%O#8lrVeU%k5L@uaSPjVV_^V9mkDU<*JpH zCX;y3Ds2@Ok)q_#b}>`ZNtaE>6W zkKt`%cc50dkR;1P!wcO7Hi~kEwm_8+YtT^;`bZfznc+%9K7YxRh*}h?!8EKf@O|%z z;R7{!uq1+JXpH}!5z+#yi&B_=GVnr=uGa|Tw(tU6(AdI7jui(8`q7EUg)_`*k_b>! zO;D!9tc4*8i{#b>Bh#|?R==p4b_m`Q$$%ivq4xFIX>JMK>)R7J=pVXVZ=!5@64U=gGj}^=^?67$ zQt{sMgQa5iFiRU5Qb`!3XVaM`!khGLqg1?56s(}5&yD0-u{?j^@}w-D+=I4;(le)= z5Y!yEHoN0^)hd2Xvz)8oC1h7xKEW}5PgN}PZuAAym-Q)j+y9LJRszJ+Y@u68ace=Q z*8i+&4){@zm62Wudu|B7-*)@_#&5V;EWUdGirZ3TY`U65`Ak3gO@GC4S8F5AloKd| zTXj8WhyXbC`}WywjIk?>b(<`pr&Xfw0ZX1R4Mk7vNXh!@R6YHD0vg!0zME$T@28rt z_Rh~~9IwN)eQl*fx{ZH0VGlvsAR41s?^5}$K6P8;QkRX+J91_4dQVMOxN@NGK zC0!ImaqiZ~)d{^Knez!DijW}^6{L^24w`c+S-7i~_NI&__!24cGkp;W`g>z~vf7B( zv8ug1^ZLO|N~2*~IvH#cF8H_=R~w6eNKH#Km?*8XEZPlMzWY3b#=vXO=j&I%*4Kdt z_Aa^BD=pi z6_{kvb0yZqcfXRt2A?m>LLWEr0lknU39U!{80zl1WO|j0d6mKi?LzOM#L<@+E?Vi} z6tNVl?80=8ecccGAbUf_-9L4GNpGUuE4&-PW#(H=BWh=c`s z_(&g(NtZ5t=+D&eov`V*)f|na&p_OEJM$vQb!_wkK_EVrYkL&?v=)6E=ucp7X)LdL zsg=Zc)8ZrZp+D}Y*9*)TnvHh@G&bIBm|}*(jIz#Unt5kmI(jY;IL%p!MIS4VS4qCGlj-Og0qAkCml1>poSlt)Iqx8?`htXgmDVg`n^UoF%d2vUf@w z>)TnhT`-6^JemPDElJX}7oqiM+@N!CS1FyF_D7 z>i0h1V2dTR(7}z9=@K=e-Qi%=K*t4E;GRxxwBM0<<)ZamD&;J_AaCKE&qK4ZhuBGp zYt93POMaUJb-{{ z`EPzq!#D8eCTbn>(E)EDp&FzdcD(n5DGkaNLtHhZ9~FiH76b3x{6}e2VTwoW+})Z^ zpKc{;#hF!OG#v2j+}P)TZc4filN)u8(comj18(3G>VrCzme8Mb2a@z$ehG^+%vbgJ zP=qEYSl}$JRr)24nnMm<@rnm&pMRbjr>y5^qDSRMGo@~Z^|^$wKz^laK2B>tPQOO_ zf1o_TeJtTOanz{6IqAB}^ZW#qg5`Alq?$w(+>o2E5C8R;z2>9L51+Zo>~9@YT1FOQ z7%N|qOY?q<{K0-bc#2u}6Owh!WmzeYUXY+~xwU85w^OP)gwOZ7tk~eOKE3NUwN`Ea zO903&7$;7ALv2oss1VVjpgb-348Ujexj}Fm@Hc0)xpJNSiT*4Y7|IL+K~9P<$U=C73JRyHvBoH(6^`gqPcQhJe|yR19u(oWN#)R)a3s3;yaNZX!RJWTh2 zr|WU0ERJf9XncEA=bE8QuCaTKh^%kP+?1u-1hIGuNrKuG!2@KmGo@;)WPuS_U3V*& zhdL!t7&Qf*J`i}wJ~iB3fjn-NX<8Bs4l!pj`w*;YWfb=4Q&dq!a%zoeKQvOR<3Q?a zTkY3h(^?PHT0e-yjiHwh*q)2&GgH&9@v_fGbh26&8__u_6Y%BkoBd_xOZu$Qnwsyq z{}fXH#sa31=~_oG=}?HKb*;Zu7wyq);Nv}M#uozLVZuX<(=13ou7BPU=E~vYpg*k( za-+vqMj~s9V4lxDpxjS^uQk}?Gn}am2GOPeI%9x%LoT>3rFe!Kr3S=3e`R`&&IPbU ztfB_oF`fItLY&>`#K=*|;Ggmy8%sAky*V&;h?*^Nm0V+P_jC8JeE4k8jf&N`ufgSj~2kkuSqK{(37i#_}NB_I*Sr(`&$UkR^m3!wGHG%mfdg>VL3ZSM0=%HQQm)}zL5P?{tq}jBoXxQ5+mTmZ*2q{ ziK!=K>=6 zuflvOu`*16;3Y#xvtM8(yiUVL4w-eZuGq1KCvM>#QD7q!No0k)&bV{;!50H5MjfQv z%rl{(5dn~#<`g!%MYMp3ePJ)5ABD*HG zS?zoq_W_ZIExS%szaOa9r(@?%l=GzwRbZsD@cjL$oH*$$bp_pAY}F^pKDh zlA|@!X!6zW9=;DNuKdpONyi$TlYZCKnmE#5;9;$Mq+=9U*%HGrG%q<^$5*#75{J{& zZZy`VAl-q`=*H)CAe{h+*AUEmp0K=?1s?Nm$lf|S_cR0tYx$EnTJ|iCjn%weYd>$o zndwKtRYz&W@m|jjYCs^N29GNkkpwe|aY4OQ2Um$`947cr@*X0E|4Xf!B+93=IRe*n zuabzXG%aq3Q1c5Uk3cUcoAERQ?U`+n0CDmtJk&3Lq*5QNeEgm_6elQK-($WTD)UUr zdBaQb>s$9tY`1Tno2G#rL|sPs0Y7XRVj(I_Q>)HI7=5NiIF0+RBJ{i#{R&Q-37-wU zHYY4AiK_x+v_DZ_Qyv-Kf2XQ>74(&Gf@&`i@Qc$@Hydw$&pC=f5 z{si+oA`K4|;J{CA4bfb}Wk6?U{m<>)?)SJ`Ofw3+tr|LvVe>UpO1bSMud-?^3=WEU znDLcE9iF4=VELiHSUC{H-_c@RLi|!v&vz+%=K2n2(@97llt~{rKpc|CK_ z;k};aY{=4OK{0-5E`E6JNGq|3jTU`b>NCaUpw~z+;XL~g23gxyrz;e0mx4};1rR^t z;`0?apOqL~P6r`L;hCW1W9|}6^Xy_GO~3o=E#+b4@cr?(lq-Nj=&>%o$p@pppu9es z27*bwv>?fC)@OQLKmo0Rb0bCRsQRFP18(RDGl~cOq907LDvtal$vUffIcMatb(fM~ zXW@SUsQ%lGfLVFUn`>ql`-3IK!7H(6G(XN55fj1^$zk`Q@tf> z^UHe`*;SVRSsUE!mzN|1(%Zae1Tm@05stU*?TmE!i|B+xp(m_%tZ3*qQb=R=ff1p% zYZChGb9#l}-)QL|{?nBTslwz>OT(jf9M^0dlws`GoI%p0oU-!7OPM<^k>4d5BpFBd z-jAl6F9)P^@Xm=GV6)o+6m>PZNt5%U$%j~O9Ov2~C_T+E`dMyjeBNmd<%UL6;=8H4 zonBD>=?1_bPxYy2_N_-tq1!(CpHBKifLA^{ICq9y{Y@lrmh8iv>^ue;Mm6o=fG#D4 zv#oZ*aEuU_DMm+w;^Xn*{P)Z+c3V+H63@)ZoVv&tm2sbgrVHw_rgr#bvc<%@@%oBv zupgs8{BOU~=A*Nm9xV}iIp)nL4DNrSK5$e*{BTF+D;vVBSfblrn8&G#auF}8@6#?X zp*RYqWhIzoVQYt}+|sa~MvNvRCcG!&plBb%_OX8G|H5TIIT(~r#yh&ma@Sm^Ri%qwQf7FreN9YeA zRL{oUI%r|UQ95lX(8qR1!u2WAlJ+VM1F{TrpDsfAOB#ODt0{7^6+aaQdyKF8X?%`A#1wu*IqGT;`Sf~uR77;nH&vOa2fuFntQ$LVQQx<*= zqV6&i)m4;nT3o zW^r*C4zBaokNOSIz?J}n6l24@GV74{zt+XLb%q-wpJrf&XsCOn6uPAp_@z{Gi;XXP zaY0=RM)sX_ihtHa_mw&HRswa}d&-sP;%%9Uh%P`49xxC#cWMs!o2VbSc$T_J0znWN z&XXDCrD>O&$jnoi1LCLXYTTaw#@! z=;C#s%!j8!;??@+zN{Io)wjLzTUcU$FK>kRkEx^@sP0onX=oIiQobXH*XcKOj<<1U z<8_XUeiZl{)v3Ng`GUoCJs^3tfF}#Yp3rbjmB`#3Dl!W4By$Rv!_e^06AX|npBf0{1MKx87 za1MRrNvIo-bFOk(P1yPVC^01v2HZFjH{G}Z*!W>`R-f%@`ioz_m$MOYHmx?isEEud zg>zj}u#*XZeQlxzCz!+$i8P@ke%+O~yuu%Zae-AwR?5pCEruSs6( zZ~AcJ$qA_;F7cGrhlorfGUvph?zBnCXcS4C9+?sM@zSzuUQLe8nhOKOJ`K9G@_uKa zE*qO8X|V+KwEtrRym^{Asrs}^bmji(v7qGK^KE!)g}ePPDP1cp&0+200^-C-Cur&x zG^xaQ#z7*)Pon~gDejixzMAp_q*_+Zgt{9EoJ4HRv~f|RZwBZ!(@4DkkEXNWYP0LM zC{UnKD8=2~f)puEaf%0bch}-j9D=(PcL?t8?(XjH+84Ru8{__hjEp=dIoW&7H6`!9 zOJoCc)zWu&qHx(%Qlx^k7QcK?z(V; z+J8S_F&;gC4JyXAY;?&-YRIQ=x%YufciIr2D1#vr8A|uar zjnI#I@Y@aZyW{I7bIc7_O5F%PmQhfu=)xvDr?u#ki^{EJx)|sL{TJc*Y>v=$geRF@ z&hJ!-#aw;JqC*5pKS2OiS1h%eVEC@_X1&)Ru)4!S$xHQlbtVORb)WU>pvpw@GtqAP zq`TbtVJ=z>Vq&hr4vrT04x$nf0YXC@-vm42=%j#4Heq*l^SJk=r(WkkFqW%dShioM zu+bj&puKF8r(y{gqTdMw<&KTyqS%np2P`Fdx~6!9j9j!$-%_R*%;hciidL^KqZ4}rY*S~#3El?V9>x0{nL5`YOK1y zBu#g>rF3)Ik)5rY!(f5ZheNqpkwPM;67O$1@tqMp$jwE|w-J*z)8{%|&w6&=yx?IW zq6qrZWvAZBBXz zjsw+{8V{l#JNLH|mzSFm4eU!l(`Lz^uJ-*^yp$&<@PQ^Q=8UvXNDWmfA>8P#!jmj# zCaj#gL)|30l9jCM_n=sNx;o0aY4V3Y>o`v_@`S?J7xZt~(@l)*Fk}UUAlAj5-?;gR znfEAb>_QcP7~79gP%lnWT)(XU`|FQh0@Q)@NM?zWPhgB;do2cKjvDng&fBO ztzOwA_pZk9C`qYIw((HsMYBOiB(49&OCPG?BYL4z*}0TDGZavI*dMA3;t~`vMsQ5# z`h4u}KYTTh+AA8hbEU;M?-biF5&3YT>W6{+*wI77o`;Vs$fGVpri6@?C8znR!N|5i zRdTP<8&G}4_^(K!H!gPdOKu})o;xZAn?x$sutMNQO>Rms3EHDNOCe0fh(9P+JSM+! zHgxAEGOFzxby-qgcaGCOoZUDgG2WSZ<%&Ln+s=HLQGWsVz%7D~$6PZkeU1uP#QW8A~@(TT5%hMdFHICD&R<$GmlJ~l$3 z<(2w>C&Fj%`WU`1TD6EX))>H4$Mie?Q6CH(Deh`aLC(+V-}$H|w3Zif@d|Hu)>{nh z?CO6cHcT!a{m!PmaKN9|uv~@;2(z<}b+D@b)>tWQbp&|&UzknQyw@E z>mckiOfaUVZV&~@qsn(mRT`w{H#k`tp6!J$cc@A;sO?Gxx}|ORX(_NGl6-qgwe^8L@g z6z1ksB*a;0K)*9?8_ma^OG${^X=I-(Oyk#*;nbofCT`hWkDQg7-^%|A$Tupi96zi@ z+V(;*%b)uqp45)47UYfz0E5XKCGD|a%nZKwQGYf|uE3|LOb6~bnUp%bqs_Xa|JsklY|Vjq=mL1!F#Yv@>j1y$UK8j+42Jup)< zfNmtOyKf_{B-8WzPG$N`N=AgIPT8P1@M(jz6rf!)y1q)jq|!hAoFQ6b-h=$0Dhi8) zI$%eBMsQB4Gj$x9aRb~bztBQZZBHzL?o=VR%?WMaU4C4m7x&Q+9Jv#VDa?fV z#`I^|a~Vt&H03K1E#_xSBx>UB5T2APs)h=ekRw)7YSXRe-l%r8hKKE7r|s=Q@~h^X zQXx6R#5PWU1 zNyQK*htAUuy&9Q;G#nhpCc6y@$D7LBxezWw{S6{m)<8ZJJmYU||7y5tOByR?PO(z7^@oJ1rUv3-XEg7Qw$TFCIKyyja`cGq*HXh36 zpEL|ed1777a$r9-Y&oOZg*VZLaNn28j!{~LQ+}n{jZhfwreBPCV&qPlJXEq|wC=5e zjxG-bQxu=jPoqbeVhfFy7px`f!L5o)uN7+HkM*Mp|K^8@WSG~;sD_$!Q6IE{t}}5h z(DJYbz_+4~4t4_O|qKk49j6XEbc= z5k~U-0-wiJPmD)@xKd`sxqqOAylpvhHJ<5NOpo10I1+Q|K+=`(mNV7ma%se@;z9%I z2-oB6NF-+L${4hkt(4}&H1B67y;0w#nJ7iczo*BYhc&+{g_*U=Xou(PFCM*P=R*q!WHF+_9(396Th3Y{caN2})_6)2 z^%1%`p_-N@_;gno0!#L%N<)^aTuS;CE6F}V+=ZzkI~o{(3{(Xqqs=?nP2-H=i=;mT zSG(_MTA&B>X)!?ub!04w}q3$>5nQbpBnJejQkd0_PJQ?5NJ5r#W@&6I4faU z(`Gqa=#n;=B0m`#A`97(4{{~fR{-1f)B}4I!ccyuhKlN1z>G@;j#z|m)rPA`Hw3fK z8V2H31vHBYU{+D2BpIr=z*Vx1+X-O{^YW>^8$$}w`MXHv@ zFAyCqk_|CU8`BD>_V6AZ>;MH}X{}Ant1H^LXU3_DRp`i^l#9YYk(u<-EuO_PJG#YC!Os9k2NF)F3RLidX{FbNHp{uLKFJtcD-YIEl}p z&NJxdVOET~N#`{&lJr#8zw7S8lDaEjM@T)40*XZQAsc%ygK^g}z+WA^0ElTe444SO zZGa0P)FR|kxy_piRugIXk4Ce9oj$t&pA8IIrdF!@U6P#9^BmZ=$0J+TVBAM;K1KS( zOu^(tNl}6s4e4CXqRL~J7JJ6gqWt%Nwta)zk>$>c9~ySfsYjV5|fi~zVsE0&|v zHGu}-p$4c*68LHtLR&I=Z#Y zJ>`O08E}KN`7Qo`fL698k9)U(A&p2YPW!-$8sF1 z6yy~~77`}q+DjRUw7^yaHj z?6kP=U1`#XjKR%xoNGOs=q{BzRT>KYM4N!{!`2Qlvz}C(<~wZ|48v6TA+%m@yt! z`_f^Ar-Gc(AD zD>Z=I5&6O>iti1Y1L%#K@{O1^ryPmGV8ow7Jz z<5ijUa>&ZcJduC+X#c#t^){t0I*OJK?44ehxK02F02nMz1w5Spaz|nmgmxRS=}!Eh z830V6-d<%fwH|2&_eIuH{pI^Pa+xZI`3 zX5<}Ds(1D5Tt2T5oTKQ(>O`x+RhpFk`J2xDg>I~sYjRlr{K`q{qAyj+(uQ3*IS&s$ zJauUzw>{NmoMx6#v%Bo?d!={mbN}K`3t@v)8S`pXpRYK1^Gc;?@obpy8&UjTKgQ79 zk+f{6JqkX1u$y`^UZm%#Sh|w1p?>r8qjbC(qSl9(yhDG%*HWIE780VAFApsgJGg7B z!cA36Ey8*y%b!0;G3Mb<8FGW!Q>ZhT5WP;VToPisbB(jZYvjX@Zv%zY6O*De1XKcq zG4y8;dT8Kof8TAG26KrYXELmWq6_w%g2%cL z3&WkbFejw~eJ@m`O;oR=1fKhA%d2H6M3js%Go=O53#~$(Q&F3Wl33(<)`E{mEOJy$ z(JyqadG9v~PV?RNrSp}wSW^3y{40NEFaB-U61ffyPA2u|zya!;l0wE7@$JX@=BahX z57-hhH6jAKLVs1wJ4=2pt1ha)oW7(=gdsgqofX z9jpOa5g3NVUj^o6F|&&2aN3TiTj8h4Zj-eBYq-(6&be9YkZJ)eku#5Q*2>~EO1X_P zYecibk&9ht>DPlF8giK;|6-?OFu6j?)=x0oz+nq7RgNgDQ=&_Xqg7jhxxsy&PVBIN zV>H8k;7-G~IO0UyvQ(r2eMYh7E_r}Vo0>Ntury(? zbTXyfAKk~ptTVXdjKL&bppMljRcCUT-}~8wTfHp5x5|juN&;-jVPijUG;r*ZFhtqp zxROT%!>FcPPjFYLTR}e)SMP$=jfKGu#=#@n4e%FT*;jEzWY7_x@(AxJDB1ZgqLhFx zwnnX(pR%Xo`B-WmH>8E^R8ZzjyXpz75yL)C#A8mzL0gI(o0@A!Hz2TubWTJk4nbfv zu@f6dVWr15K$<;#;W%P-`u7W|-ZHEvWD13zwOl+|N~LSX*z^`fATiP}6KbHV@eCP! z9&x-zGddvCa|)F3aydB+|{_Iab{z#>f}tu$x36ZJ#oS$heMn3cETLTp5PdF z=)26$w5B*)Ze|a)OzsG44QXWcikVs+zZsI6|e#Cm^xStnC%@GS%A1o_H~`U{p$5 zW2hLGbQ|NoA85c|sJzsWYQhQwNw1hD9?+!?P?MVqeY6tbL^1461*_@WHVV3yc zFcckyH=%FqB@B}ke3P@PfCqj?M;7j<><>}c$2`1p{+6|e6EZCda>Lr8XD9+QRDym@ zhtzl{Jdg!$4+{9m5fml7wCpMKgpHI0zHsW?iL4f@>Ew<%;(((%yp8#i=z~mDQ@Xn7 zOKmOWWWE&;9E_D1)?s#e1gfU=<`i@T4u7fZ|Ml&!Lz|lkpt~6774+>y8bcqi16Mph zE8q#O#$&dQL~)vg(&(P=aI%rKJ&%3Gz-};g)J4?L5c3ed8g(AWc~Q{NoS^5ad(!nV z5-n7xU2S>5)=to8jw7#1?itLiM(k;RVx~L*Tcni$a(*>nxm!T6}xH!?j_t;Zb1aYN^c1IW)eD#p{{eyLO^ugZ+* z7~lA9*28U|SBNhooqdPh(r{qW&=j0&|6(9HfvN6_V6tkg!%!D3wqSZuZiNT~#mHj} zZI1Ys$CqsG%J)n)@w;wd-ZTjsp&vQaK`Ns3CRw~gR4nZB$0Bxt#VVZUJcp(8@j z_8lyPV`yQ#A^yN|;>2MU4&vTKrg`WN_uLG7JehZOi#?2-r^Y|Gd8EH%C$Z=oz(yZjpJNP)o zrccTH6$0a!)`DT3ED>b~E!FK4+_j`y3S#AC7)jaG2)}FF$T28W?l5w7Oz3rOj(B1_ ztd#Nw-=5-|^nh4oezHlSzU5W==fh3K)jty*TsWYZI1rI|W+w}kVlwaEMjezFb3BI(q#}6%CtG}5m;7A;( zq3ZfDjB(uHEW6a37b#Q`$`TY57-+)GSNX#(&K;wrk3eGFndM3;UCbd~+!H8BT=NmW z6U-5uQXEQjRp?(Dj`!^^_L1|6;7H!k`sNyski7O~pfcT5`je%(Tn|tq*P~$NpyPqN zH%5a&13toXdX$qKQVrThj3XL9+3H4hIC9S*rO!8qO2NM*vIY^~bRFD>3N3=Ii;hpv ztF|`M>3L(1pblBn6Ad-3$M^|L2Mlrjr!Y0zGvu6AT>E-kgcY6>&5?Shbk0{fGj<$# z{&`r3F(~DZ3-arvhm?`tVfh6p9%B-RADpp(Zt*an{^Od(n~=@Uz}8;m^j~;1y`@T% z=l;6Y*SOMi8P4_UMxIrR^LdOT3*h}v2-v;+LT;7Kh!^xdDj8`gyL3zhZ9{Q6<8-Q~ zXg2v5@BJ1zuqu7x*&HPg%D4eJguM&tdbPw(+BeBr&4T#U#~CXvTN66I&riZht4<%0 zHOIoT|hd&iE`<6Pwo)8?-LnJYb1(;XQB zPAIaYPImu?*iViT?2(xUTn+y_i)R+`zW0>fmal*|%jB=oQM!FLv-o8`6 z3_OpsSL`X{PWn*(tUV@HrtU8&JI9{u^Lc|K*Vstax^OqSw;bgA9}<_LwMd6yY3Tv( zII=4I0L-h@+^t$^&@_GFauhbVwCS+Q+MfN|bH+?Ik7Ue_Q#tGlw(Lq4usz9Ee(}$B zFsX-Yfkh>F=~=5gqi^by^b+@yE(w48UI<(Y;08+MgG{U<8HUvaFtGUg~xsFOKu zxRDq)|KNUr2dGv&3Q1c_FK)ny^qU^EPHDIYrZ6e;oYs8?a)ael4bSEKOR=|LVw<_@ zWV33B*T#-H21*5E4!(ZyXWA!glyNvwb1-Rm7S=rZG3GhLaf412{O0%Lr)U9U<=AzL z&ILAp3qi~-+EVURoDB1?1^Dz8=Jc%jsT51|7LX>6w@+c(3}|LB;<_fNR4}qh)p7|d z1y>ZHGsDD}XXHE^XexQ3nAH=(_vm%mybL#_=*HGQi`%e2GglaBJeh#~7d4`N^k_I4 z|IULat_$`N^m)MeY!?N>k)}=fPM7uHMHo@`gK4VrRLau%q=iGem-EKj;`*FOm~V06 zV&g@E{_kD~5(*%?d-GTFhj?CrMBE!f5X%@|Qp-;ijqlQkKE+H5$7A&3-Oj0oBgO5b zSsMNB!@mudf~t<{{df1VOQN457jovYR&S*i9l#zcW)ZieEs#C$f|9YA0(UaB>O4`h zKF~*UY|s%AhL<`SXFD7JSX+xL-sSdS+;c_*W$8b+%j4Mg{347oAw72V zX1U5odP2g-()vg+6j!yPLqxQqa|6b+c7faJN}c~C_Z^R<`kcyDU1CoXxZi1T=@Jqv zK~p_g^jsawUnHGIRY?}nJ;;}M0&VFc4zBD(+5QXoLevZ9J3)d6BCM|b$a%-Es%y9s z{N@b8ccF~CpjG=1p%c|NXe8QQ{;0g4u?FYM9zjtU`8l}3?XT}}U25XVObLhRHnTOb z=ZK%{bpB{J$YeO;^?^q7(I-zO%ADNcS9dcSP z=?+252^*VY(foR+_6N{Mikc#53e9n13@}E(E!?N$t_Wgt7|%nCT$*90EVI zIUWo@lSAtJx0{;K`o!|Z!JH3|nro7Y6AN2K}{ z(mh<#I(T_5pSQkg+Tu3!VD(o%)&nM$c zDwzWZb*0AwG}4RKArY*dTj_GwQZ+RT|L_a*#Nu~mN!Wwp4iBKCOq+R09F;~(OsY-vy^Y!P|vDsapa}o+Ug@DpA7|6xOEGoIIC|F>g zRW3mA3-ER*ng3L-x%>XDJ4GdH$}x5eib7Rf6|SXR8N97 zJpRw!1ZT6=PW_s-XGUh!J&boSS zu$A_|BYlS3)!!@IF4x|z(QN?tax+vRFS`LZz$u@yk+xQLgKb*v)Mi}}$LQW+RL#-1 z@}r(RZl080K)E?iu!EFKE?)mv;kCvm$OV306TjYRtv98{CTiaQvhHhb@X`fN{uNTc zAuz+7!OI$8j3Do7pMy3fa~EzP#C@%wSBX8&7)E)r3Op`f@&%_4!8C7_BWfqk#+7q^ zwV$it-3;!Wuj0aQ$UjoPLi226uprf0GUa`#&P~kbK?&xcadl62br7t0nwQov=-hn0 zNDd%SbCrdld(z7RnFFqNjh!Y>dQ!ZjSLGL!z}*7XA<~4##BajW%%2XewGB|tz8YKv z;$ZV$$$~`khNC9yiBmyh7=i=qD-q81qxFA?fR)swq3-{onJg-Z{%kJS6N`>bs82vd z>+>x|`=UINa{|Z=!R8Cf^D3bS5c<}Vr{9s-NEqQx}KW;T5q$XQfbc!&|h;qQZ{#@ zw4E<91F7%=P#x%t&?SoZ>BX$+H4jHu##ErvbxTraB5<-I|JfRuEyz-?oH~zd2Yu3* z;jK{oPlLYRBbRKV$C8`c6YT_thKXOhgGjo#0g>t3E@SyZ6r6Va;MyUZU3+)V@pJuI zZXo9$>30^EQk^@7$;P%*vn;}0ZSD!3t0$Ewoq57m+QqEPx!wby8=r6PsV@0y$v0D;bH#;;gWcJ(Zarwl*kG4!*(qwgZvSpF!Ymo;*^d7q z#TRx;;3lG(b|}!K{9FL$IfQ>LB7$BP>R5r>C=hR8myV zb#nt#V`h?oGJI{B@9U!P{&(vldlHT&;*mqcyI^{k?o`qFQvyI|_s=hCx>zRDWqh%A zbxSiN4suh?30=I=B!$WwazT$nD%; zBO+-R+ccZI_U&rG9ZzV8AJUHPEPjby&~!~w)t9CrW^HK+HKh~JzHJbO`zb9g@l1Up zjK{=Fo~{;CaNYP4hI%@eUVK;K#Hzv`vX&2 zMD#F;_|8FXl_zmybvb(KMK@FBzw|&n&j#_y(cg0OX88tc*y4>=z_hOJ5H|WfP+48j z=Jws|5S`pH=;Y)A}X&9RoE&$W%S(+gL*7Vi=|cL&_+)`rqRchjk$~F z<}Hd>B;y(ML-k)*ok#Ot*5aFZR#Kt9tF2+dju|_;eE%G2JwCqpvY}g>ycIzX9yQP( zJU`eKG&(;tF@e3|O<(2rk|%g5wrS2%1E_6NV{#d_ZG?4VrLkxBL z&({_w);1OrpwFAh)IS&Ez#t`mmE;y=RKpRz3!TZdWug}P(h4?eQp6S9xY(VDvBO$L zUIU%m@Ce1=fTv6aAI~Yd^%%2N%a2Sa;esP9hL|DlRrL3}q}-Tuj;dWtK|4DBo|}u` z$(a4p55>t6#{=%34L;>+0f*@yEfYBNiHvhNNNpRkH1SC0eDoo`we+nH_( z9kiBdM3a!5Gq6QR?;ypWw!a?Z;H%QBf)T^dRx|Ft=XkZ%!fXAnB}V}Ok1LS8 z)4`{Aohy&{qY(*{B)Ni$HWpRE5xYg3IC*jH*~4pcYy&6f)J5hYxQd7Q4mHxBK~@7KWwSffoESosqVuOu)OC|1yZb#&SWyCuY(P z3HKlSH3SfzQSR-1m*D7h99om?_L1x!BRx(Nr}GlHf;eJ&1L7JTi>NR~Cvdtt1&9}Nb-z=WOPE62I%4N}&ZEtq9Jgqng(94y8x}Wi`8R7Bu-;(mAw+Pe&o+`?D5*Jb z%{?DTN>;fHcA1774lASW%!K*B^38wcGy>OQrbu@`pIiREXwQy?0OqGJEx90aQ3y9@ zd--5{b&Bs_dqPAM0v1e)K)>em6NOFA`2Bvo4MI8D5eZhayfdWSX0z)aZdb|x~ z6`4^wIz$6uP~t_ehn5!@)kMnah&E`yjRUo#S=jR_5=e=)sFZ#FxBC+LzBtWx;96 z%_*%B>i)ep98IK3w2km>n2_G{h+4-7!vCTErKyoo-%^q0rt$W0a#}Xk;JFtezKNN} zM{9!wZyq1LHy@Y%|APpR)~p2w5G0N(|GGQ>!P;+awWeO0@aVzFys9hW2ka>L_f3x- zp7!w+D5VL%Jd3GHT7aGoA*9VWpR0h!2P?U=5AEj|L*{MzA>R!IB^)y%c3RIfJXWy& z=}P>Y>Dg@VAx7{Zn1*fgqd>uT3xeIfLCmlPU0T20CC?eLeUtm`YSg{W7dyjMs5F}s zEJ>mzvnI$A{SR5neat9|PrY@A9bBt(A^t}}ua6Kage{8pNa)s~Mmh9%2!wATPwT># z;uUv>W$GtE2RfZiP;(8(mvSFJCh!Y0 zO_k%x*9Lwp@7 z!FQMQt>2h=avGF0VJt^YFY%5$P=4^-`Cj|w_RLIhl{KG+|M*v`9-6Aph4d&>nnscB zH%s2u>}Pg!9+aw|7cqOg#E)E_dd%*_($-}EEU!Pv$TA^qD&(0F3q4u=3SMm`S^_Rf z0wRZ%A1*GHV>Q+V9d`xH1<O=M3!4mPiZ^F{e0*vvlKm zYCr5YUY@hw-JJm9_cj5iR8?h&lI772)4T=X$U6 zdauJ-FT)>RbEN(0yln<0g_U{MRJU}Iwq$rtU9CWzz`S`4Raa^W+Fhs|*&$#WhjE-3 zyFFo?R;h1mBb&%mbJl;{)$51e8;4=@QZ#sz!cK(msRil?blPmkYSM*dD?>gwa?peZ z_d#ZSyLgb-%CdI4cZaxWncr`i{|l{7=mejkKNmc+2hy{9XaTLa5%fKk$+3K_n1A&Dm@13`iho{Ivw1kWP;P!G=`{+#&v|jRwGks4a4RK0b?I$#_86H2 z#kxj)WFUSpl?}iVWSmwMSL8-}hq_M^>s!A3zxy>%5GW3a4!sf%v*DGJenTpb1p?}7Wvd&j<3hsj-k5F4E#fBP$AP3J>><@~<( zIw`)HLlQl8OGA#*;E1{ornFMZr(j& z3OV|b)u;neWV3B*gszZFwzLK}V~+^ecvCmX6YsnAgN0G;zmpPLkuBD{i*u|R&Z3$A z?S#M;u?H@7p}}UOL_*gL9X5?QOjyA)gKzQT-1(Ovy{A~l1%>pu89J1H(>T-GYYCq{ z3BtHL7ga=`Uueowy&-S#B41g5DG0OdQtLdT!=^gJmW^RxloY2d;j&8`0MC_6HyRLG zPU7r*|9joIeC^Bo_*_mu8;zy9FuX-RCu$F2TBN4`h~&OP9%fZ8f}a>|+s6)5HX9rm z9)<*~Hm^QKm}($r>(<|e6y{O+Usdo}FJkAZ46PMtRcd!Dun%9;PMfNFU^-pnd26K_ z^d$B5`NUHfy_!&yXrMQ;*{)a3KfZ>Ojf%^CrLE7DcW~xOt|f?QPEd`jV1qUjl1-Ch zSo*_lw}|M2Q@Vs`mqpA<50fUD+{dK4IP!TzN@3?~6xxtQIvLli0R5#VwI;r!CQ{zf zV*0Sdf4RLd#x!d9j^jfCk)3Q&H$%Z$a)BHH-{!EZ(1whBM4Dqp9p-mOFkXVT;}JA; z{rOP%+o}E2)d<%h!+_VVf$Qzw+(W0@aykuLng#FcSgunm-ZlU>L+($@12{s#F1`4{Ql&wsONRwSPbm$7G-yC7J?R2UkWJEbUCZORYTnZ4WPKSL!zJO3B<*5N z_*_coAQn?q%w4lu$uh8#e8WZ8DVh&ia0W{R@Ct1T z9OulBm^9Yb@s~{=PpC0P(VCgjncd$s<0~uBPXYFZEOPzKkHk zNBg+1$>S^~-?n<)|K>-eCl7@p+Tt#j0tV{}-se~gjHfC6Cd0pN54h5Ln89X>MJ2dh zwF;E-`~_tpIq@j>UCh%*E(7fVD~}^G77tw2Xbt!ixo^XupS)W=Y7tiOtS)g`rE;vh zQ(;X^^y&6*de*;^tPw7~D}S7q4<2(8y~jS`O*=J~!JwMA!Ex?14f`1ZD#2*HhjH|W z7|9J8$xT?+Q`oa?8il$nW;H{x35S(2odbESgc@iw=_V;<*y0i)yZl&Bol424g5}qN z4Y8d8fxvwOgGI4F}hEW`1E{{5Wg?$?>4FgHjSYPKyuBN*b))J$lHO$a)B9F3$iM`8S;`jZr{&K_sAINE*u6)3A zz@!P?RDVPQ_3%ol$Wq^)$8$%J{AWt+9k{;pm!K%d-&&h*MqwQ=W8Z-TAq^zpv z!JP5!76=4L64BlfvKk7nkDNm`Hpd8zS+8t8(^6W27_fke>AD(Wr}gnP2W_i-lu0En z*ZHudqnD2|+vmV&2(Y>M!)0|M#91uLZR{|akzN%Ih0;+B8@4Qp%>cdwiL}*Qhefyx zoU)U9x3KQ+a{F6WzkWz`j^VB@uvsE9Dp~@dqL9e5Bjo^h+X}Z9C1rwrw!`elSV?bl znIU4d_n|G`EB6NcIW6xCVy;SM57ChL{OPAp1=8-a7Eu9oFk=hc2Gvsb(q1RrV}^#u zDy(O!UNY%Z^RoJ!OE)A!b~gsxJIdY}=1!PwJ~ET7>$36lfKB87Y7~pGtAb|#GdDis zS4y2Y9$tj~2Q#^SD)Z_6>b!ZcjgJJ4Ktkq9PMUqUg)dXYYRt00Z*VB*jGE>1p$%N8 zSno{OWxW_I9ly00`JW(sQ?wOw=y7bZKdGCjX6B)RIMcrM{(%YuKXB2r9xSp<%SzR# zE?K(gLp5LglW-;3^S%fLlv8#}CWZQ)lr8={TOD%U9r)TIITexlesAJmBW(X4L6m;U zbX3TuKtuEP;HQxKQ9o@4XMX(BBrXbYQjdb@MESli;i%nkaE&(OXY|^_mqK&;$X(f% zpQ?p~pnAtW$W1G#NZ`IChi)XCj5&~68f){iT!-Nu(kmCU8Kdt5DOL-|tgEA;tYyh4mn^lMVdv}y9_%aaYPDgM{d-NFE%k(wkVD!woOBBiN z>oz1>QprdpgxkVqr)Ohu|KT*Y44S73rgt(2Z%>gOFUbjFD?eQqCCQv9E}|*QDAV|` zOc(fK7`-3oB*A~_6x3Y^j@*AvMK<2ihZTs@yc54@# z-SsD$vq81O1Ayb$2%~&T?8*@*JZnSN+i}*yPdSNN{;$x7VLSRTf-F}>SZi7@{Uilo z-Rmq+O0m=5HB!pAd(_RKF0cY|{s2apid1#itjyeZV}wqqhCBN@({~b zM4*22m*iS(Zc<~QqY-0lY9c`W_WN;xdBvTh^c>azV`)eXd)t4< z@-fSj&>bBbsneKV0Qg{7`A5c>Pcsku_-21<=3|Nr+%@wWFhfNZ8Y(4fC6^W?&i_TA zF_k8|JmGjZZBJ1)cXZZAc=iEcy4RbhMCd!=G|0ZNt%Y{c3v6QubmO?n2uG!`mwgHlUq{6A9UCT46o*5Uu9dB$xb> zv(%-VIR}$UJ2P{1~H{a{+0xZqvtFzHg1a=A!@NGc;Vh!%CQEcuX zL3aZ{*W7oLsiAEe8RygnU@v}z>T#yXf+0FhOCjN6hu(31|2o*j3N^CPybP_Z_Tg>8 z>uO41Y36|{WUI^KviO5rej6h*=t27hXGcVuX{`P`!4%!rH#gVHV1HyM?4IB3S~dpR zb>zzfa%i{anJQNZ*Wb$11`qZCgoHq~?ex??<0@DxxuD53^PC1jk=?>$0|PH~WRr`0 zGmxemstD#gI!zC>h8&x-#_T7pN+ zk~N;aarY2b6ziy+BRw>Ate!9iskA}-pF|-OxYOp1MfQCS2c@l`g;4sxM7`%k<|lvV z7(ruRMjt=I8vBL|PJYF8cFr_Pm@LSc<^6uy2S{(KioSmhv!#+Vla53CGJF5UhD{l9 z3;9PMD<@u@Ojm^LTRAFtXaQEhT$=+bjB7dN#Z8zZ8ElF}^wY6Gw- z37C00sx6z?F#0jd6FTW-SP_PDuYsMb4Ew7`p`z2A`d0m|d)Sy2nZXdT;Rn^2>G_@J z5ilwEJl)gS1yoB_Btulsv3LWTtX4YVVl`6-R8*AO3T#CwmKAWTJF>{I+|mC&l{5CD z9IN-LEGYXE+2-+C)g5c6q9us>d<@T3bMxG6Ch9tSSq4^c%-Jz^dTFmk>>>!h4x`q-mv%KY3HM{lf=t;i( zS8?ev6Q9}l={sZeM@#GFt+~Z%5Mk1_NZnmR5numI+B>B4aQG`U=>3hXFP5U?8iXCO z#upo9qrBDmq`Di3GWp}!dUmJ$1@H^eT(lB?3C^w1<$~U);$`BWyAAmjK9APpi8e=O zviux^o7cV-Og9m;N+1h&1LXT^{x` za<%`gB932RubAr2t5i3n_=~m(Pae4CT=2OaE&@GtHi>@8rjT7Q+akUFC4KUlur+9& zz4fSdN1CrRP3dICJeQme+Mrm@xO7baj-n=X;9?!giy^q9TC$ituy0zf@{$Fm_l-Fm3cuJIlmT8@A!G!0<= z+nz2@hCpBXJGHAZ*u!r{UbKSiMJ9+~o6xx>DyLCrVuWNFN{A8lD5C4Kr<39RWX1w% z;OxbJqp=uo_77{2E7c8?NCrphv}a_!T-|?kEV==gJ`1&(RI?s{Uoz>U=pW5=`&nRh z3Q;4z+RB2)qh}`J8<;OrT8_V`Ha-68+7y417WhA!&VjqGu5F`9nl!d;n~iN7Cyi~} zd15!VZJgL@oW`~q+x$-7F}}aB$KHFbb+7B1)7wUCnqRvhxgO@}pBqH82X@B2rK)v9 z1S|&er?pL}U58mSeQ!y-Z>AesLG*7XWE1~bGsY;2DNhQVbj!etvF$~~qvb{vGjM#) z@0;N;YlWj&!LyA54tfVs)OcYK1cg^v=kMCyt&l}qmEP+3jMA|avR()_9AS`>a#{q6 z5?piN5vr!G`?17edAgFc=2BA?u2BrnW&zDwL{7hpPgRvYa@#}ER(y-dQnQDm`HTC0 z41X))HV`a;1x0?<+$uUkQQzZc>R?xj7s?+t>OLC{Xs)tY3;n% zbhj+}#s=)3>(J6Tada{tGlK!(hVB>H`9H)QFzsdnIm5FGYd=S;MHf+~h1NH3UxlSo zF0&G`Dv3QRYKw+N5|glzbwB@zJ6cxFs)4P0aw!#jEj)ruD36DAV5w57|7r@7n8fR1ijI#H=S1e}iKNcdSTU<P1haO6ZWZ z+@NP2zhKDdPsr(GtBgomt4h6WxMj`*tFslpz|+#5kayXbTf3lFZKEc=x>ZK5L=|ns z!F`C<>{FpawZ31pJSw;!shD7xwVaka!`RK=veKM)kTUxvBc!Rq2rF}icCjUGjE!yb zpX2U7mW@KKt&?Llm7e#`zv1(KEOc$q)LTJ^C0(U(2JZ=Qjv_k&D-y?U$VCsr?wSut&XP4E4YDv>unm=I)6S)gSE)eM zB((3<+f zOPVCyhh}Rg-DJV(j?*y`T%62tF`OtC_D$rJ<+QeO*p!zQ0J_QHZ4$T>`@22K&e*f} zEzBl!x3(3oazX-sKsL;@xONgfgZ{EgPH$1kAOenM8*2aO3naL{uFc-;>A`$f-PDv; zI}Dx15VA>v-W`v_q_Zccg-tA*`NO67j^xa>BEc`(?qH&vnSEdBkt9!!DRc8O7zmlD zti0n~yyc%Niib)p$O?E&rgQHpCQy!mZqXU2RTwIq+-F%m4jH}El2nKzr&({MAjB;A z@aNw#PMN}DeLt7$;p)ONs>Y2}_zO^z)(J4h%}t31aue*eevu}PXY6Ql41$88Qj_HO z+q$u?K2-tIRMc~^J()?7clwPV=r#2y-~2#a#5y;m4`qe{Sl(2Uo?Rma&;{{9fp7d} zb(~mO9NSx6@X)*qN*h8{utar??nc5`I;{>r#JA?IQ!Qvj9~5}mToBgq^q^$|BinMK zyHPK#Z!XP?ynnwk70f03V@iDBFj5EzSTawpJUzl$ngjqE_qNT6)R)Vfi+i20_J&jM z-tSQcX%=1(!jmS@B|nG(=F8ArJ`!NJSjj8 zsVd!{%Hgsu6p1R$R_t&SN%E7NuE?p62H8Jn^t(wWgOis+==QD{dmw{kg1=!xE_6m_ z+i0VPMle8y8oV_d$O*yBafpq>{{>^{WL3c=Irrt=jJ4Gmbv4F!^klKn6ht(9n zKPcXg*e(b%2%NYk|7#9bgJLFzM9L-3a)GQ51uUBzHlvOPzqg4$wjv2<*N~+i;G-&ArkR+lW;=Uk<%%bOaPxAl0~{3*mT;&X zXtSL6#iO-mfVoQ0h+y}PyD@p%#dgk3Cc-2$>_)fgnbJ?jLp;Eg+DIby9w{C%0p}e& zQaVfp*;}NHIXFfWBPd;e*PEjnvg_+kpb!nkBH!f6Wt^UJupe{<6iN(7=?w4w^rf<| z5bL`K-PN=oX?3;KTH5{Qi23!hvu<2aKem@4@yqA3eI$_u#W%J!Xz$m`t-$xZR=hb( zi2hW(lhO6QP5MFQO3njE-{dBm!~*j$o-(kAtKYj_wjLt94OrjzjTJ8|M+udB;z=%z z$w52Q0@z$xIae*Gr1*eZ&8Tsu{#3!bjU?P)Zv=FNstDI^#0ISaW2eA|5em{F(z7;1 z;;K1y_3WzOwbK1CW+`-yMunD%eXA*Z7kZ^2U;Xf(&YSNM4@i*Co-SX#qepz1K*e=Q zqt3IqZx+Ufx@5Vs10){sLl`8Gio-tavuoXhb>s{@7 z>KfiX98X^U*oa`{q;|zFkf3v`X)O39T|iQ1x+dI^jEfG}syO+QEoL=_xlj#30Dd)d zDq6=^><8~liNeAq_1_8@2vb)iF8&?EYD&r-erU8yW4wqmg+!`va0TU#E48SQ8yB(w zHW2-4gT%9vJCpig93l_$z-Vzx39`MF8atltKjXz*4jkg=o?$_8DC?Bf7hzCIKF0;hjnl0`zB+~m zCMxMSE~ned%M=)=Cz>W_ibQ+%PE`qI4${%0R`8iE2Ufe_IWK}Za`pm(Wb?KJ7M8`YEIZkPW7S0h|2H#r)6G;mT(#;Od;bjUHU&0*}a6sNpgDBY{5atko%lAz%rEH@b)>-I>5c zZefT2J^qsBPv~E9!NTjwfTL@0zGt!Qk@1)@37|@2OH_h}qMShnI_$76yhULu)p~Yh zBXy5za|c0$z_0i{Z3#zo#wu#6ZoA&=r4)dyP)fRi&-|(XMnd~e8co>TFKHi* z(vZufkrt?aNi0Fse)3@BW7c>2vO}+*c!LXbnjCqHOcebYZ@%_r%6LcG$u0FeaY`DD zs4boOxvD3)6PZ5IX~5v?s~Fq5fzvOGE2X^S)!L5h-sjIxhzaP_kiHL!$-4xWP*PZM zbW;Q}Lk!laS=a=(kN_m2Q9S)oRGZqhPHgzBRHh;vPeqo0_;UTV~f~CMS=58Lryd%j?z-WBi zv2)CoJ$x63AHwkHeAyy>6#VaM7q2N(s(TN!j-|$VYm;UPY#Pp6Gj zjJ<J)1;0ei|_^G_PDRFlbna85^v!jRxy5)ch^sjQNOUa@VYD5`e z6R0|dbCkfTXqaex+jgnN1g2ftDl)9HSWeTq89I?Pc{ycO5!RoyiKqyyv09eI)?SUv z7_9N_X+-hIODjwffiql808y26pJZ_*3VK=KVS{R9mro=mmXRdxOu2%lhFUfn2VP0+ z7OB-?qy(FXh=e$UlMAzqxFwrgbA=(AvgevI1e2!agKObSK26X8w->p&R-w43C-xd^ z^gQZ=G|{FY5)UR`A)}CKN&117@yL+M2k^ zmM!Bc>-?&bJH#DlUW)qc^!Ox(^c0kaNFu8DmwTZEEV$Nc@U`}Mv_ZCtu|!|d>mY)n zhe8rY6CXB^aXJ;N!N>NYwLaSZaQ4Ck--8v=aY?KRigifHz{LpbaC}ZsXjb!9}(s)(-44vu|+3*;Jsf~*rOvf@ov}^qo-_xwtj6`trRx8!6S%{~rv%3$+BX(QI zEYVn>OMx^$4vC5z?M`8CK++i7*Q(YuI@lzQA2`7NJ3;Hh`1c1xB4vcOs6c89881Q! zk9cTUUp5IEF9wZ2l*CI#r=JAoMgM=$Zto|_2b(Vh>&Bzx?5Ng1s3)Mj7RK{K&D)gn z;n&7Y5P}F;*_U|_etlr}G*w{ebAw;-oVWJ5h;lPlC z!n>RZG3W%~swhXh74O>ezIbI2%lPN>INvJ(8!Vs z=#xHFmJcTDUpAf{O1Lwt4Dr$C@X;1QiH)%@-j|Y~vv9(>F&mI}iBE%IWr`ae)KMdQ z;u;eo=v7si(hMSE=E2wK7-X*a3!$mna_Ky8E0JanJU&(~eBrS#2Mbg}^DpvH2T4K24IFq` z2(vA()wG6BGn6Ns5wc;(eJCXO=x)i1Nia+k!3@K)2sHal`8~thrn?#Fg19cZT#dN12ok>E#m$|Y);eQ3Qj?GeDwVVq4gP0+ zDNZl^ky3A+5K25%)q9dJfnvhX`(_bmy1B-sD61XgI{pR4>=~4*C4SLprD1${x!{Rs z2C30$cTyRM*On#l+Yj9Xv2~Svw@vYWjs^AXQY3U~4dLC6P;N#7CS1jFFI@JREEIj9 zq&=nIG?>o?@cHO^E|6j`x}VXK9a1M+!B?qGYh|W*!r(s)SGI?xl6ZzzLJX!5q`4mI z4(sfYG!J9g0XXuv?BnpmYkf&D-a%r7h+%XtZlZh%#+~F7*AKk2%kt)Da#D$0%gX30 zlgxu^`P&G|@2RO6D^NLoN#OX`(NZlZ9;&lxpa|_SX-`t&ku0o$k(y`G`BJXzMx8Kw zH)Kd~2;~nEODj&PTr}5`3f_Nx1*G9S<*4p_7{#6OA8j^E;&T4QIFSiDnrD^;!yH(y zlo-9{3d0!58&lmxs3jD$@%~Se;Ww;<6K?ZZ&6tJ&RZFj{>H~rxip`S+Q*MFuK?yx& z5rN@4ak=~mxYLNa)tmJZE6PC-9ID28CFg9Z7kz<_xnt1uQ7cE+;DJUXh~S zNhi{POYt602xh$+`iUo^IJ^CT)bM*v$}V7`CbyhekwZ@dcsO#3EB}U2IM^c2(6Z@;#_3;8WhS zv=>a86HpxoO}ZUI3=|a)B6Q;>4#W0WOgMeMs3NkmtTsTKkUFh8Tv>~+Qet#NmqS&M z8?v`8bGW?^3S{1}iN^-|{y`Et)IJlGeAH1igJ%sbo8*a-VEM0-7iasd`pMu^s!7Z( zkbg%C3aMW`bxukiC(*e%Y3^b45E*|G!^gwV)d)Rm`UB>Qy&9Rapsn;EJaKUTWl&j zRER4if=vnRa3p1(QZ~XPW-k`_rUNlAZlj)@wm6utR!K%{JRECk)rY+4%!{j*d>~OW zXGQ-hUl^-@G9BYnp*@!v)mV&Pb1>k+JYAC6nhdRqnkh7UQ9t~9=_02uHNH<G@isKpK<+Gt&A(2tP4n@LK z2x{XUVM^Ff9pfLRyUUre<#&|a5c#Ym__j+Y2d_dMpX0Tmc%uoR8g)s?E6a`{-9L{B z5^5l*Ef>x@#WwfF&uEn;4{hB0RtqoN|6GZ~ZUbp~O1fM+*UVOZxP?xJw7n}ues(+N ziEdGfPeNJbvkh5Nr639oz~V_VDAFfrBc}+quf)>?k=jk zo6A;f%*~Y;=@ri9DC6T$S`nNa=Q~ipiprk`lVGp;i7H_OgWU9@yb$~mTmKBkz)c!$ z!M~$qu_yGE?*#9CVc{#jamV<3#5u6(22E~KG~3yzlD1O6sx)lA#*$BAh6BbM9X z4kf)U%&b;b)SPCC>PIni3bD2J@1RwfzKQ-?GrUKviGIUx!J>;iEj|nlIVg>TMgX2h zbpGYO1o-b946@&RVk@WiM6=L>XE+XTBGjsvOmLNnfXYENBo|$4En9*T_zo-8_R#oc z6e%5QBKUXh-TcJw_089Gt{B?bYmx*hy@{)oKMJN2#(LjI;Y-ehYt$HwOZ(>(TbhK| zX2t0#WB&Vzz8a96@0u4=d5AcQySd(_8t7;sk27L*R%@BJd%fOBHa0YBfA2)zGN6xuo23&aajq zI-~sC{io*M0FNb8{V-c*qE5F7 z+fH=ti6bfrKXp9%mhrvL$&iTU7FjIWkq``_U(6%7I0{Th6q4F1oEKltEssjUmQ-uu zT&s|6thR*XhsB@O#GaIu>R5TERI0g^iB+c4P_g!FZ~BP#c-eNkN%np6Sj*8ga-^f{ zMRkuJU5((43|Pw=8HMEoBd^P0OB~5wIYo*hK>Ynr5jB#XAw#$x0C@ZSuf zvl%1HIV1Oa0P}48Nmr1M%5c!27BGtv2`@=m#9HH@IE5@-9Dd=TLtCfw&f+X)EJ?1i z6NY0y2jdNfzoVtgB#>_!O@OIfSdM-#8^GQS%Z4U^g?t26d-<=={$@ zxMm!DtD)U+-2MaF{|f2yTwmX!;77v~Oq%(jECKMBgNurydsJ%qpC zppRl2sb4XcBxHq4%+Y48<{y?>q|5Fg-j=k8P%=(%GQ)Fc9$}JBgIyY9n9K%b8DTV= z-ImDw#9+0`Q6S@$TPdQ_WeT~{Z%3Kd30=nFmU;mqB%FAb4kMwC-#vJxi-8dZt0y4w zLLA$w6ji-r&yJlxvWnq)zyx_{_-!*DA>s5Hn$W3~g^lVZ`w4=2JBp1;p6n_OWYm*m zd5m)LvKxcz@`qK?%`(t2lCYn%A>-LxOXUZO>9+$7)x2;(boD!<(P-bToWY5gyP`V! zmwRy=y?`FMEZWpWfLB-R8YhDnp(thy>}#$j+Qlh_fP1!wmr-?lHi|ttQ<0okzN)bX zdEVvljW)!@{WfJPE+2Xr`NZZL8ythlxV`q03|0Kz0hgurY0Dp&_WGRwV9SUXmxNAV z!Xux6MbWuzU*H^{xfiFURv%WN6B{+BvB*ZJ)R^)lVPZ?m7U7C7Sax16+4k!4@6rmM zY#v@4zQsGl?Xu!ZyDarc*-{GZ8NxNkM74seECZIdWXjHYF3;FZKwt2!cF4#Zg#B(# z;p(24arnA}!<5tMuF-G)lP@kylh>2Tr5b|E`7vC$V&YBRZr;$cXFR^`udz;)^xd+B zj=!uuVjkH`Wi_S~y@^DXc0558u;T7PIKf*M`oLNoI}A1n9hOFdMXXj}q`r8ozaV}? z$U}aQNyYAj5O8l0%ac-V?K(+qSR@>&+ajR%ukE zVqXzM_l_N-?-%W0)Qs$9I8!!VbHU225G~Q4x406n5!bT_xo7#n?GJ4zEA3*$v&9Jc zO_OM!l-2@Yc`6iRntDX3QxJHZA~OISd{P4k(2>q4BJ<`6|H=?1s~+$a@cHM<>%3va z8LaMEiZpxdwkMCk==OVDj{C$sdX3c=12SjwtTl6dz*TxBF1qtlm1H-JL`zlG=6-iz z855Mea9E3|IY%E#pF6~ZD)x!^A*g;0l=9RS`;@Z;vfmxFv#NonVs@Lo>d!+8N6oUxU5qjOZlaXYpp&wF^ zzB$a(;7*^kHH8N!%5>n=YRPA~2sq+z~!h_-KcMu!U?$PzpAoaEaID#w?GLN%{Wr z#U^yMVOa1xT2lk5Q16~D_JDDAV`)_`*VCZI zX@q`r9!JI??eif3L7PMf4JpJeauwlZ2AMjE6vMXPS+hXv z#w0lLduGv~4milDL3&-rP3pW^Cd{C~>7ye_IF?)vJC$7maKNckz7bmMvD~t$q>#(! zjxg1kXy?;Yti5GsKA$+LgNg;Pj-MlBkk3o#oS`~jSvD9mhAtm_c^A6HK9%kv{W(#T zxnh=Q)sWnLg1(?AtXzy}VWjuRzEg*vi`@KB87bnXWCnCzBH0RpO?e;*w|LFY-D%h{ zXE+I=Mj&w2U1+{=ad-!ZF`Y57%ZDwva%?z^>@r?ZR z%Yrr6>uEu(BLo_$yF$}x>(08sZf<2nn@jlp@de^$Pvm%-h0N6yxF6BeFHEC)&^1Uk zb?GQ#NY-+2sy4GuR=5S0{dsQ<2r9qS5+Jf*8;`W9`mWeWT*CP^_Jyg`8)Qlxg?^r` zd9UkmTKu?o^%|+DwlRy!MPh8oLZiJ-fQ&H#B0172KE!F3fRwQt_~1mkM42}S86D?vrhsIC+&{%ZQYLJtFJJDOzxA|ZY)&rLMT zxkh3z`qAii6`ODlKjdWE(E#GcIUU=x)-c_VWKxEmHMCC<>BswNqNn#A97WhmP>lF~)2D^;1%XZ<998cc9IL zYFZJDM*A9OOLQNNC;~2M9h3gk9kT18d`f%matKytI!8*gIsb$h#7{u1d@=0)K7I+QtT`@B6V$Wl*;vw1wao;n} z+(p8D7P8oi_1p!rVXuij3bnVEgb&^B_6VX`hS@OItM&GnJ{y9qp1v2zx@)E5GIWHK zsJ*icdN{o3h`~1TqC&ve?o>yBE5~c0sVG{Y&N`4o8RaVp4J=Y(6otJjp7(&x{)AB0 zRqoJjK3&XfTy7(f7(~x^ULFsHh=g-`q_}XlgR}uyDkqJ@T+CuI`Kq3kqbZa2u*x-j z+D2bV0k=w*{fkOUKzj{!q;B&`+RSsj4P^S=nlASoeeO=#!&z=&>V=CyISU$Jy}chX zIm2(&jGHVO_*L%riqr>U!ao%MQk`N_l>I=w{TFc9q6k7vIXWhZo{sy@1?i@v3KH1% z)`1TCSaue3c$5|-ixEIYyLGn+s%2$_&*~Ao9l*EMeNr-$iyI zWls8CFMnlNLjs^Y9K;0R+(LC`pCoYzmZ{rKL{VDqw^&*|J-2?DuP(67-uPbX%@7i+ z(LsQ z7VgS6tucz@aW4X$oLSIp;5p571I)96cOITsftzZrwrg@rIU`*dTiEb*>*V_Ek?8h= z-uA-~y3)Via_ef&!anboSgVIGw)u1L8vFo184Qkc=C$XlJeIcZBt~s>u;W{VqPa%u zA~~7XL7wkvKoNLr#Ecg|=j=dTeqtSMcG|}d(BHsM94hiK;UeSx;~auWH;Vsy3(rRqNYO}0 z177bg#s2Uwa$D`i+oZ^rKpPK>CILZHXc&P%$sB+HL%ukX)Jpaq;hOs(JsuVnfB z-BC%EU$6rwEX>Mik;cM7Bsl)M;dL?XXV1MsFxiU>7?L74`IcG4A)XUHB}3rHk-wU+ zp9T1*TtxArA`F_~|bPO|y_n?5&o`Lx83ttDxqWek68c#)N z%P88cn?@~_p8pOL#hCWEQ!_nV>@bwf^v(kP7^|95@pwX5lM&aUJ!uNy(mLtl{_G~# z&bkTp?xcD8?kw_Jp>lY~KMpk|UUS!cdbtP*#5tPrmYVWddckqSSgElJnu<#GBFX&Y z#=>Ma_8~kPuDn{v&`#XSP%*7zO$hK{0G$MIcOm$m26vU*+N^ZgT%J!r?Sp^x22kNP z?-tZeFUvB!S&`5{TX1%M*{D}N13e^b^<%~eSpgXvB}ZqsF(WDrV!eWNg2WSaf0%W@ z^p|2OD!`Dq(+}vkjJy|IB#c+sylYsq{5CUx+FoWOyX6~On5JTl>nO0glB;Ok#mWQLE6ye z>%3e`z5VWrHaqloC)liDHyIrCpJ_vFO$DsX>yP_x~({Zh{u-hT)Ue!3e{k3cvrKC1d@xUcv=Xw%p()_v$4V`K=!L z?Lg`C;CyUS9)3Y(EHzJ`+(+bu7A;e-@PZb=Yt1KM2PhI@WFOE%0*9|e4zVoS+85Xw ztjC#$vSR{{e@=nCt^Z0p1@-@w++Qh?E#|dy-@f1(JPp@6}cu4*NxR;5C9~@>Md^0)D;Ui_N9{-n(I+np3l~WsH*H2JXS{a zX{5&F4AI~6j?Ngx1@1uD+r9i%aCiMAzC8vx@W5@DzR}P8PlpK>beuiw4CunvgftUG!icgl4*XN#(Ipm|!WW#W9mF z4NhZBui-%@GB>6bq2M^7vNxj95PO-^LH&!O#}Mxx^z%MiU(WeiW({`n&->&b(@o@$ z8RQIn?3m+7`I9d40_!Yk1CF#F@-?G5{%R{{N_29RS8b0`4d`_dILuesYcVOiK9$s+ z?XhCNDMH4@^)`NZv>IZw#1ZSrwR~7WwOo$uG9dVq^=&%$Oy}u;L!lL{1;} z%4-rh3Nh`1B@IjG1K|>SG2gIcl^n(f%fC-CV{v8f=$CI{6fB`k`^r*E%Y@_diIGlI($7k zc)%Su37$3ChNXSZ(rFeX$HT=?Wrh$`nTYD;m{zsJXL=%pHA$z^*0~mKqcRWE`iWQ5 zfcpYt8K9Z{6b`}zp2LNnT!fZ?P?M3kE$bwdT$DnVFQM!;V`x_)j%Ixsh8 z!Xl_#p|p!jwHcTy7G}%7l4+DB$J~~{_cD4=(&214q;1fIrM4f%rMh|86)tP2H6%^W z%yM5W7WT&*pfG+#01Jetx4&(#t{DqkMJHotoC%ZE2Bbz(=H%n7L}7j?LN*1^ z?a_h;#~!dPl@OSo2KC9KOzMGzP(7f{WQxj}mhyCcf4rP8XkAJ19N>$xW*bs9) zN$uqQ%$BmDu@%+WuTU#W|wGM8>dN3;>jt^wYpN!aG|V zj!VwAx%}aVbkJf4u1M#&#nEncXrl;R&}EL!!^<2jc#b=Y(pg&ezgT|Vr)4`#v)Xt= zp4#)v>dd)dS2#9a+@Cx~H`cRJO?St_#B};rIJhC$QZXXuJq3d^w6G(r zOo6`edySD1JIre~HH6LDfeM2~JZ|ey&uG!Nur$pI)9+hnGIRw{20Ip+@qN%irkT1~_5h&PA8aRg` z(mr+(9k?A9$~6Hz@16rnX3}>MQ|j_&gqXU8zUUr_3Q+kdR`q#|3B9*DnpE-?PxUq( zKP7lx`@41kJ@_l=Php>elYM?RqsEnLl)Hxdw70O%+*CubX~H(@*NX>mZm;*D#=#9w zSK<2_T&j@ek0WJ0Oy(kOcFMnHvki1ijvZ@V6P|igUVol^m13Q5rYeS<`EwMbHw44( z{*i?K_+7eKJ$hx2Z;le*PYZ34?Idxd?4H`n++3s+g(q5=9f{-8;U0>oyc>&VcA?2B zmuQH?Ze%9x(UxhDEQ_Nyt^vC`@Dmb_pD@Sedd(Na4I zn>z+@?Nwm>*ikY>FP1DvGE=!ea3V8??u_0FwZDU@;o{jhxz~}lfYJ;Rm`|d6INg84 ztVyq<`_JUIV|rzJ-Kyf$si(z`qAIOb45Al&s^f%hLyOYjE^`@&G#&FeOclZ+HP*~< z;S!;kzC)aTIF%_#4>gm@q!LRtXe1=h4MyUuVT9;T2X!0!rq^^WNX-HC?jglcs)SpiVv)e<2A|%<4M~*Z#^RULlX_pQz`RJ{8K2C& zL&;KQb1e`XnT`G3@cmxu9pyHk6Uc#(xhPHt8k!4&7WA8cx>OCV`O1HOokvvs*nGNO zn1|kH?5{nC&#B&w3iX(m5`$ODMQy<`MwRS_PoUBp$3^4!`+pX?>>u?vhhLippSNjW zAOUBg%gS_6`AbVv?=^hyjMmS28iZYL~vc8sn{6?JM2*7II)e7lQ9jY>m$p5!7aC=?~D?m2!eY6N@K@OU{ zpQ{;81}B%K0@@&^Sn8-`zoEr%yw^&?rte(IPHY+eam71}dEb=t&md(tX@=E^a*0s+ z09pyNz2RV{7kNo!+(|)W;t4cF&j0Y6|B*o`^H%16TBiR{spSXS0Jhp*TOz-LkWW6i zVsn^P{vZ;g9{RZfVeZGd#d^VKW!)=Xr*6!Ttk>zQcf}g&o)UP*W>nMDb~`~`)6*5A zcjxZt54G5Refc8+Ew9q~$rbuK#a%#r<8KnfXR`3p;%+Rh_-4mcB54S!Plg`$Y+e=i z7pdX9oL0rskSCe+LL6N7prCAGb`d|z>yKJk1E>WQBRUAdFJ!UsQhAC7CluR?0XsWF zV@m~`u*-0@DHZT7K&2L-Ag9O+SM=aL!x^AlKM+#kUg}C@B+EOBVrxGdyG_1uQFa<5SEDhy=M5=Ye*#= zW3Z#*TuXE3;3}LF&9)$n;)-p-N}SD&L%eAUhK603DTkPmbHPNk23m)z%($3Oyr}X6 zU*o>)hev!Z&tg)k{>bFPz|29X7$H=C{JdXXV~&JS70-|dp8nVCGCryAkd$wTWW3m3 zESB(DNosG5BHDwOhiswHTG&e?L(2N_9tVkrMM!&L2q50A=N2cfAWbC4ub%kphIko| zTXNxd2jQC46wAS!q=MWQ6Gq_h_;3o;jboW<^6J?6DXO7@S{5odLf7vE8(*IammSDY z**>(`ZY{FBPJ%;X99xSFwVB#O5x=V84$pAR$u3LVdDq34<;*}iM3l*w=R4<L6Z5u@IrHmHfO*Z$|sHQ1he0X z9HOTBImjnf_jZl^b^R}PIjY5BoETv`a|z{yPj;dS00)!dX3RBCy{74xe=kpoE@Crs zm!Vz?c?XEpsJJ3sB${mo#*m5uq1xt^UoCF`tZBeWQ6`NmQ%SisLC%okE;gZ?!(%>U zlnrokGzD{!D;mKNf1+GkriJ|>F6O_>_!BZ?5`LH5qIk{}F9P4|R+8?5^*eV;B^$vE zq5d{*iG_I@;NbyYMoo~+O>m3F0>I*?D3lBlVqh1W-V{IvQwKjn>NR61bA_nptPjO| z*^7x1_a4*ae!tT?sbQ(HzE+6$>*=tAqSWVF1B^j4Q4!bQFQjXf zi^R@M6jg@o_NKT=nhUub_31yM=l}Aayz(quu``%@0d}ZuvwB$C8rl1HFnpc%kSAo# zSnxZ{SIt96vx-@zBqiLa>t(If*LN*l_53+=L}RlI<@|VysWhzHhMtOJ1dA^Ig()1# zL{i{(XL4isn*W2uG!VZvaOE(DJX4DV@Wv4nh&(cX9rgl~uK)GP<1ju~;y=>8w4OUs zdvCQq$D{S{$=u%ZKIa3h?*M~zQq8EWZ4VPPd%7%?7wL_qQMcnU&Q2vbArIUNE0^qS zE+j#@&k64mc%=`>V(>34mPlpih=2h5N8R2B-4^1i8%mPsqDs!nxmY)|^M`j?8;pRH zx*0H-7Gpd(oNadMI*9N3)M^8yg=HpNhpb$$o=E7`Q^1k#>0p9a3wHE9(=kkG!}J|s zy&3kqVbu(*p$D)~0;=)}vl)%?Qxi;JB%5hmk4OQi4n39gJJkofPanlBsHCh>|5QHE z;F}NJ7Z*$&2b@0$q`AApow*;>y^6+PPb*;!`F{EUp#@Yazy0KLNH=TV&ayI_DT@-P z=KA`@I9p-G$>!qbM6OKbQNZT~`RC^{$!T?fED2WsRYWP%96X7B%a7k`7*%Q8TfF7Q zp&p54YScO{B;y1P0B^t;pa7giuXbL+CZ`%wMIYuW_*C|+x@oX(dD;lLluFO(fUc*n z&CyUC0k&1r%a?Uue;r}JW{ks+z*|)VX|4d27CTAG?+G``zDfI>GhmDK{=Cb($~upO z`dsXN)pGfniy%|K(VT@9z7eqh!+$UUiOx4B+2wJ_7iCF&6?&V~diCgb^!t~q{Kdbd zrO6qT(>DlbcFC*A{-jc@+yl4)D6vhkYzc{7htDI2#)#YlSBZ=n6ynqai6IFmSmZ+| zAnMFOHj%pd;k-U77To(_x>7A|qN~@Ck|oQZUAa-tWM+Q?4Gd+A2Oo&j@Rm zwTU6@8ObyeekTeIY%?b;u4&4o1l~*UcXEZYd_yslJ`kN4!I)nf0Iuu$ka@TLe)MAmjsS8jgsthko8v!wYGhM32rkaG zdTrV$H&6`dJ7R`lu*JY5l)*KWU|_#QV#18FEk~qA`frxR{TD@D7Rbrp3A_~O@xtR! zX0#<|)!VXQM&@Sz!(X6%uTUKTx53f>C1@;#sl$)q69CB)l_Y9rFi}Z^GaDl$j}0xP zHAEC_6J~7#8U~Q-y;EQ#SO)6pxQ-eHjoOA;W1NDbWc4~xuwmzhT6iT(yV0N*LB&lu z*Y4n2Xyv+dnkr|~dU(a&VN9n>y_U;T&=2%2lSvdM&G*1rJLxqiAGqY+5!e+Xt;f*A z$iJN%m?8g_>p777pXM3AXBVI4BC2cqtvgSEHFX`GU4y;J`E?$88`K~cQe}d3d!9LJ z9{eU4xx3Ow5I_0D8PHf6gatiN$z|q=NefLTQEbz1evFepIzz9P+DUr|R&?eU04zDb!=$BcMEGETsg7*!)saf@Sq44an?cME|p#-X2u>kK!>)|2fwp}V#B5yZ>eCjV#CBx7ZLL3JCW zz4Jev?|r9X!wz1%z7uSSgW9xPVxPX#la;?hHezXG&Hr(2r6)LrQgWotz2wiHSc&gg z`GSBrVFiJHJd7?|X}Z;a<4`|Fy3GWyp0-d2A7t=Tc}8~W*Uf(}+pO#VCpp$rhz#>r z{jmdV?Yp(PS`%2Hdf|pjz&BZFy8{VUY?>}Pj6gF;F$5k->L?G9W)hXA>i2@xp_^GK z>mLz`dzDtrPb54B`x_*)SyVgZld#GS}&N`fN0&pSz zkEU}BtE_+9@WjbYoa}lscD8NX*5sOO+qP}nwr$&-dUyZhc)#{>wbxp|b>HW8oz+VG z)XFRvG@et(9tdq%{4@!bUnxd%;bcjxH$T00eg@fSUbIeoR;l5kFcd#_JRDM52QkNP z?;r%hD!H7JsS?g7yejV1iAg>u(X15ypqK9`#){uH01lNIKmjqM!KoSRY z222*fgLhRvYV3HEyA6FGHQ78oU-uea+|uN*k6A?vabE%cR+E1D$6eH)4%Dv_t`DnG zf*3wanN?0KyM$Gd=$;rxEIUjTf#sU${tT6s+^~;Q6MYS3Y`0Y*$uirPGWtNp=U?JK zG7Bx$6V654pQ_7akTkWNSnXbptl_k_t01>bWi?IWR1O zbs8($LC3kk#HBFuT1MwVwG4D?NoQjkIZKYM4XTRvi!HlC$ z|t%cg*uf%OUQ zDJZ01c*o&3(pFsoJG*LLJ?W7itzwE={%pRhz>d`nISF@(gMXB=noo%v17)jhkzLLH z%#~#SEmM7W~I3#z8qC)Vx-a+$J2^@r!sw4MZ z;iZqt?JiA14N(xA)>0G_g z+e{T=Gnt&#LSuG$LRMmtB76!aBaAIRyH384d{o)@G+_fvDtRMAGzL`1{8UeN9U%Jp z1gIEsL)YYR05wTy<(`^FjsJaSuPT#dJn)#LLqBUEyS(8ziiqET`f~XDqa~k>P-fJ{ zp!qKxNt&h=?9GXj$M(EPfJ{k0yXZPjs>~&2v`GJ=h#KC#b3C5oLuZaVp_X1zAm+6Y z0;7R%nY-|9SH?1-k&t!Z_S6^aoK&R>;^&F(($?nqm-sTl-`=RD$Pd>@D!#hdIFLh% zzl*$?$SsgPiFW)7F$fI*ol-|KmM`Cz2nC*QIaO&Y zNLi+!q`l@gVDx2JBLg+rMN%Lvs;1);YWW88$}qtI6n??oL7Z)s)IVwHmRkgQBI2yv zYfRSrooLodc@<$M??%Fn>7{c-uJhMQ?G2a_B#ym8=e7{WsZ`?=L`UaHg&ecgkZ|uQ zuWL=oOsxvlsFN6d;EC4m7|R806U<~Ow|LE+JMi!>jho6nRkw3bc4(9io6h7wz+&e) zl@oWm#>e`4f=W>-DFa4@;zZqKs!mO{?@xZe_eLSgxw?6j5(s_>WgD~Ybi>Bn@-P+MQ-te+O_~3dJChli10vZt)OLId*k435f0QH8h$Ptl zh!w;&Ker^gVNa(RjQpq&{0k4}T0jWeGr(xcKd9}NqtTs> z|F0{q4Kq`kKBp7Ef+~{z8KQ~$QB?gl7&1ZUUvogW)F_?-LoZv-csST0Yzbs?6M81| z-t>WFVgvWz7i!3q%x>9X2bI6apjNTJ8GkapHw-e!tk%j}naV4Vs#191{Tqu6sUNMR z&G{(UR|!}!Q^9G*N4#5rO7x@IIGk;4+x}BFgG~`!HES2uwiCZlmHu|-JSJU>lRc_y zzDb*C%|s>h8GP0fD4}joHr{ESd8OPqE!)sEx=_qVIoda-WZK!_dBGtUZ(Z7cLzUAN zR&~v8wlr`#q3@@^S_4F?y2!=W{t%BJ$f(XC#PWxspmY=|li`3m`v&MfUkgWpp{0Xv zBZ{@u?Ms~U~ve&euIY|}*a{v`gs1B;7iq-wRa=7}i z4faCk1wwJ>bU9jtnIs2-Zkr#8-gBY$u|exE7{|6(611k)MKq<@Y&UNtLBdMU zr^5Qyy6<(XwRgh&bD<`DMQk9~d*%74G;EE_ZZkeEbbD_&+ah2+EW(#mL`~wi&ZQW@ z;Y&+Ch`JtlOn!9p{TyT(<{k~`Dj^N=r!#01|5TJIM z@EB@l38oECZoW@p0q!_BP*QnRigeP?Oh6eJ-y<728xd!yM!}iXi0B@2cy7xv)t{I* z2BIlGZ>bDv;Qu*eDZg_7o`|4ql+`_ zo-^a-ovSmS5BDo1+REE z&%)6*S>o}E8|_ky{gYF&LjiyQVp_+K{1n_yhCa!7#h8cu(QqJCk$l#g-{Gbo&ALsH z#BXIsr+EcsWirz8isOaqHM7Aq|)wcmJzLtHUfc$PqG+ct#QOR%U3g>vA+dsX1VYM5lmrMdQ2DO$r7A` zi6dBXL>4FT5L|y?&j6ojqvGez*ae@Kw=L@hO)z*|fAvNNN|>Zws8y4t8xWRJ8V*gs z+AgW*&v3^LX+F<6THV#esS%8Fj-Af?LKF33M4b`1&q_cY<>YhB6hH6J^t{G8e$HOEUO%gop?i zwdy`25&K62{Q%CW4f+VDFwNn;KWY~^#(JA>pQdhLMN@=T$oP{sCY{KbD=`Z^q&C_M zhZFv+T+RS<&9tbpKrXhnS(q37sY+Fa)qWx{GUBo2$$Z(Yiu!Rym>{2DTk&&)=hjI9 z>h8qNXt*DTf#BXx5p!;=BL3{Mk$yM&>z23bCuRPh?4vh|64X|M!CC<5TJaEv@!g^s zpH4;gFt!C3hgX$C2|^~440i!-v5rm3t0h^YUx9Ob)FSzw=TxM`bw<^i$Nl9dBbb2QQF;SR)rHUA7Rtaw#PP;&5wuPH34Qb)af70Qj!oOcrK)T9r$&G5XW0zro6pKw8a$`+R?uNP%9z_4(B7uKlhix$}{&@uOA$*6s^bNMu1s z_0sv!v(>P%3Q=>;#hrC0S~I^~gnod_BEnpsi*&)|DXZtqFORl7)Bc6eQwl-keT8&01y*rZ^8Zt7%-Snj#~C=<1VLHSh% zrb{)PMjygdW84yLQ0B%Ty8~->z-OGKvZ*p>B}#sSyeNg3vK8D_wAV@0bRuas>NCYu z{!4eiEAVQwhsFE%4quWj82qeXUpkF?e5-S5ShM<@h6j9wa`R7lP?fULIA9p7W}G?c zE&Y4nFBNRwWDrF(QY-CR+|dKBalwM1A&n}be^M$j$YCexslVnkh*erX|dB)&L1wobWg8a?nkOB;GAQ|H89mw+vdT-%=?sswJ zloT8?R6J+?<3RJsAxap7ZKa#%pq^Pgyt12iHWve%E(K9Nq6EG=yO@i(93w*rB^Gkw zeR&~D?+#l6+6d^*$Y*xp#95cCcotR+-8HkeW;G^{nJq*|L$B`r z24rfKnvkThN5Fp~vgH!?{+x%r~04~Z>s)N<)_pUqyhJ8zD(p~&(D1XY*q8!=cE77_OkroP# zbi8YIRJ&VGCP79}?>)HQ5{I-T9+8ssibeubFdrv4bgS|vrIMg8nBB_Wj{l){;$8@P zDQXl?5p|)$_H0-_`U!5*vPF)d*~=W*<*zd-u^}=3&&K?p_fETZ`j-=5DERt0V$;)Y;-%9IpGysx%6M0 zsfOgX6%i$G;UjWzURN}q2-=?L3Q=$e3q9()|DbMMGpe10OV)y?Aa-cT@Tx?VTxWU@ zrMveC5YmXx1llf8YnJi^XEw6FtbCfRb7t0$N4_6+w2UJC00qx+_ki`|lgFn5IX6zp z|14}%htC(cB>h1OZ)=a}engo?xlG{fClL4GBk@j`L){$z_z#7v?Mj&>sjysOJjB?} z1ugvea1b~7x#}T^Wy$Qq_R!R3a%jmmbcl-n)P4%SINxKi*_BHS#gc!H){V(->m0yLtP1+zjJ(db@^zh z1r!>w5NBnXRi2)mQ6Co0rQ*;WrBQ53sivLkO%>d#y|9y!B?PPGj?uZZ7_mV zmNQyU`*2!0qdxLsUEL^_AQ&N(@aVpNONDy1o~I@RxylgWVsRxF2!FT$#~FxcGaAFZ z8~LqQn%i$Gf~khmZm+ym&IkPbcdpNdyZAK!ZN1$at125ZIetkkrb643NY8(QL=!2+ zSedrsH<BUOf&H_p?RD4EGzy4J*x$3MUs=*Zk7$?J z7Hj#;<%=xLk5`rc*qB^_m zI78Of_D4hn=O5?eP(oK304K&N>CfIKX(+jT&KXbYuZc^~(4oowAJnioMeui%^SX@u ztvic3z~}eNUg@o?OVIZcNQ%|2!afnp+UPox|O0aeiefaf_ z4GVA`DIAWr#XxjW6g6B1TiL#&8n&T5+~_BKGae#%92hb3GuvojGkDJ>eYdgjo!z_k*uk1jqpr7c0x zC+$yv#DLbEvXLkdcV$9mj#b|&WrK92U^@78R|^>ddj^9w&Ywlh9)qbU|E>V$Mdc`u z;bK^itZkg#i(JakS&!w&Y%#){Vw^)vpdi(4)aqY+uAZ?{H@Mw0mE{OUzK zSv&X>&SK6zKj2SpQ&=Qs_2=5o9be?x452gLMZ@YOFABZznrrQPMhX$A}^-OJ0UfAlb;J@20@6 zzPSz?%+3WfGhqtNI;7a-lPF3zS^Gc z-6YCDltL`f!9S<_*Wq_vyAjRto~B0q&c2EreRJJ_YedX$60k`G-mXgA4u${8Yl1H_VTF zI*o?iC^Xi?of-C?41OQqF&TK{C}RPv7Dtw{RDK@^mtf0Bj%>@8MA9G|7gOTl9_v z=B{zQh68ulJ!~<5N(9s=u}S~{T;F3N;K7r|``D3Lv=m{H8K=Qw1-G%WL?{(_@$d6* zc3jl>C;-l773^kic+X$C?ofWY#(`v^1=DDpC6IxbbIj6ON?{mH(fqyWvfM6<3$4vaMMw!F3MezJT4;0|Z} zH=nhkNDz*nx`DzC%65PTr#dR+PeOmHTI%UTm@dHfl9Cs%nvq~DMRNmG+WhVYn(3-R zm}J7At{l}pT}YOH?AXq(BM(+R-C`Xs4^;Z0{&li(f;3GmPcx2$F&tXyL@TI+`s8Sr zp8!MRAbU}_BbX=#9+Gc`n~DFJ4ieE68yfdkr@@uKQuN#OZl4NK6{X4kFUs>dk^Rcp zmYOfsKq+eMfW`l;d9ZQDQBELIFG_aNB+O&Xvr@HmJUkXC-_Eo#_BB%?zv~G|jp=9K zAr&>6$0-?za8I%6`}oGdzsZVA3eN*kFQcIx2c`-lupoxo#hp#4I+{z8#RNl}FYr;ulZ!cn#0@U?R2JOTV%t0*H7p98;lzZUoKzA%gMryy%G zJYnuQb3N0cw!oDl6q>{@B_tg9zJ}lWzfi_ee$O|?(-u!6mvDief==@;VvOb7ZfcHt z&f$tVP24UKca8MMEG1bPE%r$n&&%Hlo7a|(svh1mPIAU~amR&@$MVsUO3qSq?|JT#@=la(J5Jvzy zAd|6C;)ka_Y2c{NKq@$L(H8#{QFduFv>u=~0__aEhRY9<-4Bw$73lW59@Aj;75Lel zYkNby0D}XfZg)u!^HAoaTN{1-JZR~+d`=x8rJdrj1NC+_I zGQ_;pe;IcxsmOjWK&jw7;L`XjXQL)7{v6ysBGbefufr%PY52&WNix`7Zll~S1(edc z^zvHfLEL`p)W|v1CzUakyfAlo?-r(446XDDPG$mUTg&paZ4YFJW8#k2^M~54l1yut zZXNqxC=bL z03riYW9{^=rET2izp-F*@~)HcF0oWj*6e2j{Id(nd48c3|@0>Ds9X+U^3(#INJCe z{@wjDDC2ALqfN~3`V9kUVDl>hl&fIdZ*LPST1e^4* z@By4DA%4|+KTU_pyne$O9Ig5|J)&?8QM}?Q*_J&-^WUA7(L}%lj_*PZpVeRivM4AeCLeTnvYLqz- zOJ@4l(~Ezuz5vsC|_aGG-+h_5+h=_BqZ@+8+Q( z*=OtRCu>Obr>F-@Hv3kE4Dk?Q08%g(iSOtaX%aH21Sdhr3McGpduRIZFR$}vuk&wg zD6;9k4X``X!;Z2-Gtd)*)JxCwgif&~Q=BCO(Ou0OyrjN*+qN_8xiL%;kHwc-rPNR< z5#}3063Nk#5ce-wan<+Qph!g7{JE=Kz}SsN>WvnsQI>TX3)lx9juP12#X2%wXv#0C zV0SHCGZ@nz1-c14wC9LsA0BGm?l!E&#)}}QrRUiX)IgP~c8<*f>T#=H-m1Uc7)jCA z_oF{XqSXdS4VR3f9-=>IdFwV#d?G{2YS~j}6PGEaQoHV`fR!5_?d8?p|IUqb{|KHR znGMMPTacYK0ezbOT;*j{U^va2;Y4&EVj@*w$c!&RVl>_L0NVE6zqL*K#hb19KlL#> zQ)0+$m>h#AUTQRcE=~~a*e+H`fcnwUqP$nM7RkcYUvW-^5RyQQ`V^(X6}1K#xF7wn zGRkPZ!pQ)Ld6{!4dAO@Dxmls8FUVRFB*cmSS=mDemT2i5VC>1-8SD)6v^D6dq&ahH z&46LTmu%YY&t&{_c%VCPstTK>``n}BNPoLa?$&bXWn_c>h}k1IK&nI*?jtRMD&`9E ze;-T!b)|bps%tQlueBN?2cebHs_`#o;|P_j(RWQ0Meu8F(+*P(Ofxdgt~ggv+qBTzG07vVRG%N zu@;s@KsTv|Z@r^N@m)u#;u4i`1!~|DT9>n$F2%CdC5N|WZb+CD%V{IH0jIUXv$7qx z{Y^!ow5>l_TRc%Cah35$$e_nC&s40{H>zyRHKPdUDRa8>5KOIqOp_s4l(%5o)3|H`gx^-N51j zvA_af9_7Z1H}UKT@uhlipptV2ZoMg`HW>`9Jri<7{_CO7FtId5arv?JZ(-1nd~o^6 z2C3N@Q|lujA00Y{-ntV9D-muGKb(>})BZye*wHH0XAUD&LSoccmG(V@B zM~0ba7GwzkP@#ensDckXA&2UUXrK;Z3KVOD+*A%43I$9nMXRRXxG&NYm`m$F@Tu98H(zQA3B90?8Zv}ZE!1`D5Ho<)2PE~${7o0_ zAF-l=9J-le53inc9!ru(%tppL#J7p|UXotM!S#HU zNYYq6_`^*vvriH4hvswY3?T+Reg87KYwLsT*C}sh?VQvqi8!)AqN=yQ{TR)p7d_N0a^aY01fB%D zhQU9--DmKf$ae1i{xE+r%EZ7>xM+@y9o3bD9vq{`6I7{3oE+TF_6U{$zGdm7ZNW{(r8xNaR(|ck z;;+;55t=BDI2KC1eaDTeZ7fhHo_Y2edHOL2U%lu^(~+!p%O~SBGvr?B1KgoDi^1}k zt??GU&;8tEKYN_3)ppHVoCGFDi3Q6-qOckTi75>xf9t>_`qWgCAExbiA7I=~RuoK9Rimkz9W5JvL%#R7jUXz!-<~1Ak=;@Ig z4fGCISSG_gz-^LuAQ*MWg0@a1d25IpksXgHYEMZ;g)J^H9?;l#51eHEHxU`hCX4A5 z*1eK<*AbDEVcx$tOIn70BJvHNZU-|w_+uRdn^TP3mc(^JEo2;hv~SGP){2~DHnc|v zUajQwQsTA5{O9*J=KAS>#HccU2l_FoO?IN7MS=&2Z?4+d4UD*&M*ceyYIyp$)ZDe0 z*Shy05A>?fX6J;qu)@?eoh#LJ=rxjX7}_L|H`=W|j$&4GjOP?L{gAg%4d70r1L-!P zlpjRzch`32Vc{wBMnxP=jiGgVk!tiU;~-yg4Ru8QNSe51jzi~X=2$YD^yoTo?>c9n zc8zN40n|U5*vJt)pyxS8CX^Xu81)?7A!#PNVvVobv}&LxPtw+t*%%D?vy^ts0KMe* z-cML5tIMoj`>Y(^YN><^4bml*HQd?Q5zlbre>ea~wW+G<>G@2E$?=kWe*pa3ia0_f z=Q3oDR4BDk^%r&_7F}6kutsh(OWF?yc3pj(5|m)HFW0j4IpK z_j%eq$z^$k28Y6rE@^}703G;2LJ#A!#2Eun0qa;udaSYgz>a;(e>en8%@3XgrUX=* zqD9^FALOMuDyEXjKm735%Hd%)MYx1D@9!c3Hp?V1fwNo-Dj6)ZGiVK%@)!jtq@Ot6 zY8h=@Vp^n=(6HM*^!j2~)Jv``2FD!HaH$R?DMw6$L-RRlIBR~2xpTn2#d`5-s+c5v zdrqrMgOj#WtDMO5IEt=%V-)dolG!r=Ww(rS;o>WUdiZW5tmKN0)S&nhRYpE$W`|s+ zwz;x++a@5ky6(~GyY>VF#TyLVEkG*DBl9{sF;FVBEs z#qp}|(Oi-Q9xhAnC{z7@sbS?LV9xxc8c*VWjZN|`7>xX8@ z4avEzGf9P>$I~gQk1X^Q6O0X@Bu950P(AxN_h;$##oX?jHCHwp-437GF`~vRIi!ug z^@fELoj3jJtz|kgyBZa}NDwZpA=YTb-4u7b02jdzH6L14$PHZ)eqOPY@M6rvStn%R z;97i^)uXZw5o$g+JCtGJ{(HlRT-Wl}4$VykNh&PfuF(k5Xq?ykRF~A6L<5EYxL6Sy zBHk6R^;|oT-yqS5wMnSUx~XZo&ylR8CLe?vyMP~PNHZoNSHuS z^V9GhnHWxMf$1hpbxmtcdJGq`Nwg8MOt42TQ;-raald^QFPR!DclLdPz6NgkphQb6 zF9u%Gn(y*LVA>MM;g^3EBP&N(uh;Bh9qwh#c_V#&9lv|cBbEJGpAKBtJSEfUsHRUf zbG;lR#Ec$51z;B)8Okt|BzfGG9GQ(%-^Mkd{ULjrFy*-ifOE|0z9g;le4G!m>-7+q5|WhY6@Z2Hv;J(v!Q# zJvA5Bn@W%jgcMnn)dIq;4MJh|#Dad^3Fqt;_w3vwF)Ss8l7F)UTqYI>eikXm^f>=) zJc(jU{~g-ZS$k9diJ1W*2&>HUdQ}2bwcrYy(D|#3r^+4Vk9LASsnxABMB@r&i1wOb zpMf!rxFLDNM5qyVvy(6d;%t}`|E6JSCV`NAhLMm{p17MArFI@lG>VAyKv|CBEE-zn z`9trKf`X7`j)0lUmy_H>Y|I4T1?N?DEGikP20Z4`fsXi}?0Fm_Lf4+c%dqsa>T-7YP4Euq(`T-h6y zjSY#y6Mwe;=zb4aF$+u4abs$%k1Wb(s*+^jB=z9za?4E3S`w#Z_)xN+=s4jhG!^cW zk3V#B%~i-4>^5j?mLsKuGf3nkzI1QHR6;F5bg@K(`ZdcKt9R8y?)wI#rCVn*gqW^3vw5$fiz$`L+_GZ`M}A^<^M# zNzRHV7&&Mp%1m-@p=nIht?MZF;L$94G;ulBoSK4yNkXt}JL28+kP8)5@%reC*89*Ub!?aIN2AHR&XsWeF@L9NoUF*A{#6rdB#z<;?YDRk+3f)5?j3=3#+ ziK4K4Q_$Cjvr?4uB5gRl_DzB%`>%N&Oz)k=#J=5${Ca#9b(L(;NzqqVTO}IL{eoe< zeLSK1g(cb${_WR?P1FqZI1WlCx{v?BPV|`8n|@`#+nwnfOM|r~QW-W#TrBy1AnkdiEd`VIBpZ zZd}T&`yi}aU>A`B8t*qdxb_+AkU(T(mm$Fs1Vwt91qow4^zxmjVf(aRLcc9N*>#bj z%0#n7v$<)S^&xJYO*&(jqB_it+e#@}5cOqW^qB3vApGlDQ_bLdyMh_XBw?gtcTHaj zjewC_A~jMVl*q@274bb@FRf6jqTX-@kb1z!Qkz}RlFj}KN_>@^iEAZmbsvo6Mf=a1 zT2LktR9%9)_I$bf^&_glBDg)E$<+w3 zUf(&fUg5=L@j~3(viH`}5-5DL4qekE>1sR~2CXdI&J4m>eEcFZmsVrIkOG~V&wr1C ztPNe8=`>l;95=t0>C{KQW1v%$ue{hrG>qXwphjvq)B3yKNF(nAs+^szm69Wn4cb0B zGl&`iMPo-p&+vHRg9~*u(49Q^! z30HbB{0~>9Txys%sv6bKGi3xfc7z3y=!qM=)IH)bbksIdjZEQY`7q2rmXJCU(UF2# z&cb+_JScc14hc#LJk<_W4M%jJIXdm*!-bQ*01OEPh=IjHvki|H#LMV^7L(?IqNnoknFqo!qWcoUPIA4LFSDVWZ%99W3w{XJk`{l5x}B3uW%BY`#5nF; zoQJ$ra+|jcuN1GlUe2iI?|zrn*DfLJL7~J!v|Y$I1{R0N*UFpVFk>~KGro|5d;g;C zX+=+=dQ=msO*4E6&>JjyezMB+niSUvPtTX0mpZP|@U@yQnv7Tp)ux|4GiZv=ccmY* zGSn8L>g_m^LTa>Mc8dHY2jPp>+{Ox9lUMTVquWbR1K+5GehrFlmDt6J)SMs^VQ!uf zOZtd03k;`a$N&~N{PF``L62!RZ0-CUtBJ1|meG7)nIqMOZp=`Odnxv#xX`t?Bwl$! zLt1!CHS~nn=Ks~;MZH`pll|%1xG2fosFWf1yerITa=JX@0wATo5Fkoz$sKK2Ltb9M zrNoE%4dj+f#G3kMW5`F7ZR7r6r=b$7JK{-NCD1h-1|!sWHhYxzS2!t~tj*1hy2FWX zB%yCM-+5TwpjH13WYOmk9Hi+NOrGLvJE~Gp8x3O&b|YaLSSq4j=r&&k@%r9&?ev0O zOQzpP4CQr1vPn^~1j*WyYk@*f60gCUh&z@z5Y5i9V3jNT3`qVz3t%W=tmFk%7tV%N z9zRMfPTJc+c{*275I68T002=c|qh}Psy#i(aYx{8{H7WkvL{y(fO{=~XqJZp*l+IP$ z5?G{@pL;IVAfjA7t^}=(b7|0_68Z_DzL*O@x+`m&MGT}J4#|}o4mEO*&Z@_P>S3Wt!V;E>H?_49_eaCi&PVFM@LL;B zq7|eUMMDU*6Zxl7_DkuoHsoYj$>aiJRk-w$0LKHgY5=P>4oZ@Lx^u2WrFbHg~R*|NY%Zgt5^?)^#BfzIQ=I18wX`MDD{l; z7a9}(!Qa|3oHAEq(X}~#1K=_a!eq5XD7#^SW~bkMK1HND{z!p$bGo4jp~isu+5$Ym zIq6?lbMQw|>d^wi@^&5IW>uuD@H6w92@~YAqz^O9-VLOsYLz4$2ExA>mlLaaK(!^1 z%kd;Nkx=-p!(wgXso>`alrvTcvIa zXPG>N=wyCqWRyBL%<}pI+0E21_%1HVx;QwJS0>Z#o(i~_*|cusfw zF}7-Fg?5U2LtlG0wy0VO9YzRoOhS@apcolqBoOXlEd;3&RRm{asb3X7Aa0A7*HH9XBP_@MA+&$Rfch{~%Rn8OZ#SNA^W7FQ9_vzmpvQZocaMJ7u+sCy?%9 zouJs@mq1<&eslvi*R1@&tN|^bP!;yK^HYIYLX4YJpd;5gdQ1<}=&IQ0s!x{eZ2#9$ z`G%8a^yY#T3fvd=>xyA?W}2Ck`V4p0pvdPOx%IWJ3hzf!?T73HGpB|E$Xu9U-JL=Y z#2r0Kr9cO*zUGYR!SW)e_2=;b73M>^Q}c|sW#*b^`LzxqJ+Hb}#~*n6C@-=TA({G@OOU_?Y+>;db}-Iu2X`K!++#7kb!!UzE`)F+sLELT=^$A7Rz7)CCFZms zIM<~_Qt+27h>X1-VIt;`Q6q~p0hrU4lx?lpdZtcsqh()`eP6&t5`RTZMp{tINDK|X zv-x0f=6~>6A&q3eLY%Z8LWgBcsa#9TSgxcrS^)?%p>1%~$W$=}Q3P^^$*CNy=wQ># zyt983&8zO{-8A~ueHEB1O*s|-67M3Sq#7wyZltOJzc6(JDr97=#qB$XjD4j%5^aG^ z<5YJFrHQ_3fsxiUu!h7yJbuf${DqaD_-0%>7) zH3j_6QL=`1vwpi{7@@0Jak&&ypOMAUnQLj@|CXd00I0+&FoN!I^3QwC{3)$*LgnDR z6EZn3Xom@WFIUFqdq-IfD{&~66BL>nzUW|Hb&Zo7CzyVO9%q!9VMJCL=E199QCMqX zpmU`mf;`FxbYTFcIv?Uqh*}xpUD@HqiNDsl3vo+k$d$*kz!1ZB6wU|0-~qS3olhf) zyxG#Q@jnEnObu-9BG+`a8_w1pQX{9cvCt*Tz)PTC!T6O&<5Ck1$(A+8(FI;mbBeNc zg|Z_Kk}ZbmUy#AoJ(`Z8T@Q1cyNgC05V}%U)q=MkLj5twNPE z5V;JMeu_7uT}27>`(2l}S+gM#Atu1rXwUcT^kW) zP%aeCBkMCsR|84hZs*gzKmFe!W?|tRRt{sL%NJ3OQHu}4>m$VM_c$naWV3OcG@mSH z!frH_PudJ}M1>dx6D}E!CvChK@!tkoJE5ZN8}HCMQAJE&Xc#|OnB0gIpJm`6`Bhl7 z{R(vAOriTM8sHfQDu$Ow_fVPLMlC*kSdwP#{>&bKOPQ<~hhlAgDS< z!;R6MFj=ME6dFy@n#5Cd*;{sLmkOa9-BfacHK>s-b}5;OvceHU?gMiMadyvbtyX^! zkKq=x6zYCc9M#7Ed-Za@m?+>iyfowfDA8q%@(!bKtKRi1hS$5nx<%Y<|>hUdSlJ-D>|j0pYC&I;O} zHkl_gq%rP{y6S6!uiqW_Jln~Kz|d^N*ZG{J zdsr)VqRe_&bQ+iEH1jzom0xNp<&;!@Pc~u2*a;8j9)qfuHmKmC`#7vLBvsp$DU>_* z6vgq4^^XV`y)q<`=6sb1k=3D$)KWgPysCZ7L0-kt0B_nkxjwnX_5OzyfGBRcc3pMK zeMw;%u?VparxV~I~1MPs9n)a_LY zt4aDTWJy~}>y;5Ek(XG?E}@!#mi;-52Yz{CE;+aY{@-PI(Y-`kk8&gu!r1;B^GLnZheFa+il%>Jb?yCC zEjS@-Y!f#HixD&FV(x10OK83ENoGq2i=A1Ik097+4Ae?f#2je|X2g@P)pONG zlIy&v&?4$e>-iW2W>a&v=I1ZSeU<34QPB zH&CIgO-Whtuj#+XZdhLfotS=b-Uun4s2Z2rL>SGQ%{DuFzDk5eqHP{v68uPNhe-I- z;oOqlfrwAKbH7cm7c1!dvN9Kyp5a@O%Q+BsgT;Nha^kZL{Lo(1$<7FU{h zJl={}P$|+H9X5_Kx!mB=hPF%U^>i>t%EAJ2Y~85SDa-C?|ErI;Xy znZO`&gTg@lJ;PkCiZ6C*eKFS4c`uV4@sSYgP2G^|I>yTfj)?3yx3$Us@{KG=MLSw; z_G+;CXUL`}#;URQY+Z~p<~#)=qbp2vPcsZ zC(5R``kV3UQa16U#t^HW@}J&^^p-CpKhy%x*io1v+{k&6bm zwz_}Xu+)w1+J25nS*+i3Z&nHVL6c0vE-WVi-cb4SJu`}>vX)nL3EvgZl|6wCMj30- z+R2Z<|7XgIxSkb${X+8rp=(gwQ@u(y&uee4xRpz(qE^jpGuOTgp7EGL0jvYJ+CW^G zp}i$n>ngo>YU`TRN0ZuZ@^@jrFnREp=j&Mr_5ueeLUy%DA3oAv35z8>?koKrXLw>?xGUbD0hO{v-ZX? zUmLcnpu*D?D4{c~5^rI!5EV05{(ur`A$XrX3%(q_55QMl(G~je?8!bpiqr(G)QFRd zL+-VcCa}9d4V<$ZTh}>)CRpiiY%BNMaoQzMO*uQsmc0Ws=^O^uQbPHz64s)1U{>?XOYy*AZG;gQXKEcj{O zzq|48BeC3kYM3>r;FQ16!n0ALypGm~6VY%5^IK(KluAn3RrX3RB4-1v+{;Z9ppCXF zNti$zYPdk9$f0ivj7Fkx4QY*!G$rWfXq1g@6TE7>cDP;2-y_&*GGs;10#3P)IdQjIx-AndHi8GPNcd z$iwS91o$wuG&OurdHp+E%!A&*ze9;3m5Uia3hZkCA$ZcD