#한글: 개발자 문서 매뉴얼 검색 및 활용 - 이맥스 데브독스
2023-10-11 Note dash devdocs emacs hangul lookup manual notes무엇을 하려는 것인가? 한글화가 잘 되어 있는 공식 문서가 있다. 예를 들어 Python 말이다. JavaScript 도 마찬가지다. 그걸 이용하자는 말이다. 그리 되면 고생 할 것이 확실히 줄어 든다.
History
- python 한글 버전 살리는 중
- devdocs-browser 사용하는 거다. 헷갈리지 말자.
NOTE 요약
아직 완벽하게 생성한 것은 아니나. 만들었다. 아 그렇다면 이용할수 있다.
- devdocs 를 이용하기 위해 Ruby 를 설치
- devdocs clone
- bundle packages install
- download documents (korean/hangul) tar.bz
- fix scrapers for korean/hangul
- thor generate / package
- link devdocs-browser.el pakcages
NOTE Devdocs Build with new Ruby version
Ruby IDE 여기에 Ruby 설치 적어 놓았다. 버전을 맞춰야 한다. rbenv 로 준비가 되었을 것이다.
다시 확인하자. 여기서 읽어보는대로이다. https://github.com/freeCodeCamp/devdocs
# git clone https://github.com/freeCodeCamp/devdocs.git && cd devdocs
# rbenv local 3.3.0
gem install execjs
gem pristine bigdecimal;gem pristine nokogiri ;gem pristine ffi ↵
# gem 을 업데이트 하라고 명시적으로 요청하면 아래 스타일로 하면 된다.
# gem update --system 3.5.4
gem install bundler
bundle install
# css html ... 등이 설치 된다.
thor docs:download --default
rackup
# gem uninstall rack -v 2.2.8 1 ↵
# gem install rack -v 2.2.7
그 다음에
/data/devdocs/lib/docs/scrapers/python.rb 수정
# 핵심은 다운로드 받는데에 있다. 이걸 받고 이 파일을 기준으로 웹과 맞춰서 생성한다.
# 이렇게 다운 받아야 되는구나
mkdir docs/python~$VERSION
cd docs/python~$VERSION
curl -L https://docs.python.org/ko/3.11/archives/python-3.11.7-docs-html.tar.bz2 | tar xj --strip-components=1
빌드하고 패키징
thor docs:page python@3.11
thor docs:generate python@3.11 --force --verbose
TODO rackup - devdocs.el
DONT Python – devdocs (ko) branch
아 방법을 찾기 위해서 이전에 프론트엔드 작업을 했던 코드로 갔다. 여기는 Ruby 3.2.2 니까 맞춰준다.
ruby 3.2.2
- 3.11.1 다운버전 - 웹 3.11.7 – 별 차이 있겠나
# 1.3.0 thor unstall and
gem uninstall thor
gem install thor -v 1.2.2
gem pristine bigdecimal --version 3.1.5;gem pristine nokogiri --version 1.15.4;gem pristine ffi --version 1.16.3 ↵
# 핵심은 다운로드 받는데에 있다. 이걸 받고 이 파일을 기준으로 웹과 맞춰서 생성한다.
# 이렇게 다운 받아야 되는구나
mkdir docs/python~$VERSION
cd docs/python~$VERSION
curl -L https://docs.python.org/ko/3.11/archives/python-3.11.7-docs-html.tar.bz2 | tar xj --strip-components=1
curl -L https://docs.python.org/ko/3.11/archives/python-3.11.1-docs-html.tar.bz2 | tar xj --strip-components=1
Devdocs Cmds
# Server
rackup # Start the server (ctrl+c to stop)
rackup --help # List server options
# Docs
thor docs:list # List available documentations
thor docs:download # Download one or more documentations
thor docs:manifest # Create the manifest file used by the app
thor docs:generate # Generate/scrape a documentation
thor docs:page # Generate/scrape a documentation page
thor docs:package # Package a documentation for use with docs:download
thor docs:clean # Delete documentation packages
# Console
thor console # Start a REPL
thor console:docs # Start a REPL in the "Docs" module
# Tests can be run quickly from within the console using the "test" command.
# Run "help test" for usage instructions.
thor test:all # Run all tests
thor test:docs # Run "Docs" tests
thor test:app # Run "App" tests
# Assets
thor assets:compile # Compile assets (not required in development mode)
thor assets:clean # Clean old assets
FIXME devdocs 고민의 시작 - 한글 문서를 안되는가
devdocs-browser
on Emacs
devdocs is better
이게 나의 질문이다. 아래 여러 것들이 있고 이맥스에서 패키지로 지원하고 활용할 수 있다. 근데 나의 시스템에 잘 맞아야 된다. 내가 커스텀 할 수 있어야 한다.
devdocs 을 이용하자. 이게 내가 활용할 수 있다. 근데 이걸로 어느 정도로 completion 과 연동 할 수 있는가?
목표는?
모든 언어에 대한 가이드를 내가 관리하는 버전으로 나오게 하기 위해서 프로그래밍 언어 문서부터 시도해봐야 한다.
이게 되면, 한글 작성도 프로그래밍을 하듯이 작업 할 수 있다. 같은 맥락에서 말이다. 자동 완성 대상을 수정할 수 있는가!
JavaScript 작업하는데 한글 문서화 도구가 나와서 알려주면 쉽다. 최신 문서는 언제나 얻을 수 있고 각자가 다양한 경험도 공유 할 수 있다.
즉, 개발툴의 문서 도구로 우선순위 1 번으로 나오면서 스타일이 잘 따라와야 한다.
devdoc and devdocs-browser
매우 비슷한데 eww 로 보여주는가 여부. 저장되는 데이터를 보자. 형식만 다르다. 둘다 잘 동작한다.
https://github.com/blahgeek/emacs-devdocs-browser
자동 완성과 연계 할 수 있는가
언어 별로 기본 문서화 시스템이 있다. 이를 오프라인 devdocs 로 바꾸는 것이다. 그러면 내가 원하는 대로 사용할 수 있다. 멀티 언어도 가능하다.
내용을 수정하는 방법에 대해서 : 마크다운으로 관리
둘다 html 을 읽어온다. 다 마찬가지 일 것이다. 이 파일은 마크다운에서 뽑아 낸 것일 분이다. 즉 수정하려면 마크다운으에서 수정하고 다시 내보내기 하면 된다.
DevDocs
오프라인 설치 중이다. 이맥스에서 이미 패키지 설치 했다. 보면 활성화 할 수 있는 엄청난 문서 셋들이 있다. 좋은데 이거 양식이 무엇인가? 이걸로 해볼 수도 있을 것 같다.
MDN Web Docs
이걸 오프라인으로 돌리고 싶지? 아래 참고하라. CSS HTML HTTP JS TS Web Apis
Dash and Zeal
오프라인에서 문서를 관리하면 얼마나 빠르고 편한가? 여기에 한글 버전을 관리한다면 더 좋다. 그리고 내가 원하는 부분을 추가하면 더 좋다.
These docsets are generously provided by Dash. You can also create your own!
Dash for macOS - API Documentation Browser, Snippet Manager - Kapeli Docset Generation Guide - Kapeli
Offline MDN Docs
https://kapeli.com/mdn_offline
중요: 이 문서 아카이브는 문서 앱 없이 브라우저에서 파일을 여는 것만으로 사용하도록 되어 있습니다. 대시와 같은 문서 앱을 사용하시려면, 여기가 아닌 대시의 환경 설정 내에서 문서를 다운로드하셔야 합니다.
스크린샷
Emacs 지원
https://github.com/jinzhu/zeal-at-point.
Emacs : available atNOTE devdocs-browser
이멕스에 다시 설정하는 방법
Emacs 다시 설치하면 간단히 불러오기
ln -s ~/emacs/devdocs-browser/ ~/spacemacs/
넣어놨으니 사용하면 된다.
한글 번역 된 문서를 활용하는 방법 devdocs
Dash 등에서 문서를 열 때 영어만 보일 게 아니라. 그러려면?! Docset 생성 가이드를 봐야 한다. – 쉽지 않겠다.
데브독스도 가능할 것 같은데?! – 이게 쉬울 것 같다.
각 언어 별로 우측에 Source code
가 있다. 이걸 긁어 오는 것이니까 한글 버전으로 바꿔주면 되는 것이다. devdocs 를 따로 호스팅 할 필요는 없다. 오프라인 다운로드가 되니까. 어떻게 들어가는지 모르겠지만 위치가 어딘가?! 찾이마라.
그냥 아래 리포를 가져와서 로컬에서 관리하라. 그게 좋겠다.
https://github.com/freeCodeCamp/devdocs/tree/main
나만의 문서 셋을 관리하는 방법
로컬 문서를 가져와서 사용하면 보기만 되는게 아니라 직접 수정도 할 수 가 있다. 분명 특정 버전에 국한 되니까 좋지 않은 방법이긴 하다.
좋은 방법은 어노테이션을 이용하는 것이다. 그러면 문서와 별개로 관리할 수 있다. 스니펫이자 책이 되는 것이다.
다음을 봐라. 스크래퍼에서 긁어오면 된다. 양식만 통일하면 동작할 것이다.
여기서 가져오는 것은 html 이고 이것들의 원본이 되는 문서 파일에서 부터 시작해야 한다. 어짜피 제대로 한글화 되어 있는 것도 거의 없다.
되어 있는 녀석들 (내가 사용할 것들만) 가져와서 연결시켜 놓으면 된다. 이맥스와 연결하는 것도 매우 중요하다. 아름다워지는 것이다.
Deno 이것도 한글화 가능하다. https://github.com/freeCodeCamp/devdocs/blob/main/lib/docs/scrapers/deno.rb
ts https://github.com/freeCodeCamp/devdocs/blob/main/lib/docs/scrapers/typescript.rb
mdn 들 https://github.com/freeCodeCamp/devdocs/blob/main/lib/docs/scrapers/mdn/javascript.rb
elisp https://github.com/freeCodeCamp/devdocs/blob/main/lib/docs/scrapers/elisp.rb
mdn web docs
여기보면 mdn 번역 컨텐츠 리포가 있다. 여기로 연결하면 된다. https://github.com/mdn/translated-content/tree/content-sync-ko 번역률이 좋은 것 같다?!
REVIEW How-to :: my custom devdocs
<~/sync/code/devdocs/forked-devdocs/README.md>
여기 문서를 보면 설명이 자세히 나와 있다.
DONT 빌드 방법
asdf 사용 안하는데 이거 참 버전 맞추고 다시 해봐야 할듯
git clone https://github.com/freeCodeCamp/devdocs.git && cd devdocs
gem install bundler
bundle install
bundle exec thor docs:download --default
bundle exec rackup
여기서 thor 를 사용한다. 고민이 필요하다
내가 원하는 버전의 문서로 변경 및 확인
스크래퍼가 문서를 가져오는 역할. 다음 주소에서 데노 버전을 수정했다. 확인해보자.
<~/sync/code/devdocs/forked-devdocs/lib/docs/scrapers/deno.rb>
수정하고 다운로드해서 띄우니까 안되네. 디노는 좀 수정이 필요할 것 같다
typescript 로 다시 해보자.
이건 번역률이 좋지 않다. https://github.com/microsoft/TypeScript-Website-Localizations/tree/main/docs/documentation/ko
차라리 커뮤니티 쪽 파일을 가져오도록 하는게 좋겠다. https://typescript-kr.github.io/
jhnuc➜ forked-devdocs : ko ✘ :✭ ᐅ bundle exec thor updates:check typescript
[###################################################################################################] [1/1] [100.00%] [00:00] [00:00] [2.91/s]+--------------------------------------------------+
| Up-to-date documentations (1) |
+---------------+-----------------+----------------+
| Documentation | Scraper version | Latest version |
+---------------+-----------------+----------------+
| TypeScript | 5.1.3 | 5.1.6 |
+---------------+-----------------+----------------+
버전 올려줘야 겠다. 내가 쓰는게 최신이네.
이제 다시 보자. 이제 스크래퍼 버전이 5.1.6 나온다.
jhnuc➜ forked-devdocs : ko ✘ :✹✭ ᐅ bundle exec thor docs:generate typescript --force --verbose
Update: public/docs/typescript/index.html
Create: public/docs/typescript/typescript-from-scratch.html
Create: public/docs/typescript/esm-node.html
Create: public/docs/typescript/modules.html
Create: public/docs/typescript/intro.html
Create: public/docs/typescript/2/everyday-types.html
Create: public/docs/typescript/iterators-and-generators.ht
...
Create: public/docs/typescript/db.json
Create: public/docs/typescript/meta.json
Done
Update: public/docs/docs.json
보자. public/docs/docs.json 을 보니 수정이 되었구나. 이런 식으로 하는 것이네.
ko 로 수정하자
- 스크래퍼 수정
self.release = '5.1.6'
self.base_urls = [
'https://www.typescriptlang.org/ko/docs/handbook/',
'https://www.typescriptlang.org/ko/'
]
def initial_urls
[ 'https://www.typescriptlang.org/ko/docs/handbook/',
'https://www.typescriptlang.org/ko/tsconfig' ]
end
self.links = {
home: 'https://www.typescriptlang.org',
code: 'https://github.com/Microsoft/TypeScript'
}
- 필터 수정
/lib/docs/filters/typescript
여기에 clean_html.rb 파일을 수정한다.
이제 생성해보자.
먼저 테스트 시퀀스
bundle exec thor docs:page typescript
bundle exec thor docs:generate typescript --force --verbose
완료 잘 됬다. 한글 문서로 잘 가져왔네.
TODO mdn 소스를 적용해보자
모두 생성 되었다.
javascript html css svg dom web_extensions http
bundle exec thor docs:page typescript
bundle exec thor docs:generate typescript --force --verbose
# bundle exec thor docs:package typescript
# bundle exec rackup
잘 된다. devdocs-browser 로 만든다. 만들었다. 테스트해보자.
TODO 패키징 하자
bundle exec thor docs:package typescript
is program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see https://www.gnu.org/licenses/.
;;; Commentary:
;; devdocs.el is a documentation viewer similar to the built-in Info ;; browser, but geared towards documentation obtained from ;; https://devdocs.io.
;; To get started, download some documentation with `devdocs-install`. ;; This will show the available documents and save the selected one to ;; disk. Once you have the desired documents at hand, use ;; `devdocs-lookup` to search for entries.
;;; Code:
(require ‘seq) (require ‘shr) (require ‘url-expand) (eval-when-compile (require ’let-alist) (require ‘subr-x))
(unless (libxml-available-p) (display-warning ‘devdocs “This package requires Emacs to be compiled with libxml2”))
(defgroup devdocs nil “Emacs viewer for DevDocs.” :group ‘help :prefix “devdocs-”)
(defcustom devdocs-current-docs nil “A list of documents relevant to the current buffer. This variable is normally set by the `devdocs-lookup’ command, but you may also wish to set it via a hook or as file or directory-local variable.” :local t :type ‘(list string))
(defcustom devdocs-data-dir (expand-file-name “devdocs” user-emacs-directory) “Directory to save documentation files.” :type ‘directory)
(defvar devdocs-site-url “https://devdocs.io” “Location of the DevDocs website.”)
(defvar devdocs-cdn-url “https://documents.devdocs.io” “Location of the DevDocs CDN.”)
(defcustom devdocs-cache-timeout 900 “Number of seconds to keep cached information such as document indexes.” :type ’number)
(defcustom devdocs-separator " » " “String used to format a documentation location, e.g. in header line.” :type ‘string)
(defcustom devdocs-disambiguated-entry-format #("%s (%s)" 3 7 (face italic)) “How to disambiguate entries with identical names in `devdocs-lookup’. This string is passed to `format’ with two arguments, the entry name and a count.” :type ‘(choice (const :tag “Count in parentheses, italicized” #("%s (%s)" 3 7 (face italic))) (const :tag “Invisible cookie” #("%s (%s)" 2 7 (invisible t))) string))
(defcustom devdocs-fontify-code-blocks t “Whether to fontify code snippets inside pre t 결과 확인은 public/docs 에 가보면 압축파일이 있다.
# 합계 1292
# -rw-rw-r-- 1 junghan junghan 395 7월 27 14:09 docs.json
# drwxrwxr-x 4 junghan junghan 4096 7월 27 14:09 typescript/
# -rw-rw-r-- 1 junghan junghan 1306208 7월 27 14:12 typescript.tar.gz
junghan-laptop :: forked-devdocs/public/docs ‹ko*› » ll | grep python
drwxr-xr-x 14 junghan junghan 4096 1월 6 01:55 python~3.11/
-rw-rw-r-- 1 junghan junghan 7536588 1월 14 16:38 python~3.11.tar.gz
실행해서 확인해보자. 로컬 서버.
rackup
오. 잘된다. 패키징 한 파일이 있으니 로컬 파일로도 가능할 것 같다.
Emacs 에서 활용 : devdocs-browser
devdocs-browser 패키지로 연동하도록 설정한다.
그냥 복붙한다고 되는게 아니다. 양식에 맞게 넣어야 한다.
먼저 영어 버전을 몽땅 다운로드 받아본다.
M-x devdocs-browser-download-offline-data
그러면 다음과 같은 구조로 폴더가 생긴다.
drwxrwxr-x 4 junghan junghan 4096 7월 27 15:13 content/
-rw-rw-r-- 1 junghan junghan 1306191 7월 27 14:49 content.json
-rw-rw-r-- 1 junghan junghan 62021 7월 27 14:49 index.json
-rw-rw-r-- 1 junghan junghan 307 7월 27 15:15 metadata.el
간단하게 수정하면 되는 것이니, 기존 것을 확인해서 맞춰주면 된다.
여기서 보면,
- content.json 은 content/db.json 파일로 대체
- index.json 은 content/index.json 파일로 대체
- metadata.el 은 파일 내용 수정 - content/meta.json 참고
- devdocs-browser/docs.json 파일도 수정 한다
DONT Emacs devdocs and devdocs-browser
한글 문서 넣으려면 devdocs-browser 가 좋다. 쉽다.
devdocs-lookup 함수로 나온 결과 스타일
JSX TypeScript » JSX
JSX: Basic usage TypeScript » JSX
JSX: Type Checking TypeScript » JSX
JSX: The as operator TypeScript » JSX
devdocs-browser 의 결과
typescript
JSX JSX
JSX: Basic usage JSX
JSX: Type Checking JSX
JSX: The as operator JSX
별 다를 것 없다. 잠시만. 아무튼 잘 동작한다.
Emacs Devdoc 클로저를 추가 한다.
오랜만에 클로저를 넣어야지. 그냥 다운 받자. 2 가지 옵션.
- devdocs-install
- devdocs-browser-install-doc
아래는 한글 번역본을 만들어서 넣는 방법이다.
- 먼저 공식 한글 문서가 있는지 확인한다. 없다.
- 그러면, Devdocs 가 가져오는 문서 리포를 확인한다.
- 위치는 검색하지말고 devdocs repo 에서 확인해야 한다.
- lib/docs/scrapers/clojure.rb 에 있다.
- self.base_url = ‘https://clojure.github.io/clojure/'
- 마크업 파일로 되어있을 것이다. 그걸 한글로 번역해서 패키징 하면 된다.
- 중요! 번역할 필요가 없다. 설명이 아니라 그냥 코드 정리 정도이다. 레퍼런스로 보면 된다.
- cloure-essential-ref 를 오히려 주목하라.
bundle exec thor docs:page typescript
bundle exec thor docs:generate typescript --force --verbose
bundle exec thor docs:package typescript
Build Docsets with Epub
https://github.com/shaunlebron/clojure-the-essential-reference-dash
여기 확인.
Clojure, The Essential Reference is the most detailed API reference for Clojure’s standard library, to date. Clojure, The Essential Reference 는 현재까지 Clojure 의 표준 라이브러리에 대한 가장 상세한 API 참조서입니다.
This repo allows you to quickly jump to any documentation entry in the book using the popular API browser Dash. 이 리포지토리를 사용하면 인기 있는 API 브라우저 Dash 를 사용하여 책에 있는 모든 문서 항목으로 빠르게 이동할 수 있습니다.
For now, you must purchase the book’s .epub file, then use our script to convert it to a Dash .docset file. 현재로서는 책의 .epub 파일을 구입한 다음 스크립트를 사용하여 대시 .docset 파일로 변환해야 합니다.
사용법
Create the Docset 문서 집합 만들기
Buy the book, and download the epub file to book.epub.
Run with Clojure CLI: Clojure CLI로 실행하세요:
clj -Mrun
# Import docset/ClojureEssentialReference.docset into Dash under Preferences > Docsets.
# 환경설정 > 문서 세트에서 docset/ClojureEssentialReference.docset 를 Dash로 가져옵니다.
나의 로컬 폴더로 복사했다.
cp -av ClojureEssentialReference.docset ~/.local/share/Zeal/Zeal/docsets
Zeal 에서 동작한다. Emacs 에서도 문제가 없을 것이다.
DONT devdocs 로 변환 할 수 있는가?
될 것 같은데? 굳이.
책을 구입해야 했다. 그 이유
https://livebook.manning.com/book/clojure-the-essential-reference/chapter-12/v-29/39
“[Clojure] documentation exists in many forms and is overall very valuable, but it is fragmented: jumping between all the different sources is time consuming, including the fact that searching the right place it’s not always obvious. One of the main goals of this book is to do that work on your behalf: bringing together all the valuable sources of information in a single accessible place.”
“[클로저] 문서는 다양한 형태로 존재하며 전반적으로 매우 가치 있지만, 파편화되어 있어 여러 소스 사이를 이동하는 데 시간이 많이 걸리고 올바른 위치를 검색하는 것이 항상 명확하지 않다는 사실도 있습니다. 이 책의 주요 목표 중 하나는 여러분을 대신하여 이러한 작업을 수행하는 것, 즉 모든 귀중한 정보 소스를 한 곳에 모아 접근하기 쉬운 단일 장소에 모으는 것입니다.”
“We think this book is a perfect fit for the intermediate or seasoned Clojure programmer who wants to understand how a function (and ultimately Clojure) works.“
“이 책은 함수(그리고 궁극적으로 클로저)의 작동 방식을 이해하고자 하는 중급 또는 숙련된 클로저 프로그래머에게 완벽한 책이라고 생각합니다.”
“It’s the hope of the authors that this book is going to be a de-facto reference to the standard library and it’s certainly our desire to provide the reader with one of the most comprehensive source of information about Clojure.”
“이 책이 표준 라이브러리에 대한 사실상의 참고서가 되기를 바라는 것이 저자들의 바람이며, 독자들에게 클로저에 대한 가장 포괄적인 정보 중 하나를 제공하고자 하는 것이 우리의 바람입니다.”
제공 기능
Docset features 문서 집합 기능 Every heading is indexed as a Docset “Section”. 모든 제목은 문서 집합 “섹션"으로 색인화됩니다. Every chapter has its own Docset page (most of the code in our script is for merging chapters split across files) 모든 챕터에는 고유한 문서 집합 페이지가 있습니다(스크립트의 코드 대부분은 파일에 분할된 챕터를 병합하는 데 사용됩니다). Table of Contents sidebar for each chapter. 각 챕터의 목차 사이드바.
심볼 리스트 접근 방법
epub 이라면 파싱해서 얻을 수 있다. 해당 코드 참고.
아래는 웹
https://github.com/p3r7/clojure-essential-ref/blob/master/clojure-essential-ref.el
;; BOOK INDEX
(defvar clojure-essential-ref--index
'(
;; fn creation & manipulation
("defn" . (:url "/chapter-2/v-29/10" :section "2.1.1"))
("defn-" . (:url "/chapter-2/v-29/10" :section "2.1.1"))
("fn" . (:url "/chapter-2/v-29/77" :section "2.1.2"))
("fn*" . (:url "/chapter-2/v-29/116" :section "2.1.3"))
("fnil" . (:url "/chapter-2/v-29/153" :section "2.2.1"))
("comp" . (:url "/chapter-2/v-29/179" :section "2.2.2"))
("complement" . (:url "/chapter-2/v-29/210" :section "2.2.3"))
("constantly" . (:url "/chapter-2/v-29/234" :section "2.2.4"))
("identity" . (:url "/chapter-2/v-29/257" :section "2.2.5"))
("juxt" . (:url "/chapter-2/v-29/284" :section "2.2.6"))
("memfn" . (:url "/chapter-2/v-29/321" :section "2.2.7"))
("partial" . (:url "/chapter-2/v-29/358" :section "2.2.8"))
("pred" . (:url "/chapter-2/v-29/393" :section "2.2.9"))
("every" . (:url "/chapter-2/v-29/393" :section "2.2.9"))
("fn" . (:url "/chapter-2/v-29/393" :section "2.2.9"))
("some" . (:url "/chapter-2/v-29/393" :section "2.2.9"))
("->" . (:url "/chapter-2/v-29/451" :section "2.3.1"))
("->>" . (:url "/chapter-2/v-29/504" :section "2.3.2"))
("cond->" . (:url "/chapter-2/v-29/531" :section "2.3.3"))
("cond->>" . (:url "/chapter-2/v-29/531" :section "2.3.3"))
("some->" . (:url "/chapter-2/v-29/565" :section "2.3.4"))
("some->>" . (:url "/chapter-2/v-29/567" :section "2.3.5"))
("as->" . (:url "/chapter-2/v-29/596" :section "2.3.6"))
("apply" . (:url "/chapter-2/v-29/629" :section "2.4.1"))
("memoize" . (:url "/chapter-2/v-29/668" :section "2.4.2"))
("trampoline" . (:url "/chapter-2/v-29/709" :section "2.4.3"))
;; basic constructs
("let" . (:url "/chapter-3/v-29/15" :section "3.1.1"))
("let*" . (:url "/chapter-3/v-29/15" :section "3.1.1"))
("if-let" . (:url "/chapter-3/v-29/55" :section "3.1.2"))
("when-let" . (:url "/chapter-3/v-29/55" :section "3.1.2"))
("if-some" . (:url "/chapter-3/v-29/55" :section "3.1.2"))
("when-some" . (:url "/chapter-3/v-29/55" :section "3.1.2"))
("letfn" . (:url "/chapter-3/v-29/105" :section "3.1.3"))
("letfn*" . (:url "/chapter-3/v-29/105" :section "3.1.3"))
("not" . (:url "/chapter-3/v-29/159" :section "3.2.1"))
("and" . (:url "/chapter-3/v-29/185" :section "3.2.2"))
("or" . (:url "/chapter-3/v-29/185" :section "3.2.2"))
("bit-and" . (:url "/chapter-3/v-29/228" :section "3.2.3"))
("bit-or" . (:url "/chapter-3/v-29/228" :section "3.2.3"))
("if" . (:url "/chapter-3/v-29/303" :section "3.3.1"))
("if-not" . (:url "/chapter-3/v-29/303" :section "3.3.1"))
("when" . (:url "/chapter-3/v-29/303" :section "3.3.1"))
("when-not" . (:url "/chapter-3/v-29/303" :section "3.3.1"))
("cond" . (:url "/chapter-3/v-29/346" :section "3.3.2"))
("condp" . (:url "/chapter-3/v-29/389" :section "3.3.3"))
("case" . (:url "/chapter-3/v-29/438" :section "3.3.4"))
("loop" . (:url "/chapter-3/v-29/527" :section "3.4.1"))
("recur" . (:url "/chapter-3/v-29/527" :section "3.4.1"))
("loop*" . (:url "/chapter-3/v-29/527" :section "3.4.1"))
("range" . (:url "/chapter-3/v-29/594" :section "3.4.2"))
("for" . (:url "/chapter-3/v-29/644" :section "3.4.3"))
("while" . (:url "/chapter-3/v-29/691" :section "3.4.4"))
("dotimes" . (:url "/chapter-3/v-29/728" :section "3.4.5"))
("first" . (:url "/chapter-3/v-29/785" :section "3.5.1"))
("second" . (:url "/chapter-3/v-29/785" :section "3.5.1"))
("last" . (:url "/chapter-3/v-29/785" :section "3.5.1"))
("map" . (:url "/chapter-3/v-29/849" :section "3.5.2"))
("map-indexed" . (:url "/chapter-3/v-29/849" :section "3.5.2"))
("filter" . (:url "/chapter-3/v-29/908" :section "3.5.3"))
("remove" . (:url "/chapter-3/v-29/908" :section "3.5.3"))
("reduce" . (:url "/chapter-3/v-29/941" :section "3.5.4"))
("reductions" . (:url "/chapter-3/v-29/941" :section "3.5.4"))
("reductions" . (:url "/chapter-4/v-29/17" :section "4.1"))
("&form" . (:url "/chapter-4/v-29/58" :section "4.1.2")) ; NB: implicit arg
("&env" . (:url "/chapter-4/v-29/66" :section "4.1.3")) ; NB: implicit arg
("macroexpand" . (:url "/chapter-4/v-29/103" :section "4.2"))
("macroexpand-1" . (:url "/chapter-4/v-29/103" :section "4.2"))
("clojure.walk/macroexpand-all" . (:url "/chapter-4/v-29/103" :section "4.2"))
("quote" . (:url "/chapter-4/v-29/131" :section "4.3"))
("gensym" . (:url "/chapter-4/v-29/156" :section "4.4"))
("definline" . (:url "/chapter-4/v-29/183" :section "4.5"))
("destructure" . (:url "/chapter-4/v-29/231" :section "4.6"))
("clojure.template/apply-template" . (:url "/chapter-4/v-29/272" :section "4.7"))
("clojure.template/do-template" . (:url "/chapter-4/v-29/301" :section "4.8"))
;; operations on numbers
("+" . (:url "/chapter-5/v-29/19" :section "5.1"))
("-" . (:url "/chapter-5/v-29/19" :section "5.1"))
("*" . (:url "/chapter-5/v-29/19" :section "5.1"))
("/" . (:url "/chapter-5/v-29/19" :section "5.1"))
("inc" . (:url "/chapter-5/v-29/95" :section "5.2"))
("dec" . (:url "/chapter-5/v-29/95" :section "5.2"))
("quot" . (:url "/chapter-5/v-29/133" :section "5.3"))
("rem" . (:url "/chapter-5/v-29/133" :section "5.3"))
("mod" . (:url "/chapter-5/v-29/133" :section "5.3"))
("max" . (:url "/chapter-5/v-29/168" :section "5.4"))
("min" . (:url "/chapter-5/v-29/168" :section "5.4"))
("max-key" . (:url "/chapter-5/v-29/199" :section "5.5"))
("min-key" . (:url "/chapter-5/v-29/199" :section "5.5"))
("rand" . (:url "/chapter-5/v-29/231" :section "5.6"))
("rand-int" . (:url "/chapter-5/v-29/231" :section "5.6"))
("with-precision" . (:url "/chapter-5/v-29/264" :section "5.7"))
("+'" . (:url "/chapter-5/v-29/286" :section "5.8"))
("-'" . (:url "/chapter-5/v-29/286" :section "5.8"))
("*'" . (:url "/chapter-5/v-29/286" :section "5.8"))
("inc'" . (:url "/chapter-5/v-29/286" :section "5.8"))
("dec'" . (:url "/chapter-5/v-29/286" :section "5.8"))
("unchecked-add" . (:url "/chapter-5/v-29/311" :section "5.9"))
("unchecked-add-int" . (:url "/chapter-5/v-29/346" :section "5.10"))
;; comparison & equality
("=" . (:url "/chapter-6/v-29/15" :section "6.1"))
("not=" . (:url "/chapter-6/v-29/15" :section "6.1"))
("==" . (:url "/chapter-6/v-29/81" :section "6.2"))
("<" . (:url "/chapter-6/v-29/118" :section "6.3"))
(">" . (:url "/chapter-6/v-29/118" :section "6.3"))
("<=" . (:url "/chapter-6/v-29/118" :section "6.3"))
(">=" . (:url "/chapter-6/v-29/118" :section "6.3"))
("compare" . (:url "/chapter-6/v-29/162" :section "6.4"))
("identical?" . (:url "/chapter-6/v-29/227" :section "6.5"))
("hash" . (:url "/chapter-6/v-29/270" :section "6.6"))
("clojure.data/diff" . (:url "/chapter-6/v-29/310" :section "6.7"))
;; reducers & transducers
("clojure.core.reducers/fold" . (:url "/chapter-7/v-29/22" :section "7.1.1"))
("clojure.core.reducers/reducer" . (:url "/chapter-7/v-29/70" :section "7.1.2"))
("clojure.core.reducers/folder" . (:url "/chapter-7/v-29/70" :section "7.1.2"))
("clojure.core.reducers/map" . (:url "/chapter-7/v-29/70" :section "7.1.2"))
("clojure.core.reducers/mapcat" . (:url "/chapter-7/v-29/70" :section "7.1.2"))
("clojure.core.reducers/filter" . (:url "/chapter-7/v-29/70" :section "7.1.2"))
("clojure.core.reducers/remove" . (:url "/chapter-7/v-29/70" :section "7.1.2"))
("clojure.core.reducers/flatten" . (:url "/chapter-7/v-29/70" :section "7.1.2"))
("clojure.core.reducers/take-while" . (:url "/chapter-7/v-29/70" :section "7.1.2"))
("clojure.core.reducers/take" . (:url "/chapter-7/v-29/70" :section "7.1.2"))
("clojure.core.reducers/drop" . (:url "/chapter-7/v-29/70" :section "7.1.2"))
("clojure.core.reducers/monoid" . (:url "/chapter-7/v-29/115" :section "7.1.3"))
("clojure.core.reducers/foldcat" . (:url "/chapter-7/v-29/149" :section "7.1.4"))
("clojure.core.reducers/cat" . (:url "/chapter-7/v-29/149" :section "7.1.4"))
("clojure.core.reducers/append!" . (:url "/chapter-7/v-29/149" :section "7.1.4"))
("transduce" . (:url "/chapter-7/v-29/229" :section "7.2.1"))
("eduction" . (:url "/chapter-7/v-29/269" :section "7.2.2"))
("completing" . (:url "/chapter-7/v-29/314" :section "7.2.3"))
("cat" . (:url "/chapter-7/v-29/355" :section "7.2.4"))
("reduced" . (:url "/chapter-7/v-29/386" :section "7.3"))
("reduced?" . (:url "/chapter-7/v-29/386" :section "7.3"))
("ensure-reduced" . (:url "/chapter-7/v-29/386" :section "7.3"))
("unreduced" . (:url "/chapter-7/v-29/386" :section "7.3"))
;; collections
("into" . (:url "/chapter-8/v-29/8" :section "8.1.1"))
("count" . (:url "/chapter-8/v-29/47" :section "8.1.2"))
("nth" . (:url "/chapter-8/v-29/88" :section "8.1.3"))
("empty" . (:url "/chapter-8/v-29/132" :section "8.1.4"))
("every?" . (:url "/chapter-8/v-29/164" :section "8.1.5"))
("not-every?" . (:url "/chapter-8/v-29/164" :section "8.1.5"))
("some" . (:url "/chapter-8/v-29/164" :section "8.1.5"))
("not-any?" . (:url "/chapter-8/v-29/164" :section "8.1.5"))
("empty?" . (:url "/chapter-8/v-29/215" :section "8.1.6"))
("not-empty" . (:url "/chapter-8/v-29/215" :section "8.1.6"))
("conj" . (:url "/chapter-8/v-29/262" :section "8.2.1"))
("get" . (:url "/chapter-8/v-29/301" :section "8.2.2"))
("contains?" . (:url "/chapter-8/v-29/384" :section "8.2.3"))
("rand-nth" . (:url "/chapter-8/v-29/445" :section "8.3.1"))
("shuffle" . (:url "/chapter-8/v-29/480" :section "8.3.2"))
("random-sample" . (:url "/chapter-8/v-29/511" :section "8.3.3"))
("frequencies" . (:url "/chapter-8/v-29/547" :section "8.3.4"))
("sort-by" . (:url "/chapter-8/v-29/578" :section "8.3.5" sort and))
("group-by" . (:url "/chapter-8/v-29/629" :section "8.3.6"))
("replace" . (:url "/chapter-8/v-29/659" :section "8.3.7"))
("reverse" . (:url "/chapter-8/v-29/695" :section "8.3.8"))
("walk" . (:url "/chapter-8/v-29/746" :section "8.4.1"))
("prewalk-demo" . (:url "/chapter-8/v-29/746" :section "8.4.1"))
("postwalk-demo" . (:url "/chapter-8/v-29/746" :section "8.4.1"))
("prewalk" . (:url "/chapter-8/v-29/763" :section "8.4.2"))
("postwalk" . (:url "/chapter-8/v-29/763" :section "8.4.2"))
("prewalk-replace" . (:url "/chapter-8/v-29/795" :section "8.4.3"))
("postwalk-replace" . (:url "/chapter-8/v-29/795" :section "8.4.3"))
("clojure.zip/zipper" . (:url "/chapter-8/v-29/805" :section "8.4.4"))
("clojure.zip/seq-zip" . (:url "/chapter-8/v-29/805" :section "8.4.4"))
("clojure.zip/xml-zip" . (:url "/chapter-8/v-29/805" :section "8.4.4"))
("clojure.zip/vector-zip" . (:url "/chapter-8/v-29/805" :section "8.4.4"))
("clojure.zip/make-node" . (:url "/chapter-8/v-29/805" :section "8.4.4"))
("clojure.zip/node" . (:url "/chapter-8/v-29/805" :section "8.4.4"))
("clojure.zip/up" . (:url "/chapter-8/v-29/805" :section "8.4.4"))
("clojure.zip/down" . (:url "/chapter-8/v-29/805" :section "8.4.4"))
("clojure.zip/right" . (:url "/chapter-8/v-29/805" :section "8.4.4"))
("clojure.zip/left" . (:url "/chapter-8/v-29/805" :section "8.4.4"))
("clojure.zip/children" . (:url "/chapter-8/v-29/805" :section "8.4.4"))
("clojure.zip/lefts" . (:url "/chapter-8/v-29/805" :section "8.4.4"))
("clojure.zip/rights" . (:url "/chapter-8/v-29/805" :section "8.4.4"))
("clojure.zip/branch?" . (:url "/chapter-8/v-29/805" :section "8.4.4"))
("clojure.zip/path" . (:url "/chapter-8/v-29/805" :section "8.4.4"))
("clojure.zip/replace" . (:url "/chapter-8/v-29/805" :section "8.4.4"))
("clojure.zip/edit" . (:url "/chapter-8/v-29/805" :section "8.4.4"))
("clojure.zip/insert-left" . (:url "/chapter-8/v-29/805" :section "8.4.4"))
("clojure.zip/insert-right" . (:url "/chapter-8/v-29/805" :section "8.4.4"))
("clojure.zip/append-child" . (:url "/chapter-8/v-29/805" :section "8.4.4"))
("clojure.zip/next" . (:url "/chapter-8/v-29/805" :section "8.4.4"))
;; sequences
("seq" . (:url "/chapter-9/v-29/23" :section "9.1.1"))
("sequence" . (:url "/chapter-9/v-29/23" :section "9.1.1"))
("rseq" . (:url "/chapter-9/v-29/77" :section "9.1.2"))
("subseq" . (:url "/chapter-9/v-29/112" :section "9.1.3"))
("rsubseq" . (:url "/chapter-9/v-29/112" :section "9.1.3"))
("seque" . (:url "/chapter-9/v-29/150" :section "9.1.4"))
("pmap" . (:url "/chapter-9/v-29/200" :section "9.1.5"))
("pcalls" . (:url "/chapter-9/v-29/200" :section "9.1.5"))
("pvalues" . (:url "/chapter-9/v-29/200" :section "9.1.5"))
("repeatedly" . (:url "/chapter-9/v-29/276" :section "9.2.1"))
("iterate" . (:url "/chapter-9/v-29/312" :section "9.2.2"))
("repeat" . (:url "/chapter-9/v-29/348" :section "9.2.3"))
("cycle" . (:url "/chapter-9/v-29/348" :section "9.2.3"))
("lazy-seq" . (:url "/chapter-9/v-29/395" :section "9.3.1"))
("tree-seq" . (:url "/chapter-9/v-29/449" :section "9.3.2"))
("file-seq" . (:url "/chapter-9/v-29/487" :section "9.3.3"))
("xml-seq" . (:url "/chapter-9/v-29/512" :section "9.3.4"))
("re-seq" . (:url "/chapter-9/v-29/535" :section "9.3.5"))
("line-seq" . (:url "/chapter-9/v-29/571" :section "9.3.6"))
("resultset-seq" . (:url "/chapter-9/v-29/599" :section "9.3.7"))
("iterator-seq" . (:url "/chapter-9/v-29/629" :section "9.3.8"))
("enumeration-seq" . (:url "/chapter-9/v-29/629" :section "9.3.8"))
("concat" . (:url "/chapter-9/v-29/659" :section "9.3.9"))
("lazy-cat" . (:url "/chapter-9/v-29/659" :section "9.3.9"))
("list" . (:url "/chapter-9/v-29/714" :section "9.4.1"))
("cons" . (:url "/chapter-9/v-29/765" :section "9.4.2"))
("list*" . (:url "/chapter-9/v-29/765" :section "9.4.2"))
;; sequential processing
("rest" . (:url "/chapter-10/v-29/13" :section "10.1"))
("next" . (:url "/chapter-10/v-29/13" :section "10.1"))
("fnext" . (:url "/chapter-10/v-29/13" :section "10.1"))
("nnext" . (:url "/chapter-10/v-29/13" :section "10.1"))
("ffirst" . (:url "/chapter-10/v-29/13" :section "10.1"))
("nfirst" . (:url "/chapter-10/v-29/13" :section "10.1"))
("butlast" . (:url "/chapter-10/v-29/13" :section "10.1"))
("nthnext" . (:url "/chapter-10/v-29/62" :section "10.2"))
("drop" . (:url "/chapter-10/v-29/62" :section "10.2"))
("drop-while" . (:url "/chapter-10/v-29/62" :section "10.2"))
("drop-last" . (:url "/chapter-10/v-29/62" :section "10.2"))
("take" . (:url "/chapter-10/v-29/62" :section "10.2"))
("take-while" . (:url "/chapter-10/v-29/62" :section "10.2"))
("take-last" . (:url "/chapter-10/v-29/62" :section "10.2"))
("nthrest" . (:url "/chapter-10/v-29/62" :section "10.2"))
("nthnext" . (:url "/chapter-10/v-29/62" :section "10.2"))
("keep" . (:url "/chapter-10/v-29/121" :section "10.3"))
("keep-indexed" . (:url "/chapter-10/v-29/121" :section "10.3"))
("mapcat" . (:url "/chapter-10/v-29/158" :section "10.4"))
("interpose" . (:url "/chapter-10/v-29/198" :section "10.5"))
("interleave" . (:url "/chapter-10/v-29/198" :section "10.5"))
("partition" . (:url "/chapter-10/v-29/244" :section "10.6"))
("partition-all" . (:url "/chapter-10/v-29/244" :section "10.6"))
("partition-by" . (:url "/chapter-10/v-29/244" :section "10.6"))
("flatten" . (:url "/chapter-10/v-29/297" :section "10.7"))
("distinct" . (:url "/chapter-10/v-29/327" :section "10.8"))
("dedupe" . (:url "/chapter-10/v-29/327" :section "10.8"))
("distinct?" . (:url "/chapter-10/v-29/327" :section "10.8"))
("take-nth" . (:url "/chapter-10/v-29/382" :section "10.9"))
("split-at" . (:url "/chapter-10/v-29/435" :section "10.10"))
("split-with" . (:url "/chapter-10/v-29/435" :section "10.10"))
("when-first" . (:url "/chapter-10/v-29/469" :section "10.11"))
("chunk-cons" . (:url "/chapter-10/v-29/496" :section "10.12"))
("chunk-first" . (:url "/chapter-10/v-29/496" :section "10.12"))
("chunk-rest" . (:url "/chapter-10/v-29/496" :section "10.12"))
("chunk-next" . (:url "/chapter-10/v-29/496" :section "10.12"))
("chunk-buffer" . (:url "/chapter-10/v-29/496" :section "10.12"))
("chunk-append" . (:url "/chapter-10/v-29/496" :section "10.12"))
("chunk" . (:url "/chapter-10/v-29/496" :section "10.12"))
;; maps
("hash-map" . (:url "/chapter-11/v-29/21" :section "11.1.1"))
("array-map" . (:url "/chapter-11/v-29/49" :section "11.1.2"))
("sorted-map" . (:url "/chapter-11/v-29/86" :section "11.1.3"))
("sorted-map-by" . (:url "/chapter-11/v-29/86" :section "11.1.3"))
("create-struct" . (:url "/chapter-11/v-29/142" :section "11.1.4"))
("defstruct" . (:url "/chapter-11/v-29/142" :section "11.1.4"))
("struct-map" . (:url "/chapter-11/v-29/142" :section "11.1.4"))
("struct" . (:url "/chapter-11/v-29/142" :section "11.1.4"))
("accessor" . (:url "/chapter-11/v-29/142" :section "11.1.4"))
("zipmap" . (:url "/chapter-11/v-29/195" :section "11.1.5"))
("keys" . (:url "/chapter-11/v-29/236" :section "11.2.1"))
("vals" . (:url "/chapter-11/v-29/236" :section "11.2.1"))
("find" . (:url "/chapter-11/v-29/264" :section "11.2.2"))
("key" . (:url "/chapter-11/v-29/264" :section "11.2.2"))
("val" . (:url "/chapter-11/v-29/264" :section "11.2.2"))
("select-keys" . (:url "/chapter-11/v-29/304" :section "11.2.4"))
("get-in" . (:url "/chapter-11/v-29/304" :section "11.2.4"))
("assoc" . (:url "/chapter-11/v-29/349" :section "11.3.1"))
("assoc-in" . (:url "/chapter-11/v-29/349" :section "11.3.1"))
("dissoc" . (:url "/chapter-11/v-29/349" :section "11.3.1"))
("update" . (:url "/chapter-11/v-29/407" :section "11.3.2"))
("update-in" . (:url "/chapter-11/v-29/407" :section "11.3.2"))
("merge" . (:url "/chapter-11/v-29/440" :section "11.3.3"))
("merge-with" . (:url "/chapter-11/v-29/440" :section "11.3.3"))
("reduce-kv" . (:url "/chapter-11/v-29/490" :section "11.3.4"))
("clojure.walk/keywordize-keys" . (:url "/chapter-11/v-29/536" :section "11.4.1"))
("clojure.walk/stringify-keys" . (:url "/chapter-11/v-29/536" :section "11.4.1"))
("clojure.set/rename-keys" . (:url "/chapter-11/v-29/545" :section "11.4.2"))
("clojure.set/map-invert" . (:url "/chapter-11/v-29/554" :section "11.4.3"))
;; vectors
("vector" . (:url "/chapter-12/v-29/34" :section "12.1"))
("vec" . (:url "/chapter-12/v-29/103" :section "12.2"))
("peek" . (:url "/chapter-12/v-29/153" :section "12.3"))
("pop" . (:url "/chapter-12/v-29/153" :section "12.3"))
("vector-of" . (:url "/chapter-12/v-29/189" :section "12.4"))
("mapv" . (:url "/chapter-12/v-29/238" :section "12.5"))
("filterv" . (:url "/chapter-12/v-29/286" :section "12.6"))
("subvec" . (:url "/chapter-12/v-29/318" :section "12.7"))
;; sets
("hash-set" . (:url "/chapter-13/v-29/8" :section "13.1"))
("set" . (:url "/chapter-13/v-29/47" :section "13.2"))
("sorted-set" . (:url "/chapter-13/v-29/80" :section "13.3"))
("sorted-set-by" . (:url "/chapter-13/v-29/80" :section "13.3"))
("disj" . (:url "/chapter-13/v-29/121" :section "13.4"))
("union" . (:url "/chapter-13/v-29/156" :section "13.5"))
("difference" . (:url "/chapter-13/v-29/156" :section "13.5"))
("intersection" . (:url "/chapter-13/v-29/156" :section "13.5"))
("subset?" . (:url "/chapter-13/v-29/193" :section "13.6"))
("superset?" . (:url "/chapter-13/v-29/193" :section "13.6"))
("select" . (:url "/chapter-13/v-29/198" :section "13.7"))
("index" . (:url "/chapter-13/v-29/198" :section "13.7"))
("rename" . (:url "/chapter-13/v-29/198" :section "13.7"))
("join" . (:url "/chapter-13/v-29/198" :section "13.7"))
("project" . (:url "/chapter-13/v-29/198" :section "13.7"))
;; concurency
("future" . (:url "/chapter-14/v-29/8" :section "14.1"))
("future-done?" . (:url "/chapter-14/v-29/13" :section "14.1.1"))
("future?" . (:url "/chapter-14/v-29/13" :section "14.1.1"))
("future-cancel" . (:url "/chapter-14/v-29/18" :section "14.1.2"))
("future-cancelled?" . (:url "/chapter-14/v-29/18" :section "14.1.2"))
("future-call" . (:url "/chapter-14/v-29/21" :section "14.1.3"))
("promise" . (:url "/chapter-14/v-29/35" :section "14.2"))
("deliver" . (:url "/chapter-14/v-29/35" :section "14.2"))
("delay" . (:url "/chapter-14/v-29/53" :section "14.3"))
("delay?" . (:url "/chapter-14/v-29/69" :section "14.3.1"))
("force" . (:url "/chapter-14/v-29/69" :section "14.3.1"))
("ref" . (:url "/chapter-14/v-29/77" :section "14.4"))
("alter" . (:url "/chapter-14/v-29/95" :section "14.4.1"))
("ref-set" . (:url "/chapter-14/v-29/95" :section "14.4.1"))
("commute" . (:url "/chapter-14/v-29/105" :section "14.4.2"))
("ensure" . (:url "/chapter-14/v-29/111" :section "14.4.3"))
("io!" . (:url "/chapter-14/v-29/114" :section "14.4.4"))
("atom" . (:url "/chapter-14/v-29/121" :section "14.5"))
("swap!" . (:url "/chapter-14/v-29/130" :section "14.5.1"))
("reset!" . (:url "/chapter-14/v-29/135" :section "14.5.2"))
("compare-and-set!" . (:url "/chapter-14/v-29/140" :section "14.5.3"))
("agent" . (:url "/chapter-14/v-29/146" :section "14.6"))
("deref" . (:url "/chapter-14/v-29/201" :section "14.7"))
("realized?" . (:url "/chapter-14/v-29/201" :section "14.7"))
("set-validator!" . (:url "/chapter-14/v-29/218" :section "14.8"))
("get-validator" . (:url "/chapter-14/v-29/218" :section "14.8"))
("add-watch" . (:url "/chapter-14/v-29/230" :section "14.9"))
("remove-watch" . (:url "/chapter-14/v-29/230" :section "14.9"))
("locking" . (:url "/chapter-14/v-29/237" :section "14.10"))
("monitor-enter" . (:url "/chapter-14/v-29/237" :section "14.10"))
("monitor-exit" . (:url "/chapter-14/v-29/237" :section "14.10"))
;; types / class / hierarchies / polymorphism
("symbol" . (:url "/chapter-15/v-29/17" :section "15.1"))
("keyword" . (:url "/chapter-15/v-29/17" :section "15.1"))
("name" . (:url "/chapter-15/v-29/33" :section "15.1.1"))
("find-keyword" . (:url "/chapter-15/v-29/38" :section "15.1.2"))
("type" . (:url "/chapter-15/v-29/52" :section "15.2.1"))
("instance?" . (:url "/chapter-15/v-29/52" :section "15.2.1"))
("class" . (:url "/chapter-15/v-29/52" :section "15.2.1"))
("instance?" . (:url "/chapter-15/v-29/62" :section "15.2.2"))
("gen-class" . (:url "/chapter-15/v-29/67" :section "15.3"))
("gen-interface" . (:url "/chapter-15/v-29/67" :section "15.3"))
("deftype" . (:url "/chapter-15/v-29/91" :section "15.4"))
("definterface" . (:url "/chapter-15/v-29/91" :section "15.4"))
("proxy" . (:url "/chapter-15/v-29/119" :section "15.5"))
("reify" . (:url "/chapter-15/v-29/139" :section "15.6"))
("defrecord" . (:url "/chapter-15/v-29/148" :section "15.7"))
("defprotocol" . (:url "/chapter-15/v-29/160" :section "15.8"))
("extend" . (:url "/chapter-15/v-29/179" :section "15.9"))
("extend-type" . (:url "/chapter-15/v-29/179" :section "15.9"))
("extend-protocol" . (:url "/chapter-15/v-29/179" :section "15.9"))
("derive" . (:url "/chapter-15/v-29/199" :section "15.10"))
("make-hierarchy" . (:url "/chapter-15/v-29/199" :section "15.10"))
("defmulti" . (:url "/chapter-15/v-29/223" :section "15.11"))
("defmethod" . (:url "/chapter-15/v-29/223" :section "15.11"))
;; vars & ns
("def" . (:url "/chapter-16/v-29/31" :section "16.4.1"))
("declare" . (:url "/chapter-16/v-29/41" :section "16.4.2"))
("intern" . (:url "/chapter-16/v-29/46" :section "16.4.3"))
("defonce" . (:url "/chapter-16/v-29/51" :section "16.4.4"))
("var" . (:url "/chapter-16/v-29/61" :section "16.5.1"))
("find-var" . (:url "/chapter-16/v-29/67" :section "16.5.2"))
("resolve" . (:url "/chapter-16/v-29/71" :section "16.5.3"))
("ns-resolve" . (:url "/chapter-16/v-29/71" :section "16.5.3"))
("clojure.repl/dir-fn" . (:url "/chapter-16/v-29/79" :section "16.5.4"))
("clojure.repl/dir" . (:url "/chapter-16/v-29/79" :section "16.5.4"))
("bound?" . (:url "/chapter-16/v-29/82" :section "16.5.5"))
("thread-bound?" . (:url "/chapter-16/v-29/82" :section "16.5.5"))
("alter-var-root" . (:url "/chapter-16/v-29/88" :section "16.6.1"))
("with-redefs" . (:url "/chapter-16/v-29/96" :section "16.6.2"))
("with-redefs-fn" . (:url "/chapter-16/v-29/96" :section "16.6.2"))
("bound-fn" . (:url "/chapter-16/v-29/111" :section "16.7.1"))
("with-local-vars" . (:url "/chapter-16/v-29/119" :section "16.8"))
("var-get" . (:url "/chapter-16/v-29/119" :section "16.8"))
("var-set" . (:url "/chapter-16/v-29/119" :section "16.8"))
("ns" . (:url "/chapter-16/v-29/124" :section "16.9"))
("in-ns" . (:url "/chapter-16/v-29/124" :section "16.9"))
("remove-ns" . (:url "/chapter-16/v-29/124" :section "16.9"))
("create-ns" . (:url "/chapter-16/v-29/136" :section "16.10"))
("alias" . (:url "/chapter-16/v-29/144" :section "16.10.1"))
("ns-aliases" . (:url "/chapter-16/v-29/144" :section "16.10.1"))
("ns-unalias" . (:url "/chapter-16/v-29/144" :section "16.10.1"))
("ns-unalias" . (:url "/chapter-16/v-29/153" :section "16.10.2"))
("ns-map" . (:url "/chapter-16/v-29/157" :section "16.11"))
("ns-unmap" . (:url "/chapter-16/v-29/157" :section "16.11"))
("ns-publics" . (:url "/chapter-16/v-29/164" :section "16.12"))
("ns-interns" . (:url "/chapter-16/v-29/164" :section "16.12"))
("ns-imports" . (:url "/chapter-16/v-29/164" :section "16.12"))
("refer" . (:url "/chapter-16/v-29/171" :section "16.13.1"))
("require" . (:url "/chapter-16/v-29/176" :section "16.13.2"))
("loaded-libs" . (:url "/chapter-16/v-29/179" :section "16.13.3"))
("use" . (:url "/chapter-16/v-29/189" :section "16.13.4"))
("import" . (:url "/chapter-16/v-29/193" :section "16.13.5"))
("find-ns" . (:url "/chapter-16/v-29/196" :section "16.14"))
("all-ns" . (:url "/chapter-16/v-29/196" :section "16.14"))
("the-ns" . (:url "/chapter-16/v-29/202" :section "16.15"))
("ns-name" . (:url "/chapter-16/v-29/205" :section "16.15.1"))
("namespace" . (:url "/chapter-16/v-29/208" :section "16.15.2"))
("meta" . (:url "/chapter-16/v-29/212" :section "16.16.1"))
("with-meta" . (:url "/chapter-16/v-29/229" :section "16.16.2"))
("vary-meta" . (:url "/chapter-16/v-29/232" :section "16.16.3"))
("alter-meta!" . (:url "/chapter-16/v-29/235" :section "16.16.4"))
("reset-meta!" . (:url "/chapter-16/v-29/238" :section "16.16.5"))
;; evaluation
("read" . (:url "/chapter-17/v-29/10" :section "17.1.1"))
("read-string" . (:url "/chapter-17/v-29/29" :section "17.1.2"))
("eval" . (:url "/chapter-17/v-29/35" :section "17.2"))
("load" . (:url "/chapter-17/v-29/46" :section "17.3.1"))
("load-file" . (:url "/chapter-17/v-29/52" :section "17.3.2"))
("load-string" . (:url "/chapter-17/v-29/55" :section "17.3.3"))
("load-reader" . (:url "/chapter-17/v-29/65" :section "17.3.4"))
("compile" . (:url "/chapter-17/v-29/67" :section "17.4"))
("test" . (:url "/chapter-17/v-29/80" :section "17.5"))
("assert" . (:url "/chapter-17/v-29/80" :section "17.5"))
("clojure.edn/read" . (:url "/chapter-17/v-29/89" :section "17.6"))
("clojure.edn/read-string" . (:url "/chapter-17/v-29/89" :section "17.6"))
("tagged-literal" . (:url "/chapter-17/v-29/100" :section "17.7"))
("tagged-literal?" . (:url "/chapter-17/v-29/100" :section "17.7"))
("default-data-readers" . (:url "/chapter-17/v-29/108" :section "17.8"))
("reader-conditional?" . (:url "/chapter-17/v-29/115" :section "17.9"))
("reader-conditional" . (:url "/chapter-17/v-29/115" :section "17.9"))
;; formatting & printing
("format" . (:url "/chapter-18/v-29/3" :section "18.1"))
("printf" . (:url "/chapter-18/v-29/3" :section "18.1"))
("cl-format" . (:url "/chapter-18/v-29/3" :section "18.1"))
("pr" . (:url "/chapter-18/v-29/23" :section "18.2"))
("prn" . (:url "/chapter-18/v-29/23" :section "18.2"))
("pr-str" . (:url "/chapter-18/v-29/23" :section "18.2"))
("prn-str" . (:url "/chapter-18/v-29/23" :section "18.2"))
("print" . (:url "/chapter-18/v-29/23" :section "18.2"))
("println" . (:url "/chapter-18/v-29/23" :section "18.2"))
("print-str" . (:url "/chapter-18/v-29/23" :section "18.2"))
("println-str" . (:url "/chapter-18/v-29/23" :section "18.2"))
("clojure.pprint/pprint" . (:url "/chapter-18/v-29/34" :section "18.3"))
("clojure.pprint/pp" . (:url "/chapter-18/v-29/34" :section "18.3"))
("write" . (:url "/chapter-18/v-29/34" :section "18.3"))
("print-table" . (:url "/chapter-18/v-29/34" :section "18.3"))
("print-method" . (:url "/chapter-18/v-29/52" :section "18.4"))
("print-dup" . (:url "/chapter-18/v-29/52" :section "18.4"))
("print-ctor" . (:url "/chapter-18/v-29/52" :section "18.4"))
("slurp" . (:url "/chapter-18/v-29/69" :section "18.5"))
("spit" . (:url "/chapter-18/v-29/69" :section "18.5"))
;; strings & regexps
("str" . (:url "/chapter-19/v-29/3" :section "19.1"))
("clojure.string/join" . (:url "/chapter-19/v-29/12" :section "19.2"))
("clojure.string/replace" . (:url "/chapter-19/v-29/19" :section "19.3"))
("clojure.string/replace-first" . (:url "/chapter-19/v-29/19" :section "19.3"))
("clojure.string/re-quote-replacement" . (:url "/chapter-19/v-29/19" :section "19.3"))
("clojure.string/subs" . (:url "/chapter-19/v-29/35" :section "19.4"))
("clojure.string/split" . (:url "/chapter-19/v-29/35" :section "19.4"))
("clojure.string/split-lines" . (:url "/chapter-19/v-29/35" :section "19.4"))
("clojure.string/trim" . (:url "/chapter-19/v-29/46" :section "19.5"))
("clojure.string/triml" . (:url "/chapter-19/v-29/46" :section "19.5"))
("clojure.string/trimr" . (:url "/chapter-19/v-29/46" :section "19.5"))
("clojure.string/trim-newline" . (:url "/chapter-19/v-29/46" :section "19.5"))
("clojure.string/escape" . (:url "/chapter-19/v-29/58" :section "19.6"))
("clojure.string/char-name-string" . (:url "/chapter-19/v-29/58" :section "19.6"))
("clojure.string/char-escape-string" . (:url "/chapter-19/v-29/58" :section "19.6"))
("clojure.string/lower-case" . (:url "/chapter-19/v-29/65" :section "19.7"))
("clojure.string/upper-case" . (:url "/chapter-19/v-29/65" :section "19.7"))
("clojure.string/capitalize" . (:url "/chapter-19/v-29/65" :section "19.7"))
("clojure.string/index-of" . (:url "/chapter-19/v-29/74" :section "19.8"))
("clojure.string/last-index-of" . (:url "/chapter-19/v-29/74" :section "19.8"))
("clojure.string/blank?" . (:url "/chapter-19/v-29/83" :section "19.9"))
("clojure.string/ends-with?" . (:url "/chapter-19/v-29/83" :section "19.9"))
("clojure.string/starts-with?" . (:url "/chapter-19/v-29/83" :section "19.9"))
("clojure.string/includes?" . (:url "/chapter-19/v-29/83" :section "19.9"))
("clojure.string/re-pattern" . (:url "/chapter-19/v-29/91" :section "19.10"))
("re-matcher" . (:url "/chapter-19/v-29/91" :section "19.10"))
("re-groups" . (:url "/chapter-19/v-29/91" :section "19.10"))
("re-seq" . (:url "/chapter-19/v-29/91" :section "19.10"))
("re-matches" . (:url "/chapter-19/v-29/91" :section "19.10"))
("re-find" . (:url "/chapter-19/v-29/91" :section "19.10"))
;; mutation & side-effects
("transient" . (:url "/chapter-20/v-29/3" :section "20.1"))
("persistent!" . (:url "/chapter-20/v-29/3" :section "20.1"))
("conj!" . (:url "/chapter-20/v-29/3" :section "20.1"))
("pop!" . (:url "/chapter-20/v-29/3" :section "20.1"))
("assoc!" . (:url "/chapter-20/v-29/3" :section "20.1"))
("dissoc!" . (:url "/chapter-20/v-29/3" :section "20.1"))
("disj!" . (:url "/chapter-20/v-29/3" :section "20.1"))
("persistent!" . (:url "/chapter-20/v-29/3" :section "20.1"))
("conj!" . (:url "/chapter-20/v-29/3" :section "20.1"))
("pop!" . (:url "/chapter-20/v-29/3" :section "20.1"))
("assoc!" . (:url "/chapter-20/v-29/3" :section "20.1"))
("dissoc!" . (:url "/chapter-20/v-29/3" :section "20.1"))
("disj!" . (:url "/chapter-20/v-29/3" :section "20.1" and))
("persistent!" . (:url "/chapter-20/v-29/3" :section "20.1"))
("conj!" . (:url "/chapter-20/v-29/3" :section "20.1"))
("pop!" . (:url "/chapter-20/v-29/3" :section "20.1"))
("assoc!" . (:url "/chapter-20/v-29/3" :section "20.1"))
("dissoc!" . (:url "/chapter-20/v-29/3" :section "20.1"))
("disj!" . (:url "/chapter-20/v-29/3" :section "20.1"))
("doseq" . (:url "/chapter-20/v-29/20" :section "20.2"))
("dorun" . (:url "/chapter-20/v-29/20" :section "20.2"))
("run!" . (:url "/chapter-20/v-29/20" :section "20.2"))
("doall" . (:url "/chapter-20/v-29/20" :section "20.2"))
("do" . (:url "/chapter-20/v-29/20" :section "20.2"))
("volatile!" . (:url "/chapter-20/v-29/32" :section "20.3"))
("vreset!" . (:url "/chapter-20/v-29/32" :section "20.3"))
("vswap!" . (:url "/chapter-20/v-29/32" :section "20.3"))
("volatile?" . (:url "/chapter-20/v-29/32" :section "20.3"))
("set!" . (:url "/chapter-20/v-29/48" :section "20.4"))
;; java(script) interop
("." . (:url "/chapter-21/v-29/9" :section "21.1"))
(".." . (:url "/chapter-21/v-29/9" :section "21.1"))
("doto" . (:url "/chapter-21/v-29/9" :section "21.1"))
("new" . (:url "/chapter-21/v-29/18" :section "21.2"))
("try" . (:url "/chapter-21/v-29/27" :section "21.3"))
("catch" . (:url "/chapter-21/v-29/27" :section "21.3"))
("finally" . (:url "/chapter-21/v-29/27" :section "21.3"))
("throw" . (:url "/chapter-21/v-29/27" :section "21.3"))
("ex-info" . (:url "/chapter-21/v-29/39" :section "21.4"))
("ex-data" . (:url "/chapter-21/v-29/39" :section "21.4"))
("bean" . (:url "/chapter-21/v-29/50" :section "21.5"))
("reflect" . (:url "/chapter-21/v-29/64" :section "21.6"))
("type-reflect" . (:url "/chapter-21/v-29/64" :section "21.6"))
("make-array" . (:url "/chapter-21/v-29/82" :section "21.7.1"))
("object-array" . (:url "/chapter-21/v-29/90" :section "21.7.2"))
("int-array" . (:url "/chapter-21/v-29/90" :section "21.7.2"))
("boolean-array" . (:url "/chapter-21/v-29/90" :section "21.7.2"))
("byte-array" . (:url "/chapter-21/v-29/90" :section "21.7.2"))
("short-array" . (:url "/chapter-21/v-29/90" :section "21.7.2"))
("char-array" . (:url "/chapter-21/v-29/90" :section "21.7.2"))
("long-array" . (:url "/chapter-21/v-29/90" :section "21.7.2"))
("float-array" . (:url "/chapter-21/v-29/90" :section "21.7.2"))
("double-array" . (:url "/chapter-21/v-29/90" :section "21.7.2"))
("to-array" . (:url "/chapter-21/v-29/106" :section "21.7.3"))
("into-array" . (:url "/chapter-21/v-29/106" :section "21.7.3"))
("to-array-2d" . (:url "/chapter-21/v-29/106" :section "21.7.3"))
("aget" . (:url "/chapter-21/v-29/118" :section "21.7.4"))
("aset" . (:url "/chapter-21/v-29/118" :section "21.7.4"))
("alength" . (:url "/chapter-21/v-29/118" :section "21.7.4"))
("aclone" . (:url "/chapter-21/v-29/118" :section "21.7.4"))
("amap" . (:url "/chapter-21/v-29/130" :section "21.7.5"))
("areduce" . (:url "/chapter-21/v-29/130" :section "21.7.5"))
("aset-int" . (:url "/chapter-21/v-29/154" :section "21.7.6"))
("aset-boolean" . (:url "/chapter-21/v-29/154" :section "21.7.6"))
("aset-byte" . (:url "/chapter-21/v-29/154" :section "21.7.6"))
("aset-short" . (:url "/chapter-21/v-29/154" :section "21.7.6"))
("aset-char" . (:url "/chapter-21/v-29/154" :section "21.7.6"))
("aset-long" . (:url "/chapter-21/v-29/154" :section "21.7.6"))
("aset-float" . (:url "/chapter-21/v-29/154" :section "21.7.6"))
("aset-double" . (:url "/chapter-21/v-29/154" :section "21.7.6"))
("ints" . (:url "/chapter-21/v-29/168" :section "21.7.7"))
("booleans" . (:url "/chapter-21/v-29/168" :section "21.7.7"))
("bytes" . (:url "/chapter-21/v-29/168" :section "21.7.7"))
("shorts" . (:url "/chapter-21/v-29/168" :section "21.7.7"))
("chars" . (:url "/chapter-21/v-29/168" :section "21.7.7"))
("longs" . (:url "/chapter-21/v-29/168" :section "21.7.7"))
("longs" . (:url "/chapter-21/v-29/168" :section "21.7.7"))
("floats" . (:url "/chapter-21/v-29/168" :section "21.7.7"))
("doubles" . (:url "/chapter-21/v-29/168" :section "21.7.7"))
;; toolbox
("clojure.xml/parse" . (:url "/chapter-22/v-29/12" :section "22.1"))
("clojure.inspector/inspect-tree" . (:url "/chapter-22/v-29/28" :section "22.2"))
("clojure.inspector/inspect-table" . (:url "/chapter-22/v-29/28" :section "22.2"))
("clojure.repl/doc" . (:url "/chapter-22/v-29/43" :section "22.3.1"))
("clojure.repl/find-doc" . (:url "/chapter-22/v-29/48" :section "22.3.2"))
("clojure.repl/apropos" . (:url "/chapter-22/v-29/51" :section "22.3.3"))
("clojure.repl/dir" . (:url "/chapter-22/v-29/54" :section "22.3.4"))
("clojure.repl/dir-fn" . (:url "/chapter-22/v-29/57" :section "22.3.5"))
("clojure.repl/source" . (:url "/chapter-22/v-29/60" :section "22.3.6"))
("clojure.repl/source-fn" . (:url "/chapter-22/v-29/69" :section "22.3.7"))
("clojure.repl/pst" . (:url "/chapter-22/v-29/72" :section "22.3.8"))
("clojure.repl/root-cause" . (:url "/chapter-22/v-29/83" :section "22.3.9"))
("clojure.repl/munge" . (:url "/chapter-22/v-29/86" :section "22.3.10"))
("clojure.repl/demunge" . (:url "/chapter-22/v-29/86" :section "22.3.10"))
("clojure.repl/stack-element-str" . (:url "/chapter-22/v-29/86" :section "22.3.10"))
("clojure.main/load-script" . (:url "/chapter-22/v-29/102" :section "22.4.1"))
("clojure.main/repl" . (:url "/chapter-22/v-29/107" :section "22.4.2"))
("clojure.java.browse/browse-url" . (:url "/chapter-22/v-29/116" :section "22.5"))
("clojure.java.browse/*open-url-script*" . (:url "/chapter-22/v-29/116" :section "22.5"))
("clojure.java.shell/sh" . (:url "/chapter-22/v-29/125" :section "22.6"))
("clojure.core.server/repl" . (:url "/chapter-22/v-29/140" :section "22.7"))
("clojure.core.server/stop-server" . (:url "/chapter-22/v-29/160" :section "22.7.1"))
("clojure.java.io/reader" . (:url "/chapter-22/v-29/171" :section "22.8.2"))
("clojure.java.io/with-open" . (:url "/chapter-22/v-29/175" :section "22.8.3"))
("clojure.java.io/writer" . (:url "/chapter-22/v-29/182" :section "22.8.4"))
("clojure.java.io/resource" . (:url "/chapter-22/v-29/194" :section "22.8.6"))
("clojure.java.io/as-url" . (:url "/chapter-22/v-29/197" :section "22.8.7"))
("clojure.java.io/file" . (:url "/chapter-22/v-29/204" :section "22.8.9"))
("clojure.java.io/copy" . (:url "/chapter-22/v-29/210" :section "22.8.10"))
("clojure.java.io/make-parents" . (:url "/chapter-22/v-29/216" :section "22.8.11"))
("clojure.java.io/delete-file" . (:url "/chapter-22/v-29/219" :section "22.8.12"))
("clojure.java.io/as-relative-path" . (:url "/chapter-22/v-29/222" :section "22.8.13")))
Zeal 최신 버전은 Flatpack 으로 설치
그리고 나서 심볼링 링크를 만들라. 그러면 된다.
lrwxrwxrwx 1 junghan junghan 63 10월 25 10:59 .docsets -> /home/junghan/.var/app/org.zealdocs.Zeal/data/Zeal/Zeal/docsets/
NOTE Zeal 과 자동 번역 활용 하는 방법
Zeal 에 브라우즈로 보기 기능이 있다. 거기서 자동 번역을 켜라.