From 37f41070c09059025029fb81aca9a31712e06fff Mon Sep 17 00:00:00 2001 From: netpyoung Date: Sun, 28 Jan 2024 08:43:41 +0900 Subject: [PATCH] update: src/ --- src/SUMMARY.md | 4 ++-- src/ch03/ch03.md | 2 +- src/ch03/lesson_01.md | 4 ++-- src/ch03/lesson_02.md | 19 ++++++++++--------- src/ch03/lesson_03.md | 4 ++-- src/ch03/lesson_05.md | 2 +- src/ch03/lesson_06.md | 2 +- src/ch03/lesson_09.md | 6 +++--- src/ch03/lesson_10.md | 16 ++++++++-------- src/ch03/lesson_11.md | 5 +++-- src/ch03/lesson_12.md | 3 ++- 11 files changed, 35 insertions(+), 32 deletions(-) diff --git a/src/SUMMARY.md b/src/SUMMARY.md index ded60b1..a9db713 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -2,9 +2,9 @@ - [들어가며](./Index.md) -# 03. 12개의 레슨으로 배우는 필수 리스프 +# 03장. 12개의 레슨으로 배우는 필수 리스프 -- [03. 12개의 레슨으로 배우는 필수 리스프](./ch03/ch03.md) +- [03장. 12개의 레슨으로 배우는 필수 리스프](./ch03/ch03.md) - [레슨 01. 필수 - 신택스](./ch03/lesson_01.md) - [레슨 02. 필수 - 평가](./ch03/lesson_02.md) - [레슨 03. 스페셜 폼과 매크로에 대한 예제](./ch03/lesson_03.md) diff --git a/src/ch03/ch03.md b/src/ch03/ch03.md index 266a3ad..2c708ee 100644 --- a/src/ch03/ch03.md +++ b/src/ch03/ch03.md @@ -1,4 +1,4 @@ -# 03. 12개의 레슨으로 배우는 필수 리스프 +# 03장. 12개의 레슨으로 배우는 필수 리스프 이번 장은 여러분에게 리스프를 시작하기에 앞서 알아야 할 모든것을 가르칠 것입니다. diff --git a/src/ch03/lesson_01.md b/src/ch03/lesson_01.md index ccc5082..2e54e6a 100644 --- a/src/ch03/lesson_01.md +++ b/src/ch03/lesson_01.md @@ -2,7 +2,7 @@ - [원문](https://dept-info.labri.fr/~strandh/Teaching/MTP/Common/David-Lamkins/chapter03-01.html) -## 리스트는 괄호로 감싸져있다. +## 리스트는 괄호로 감싸져있다 리스프에 대해 우선적으로 알아할 것입니다: 괄호로 둘러싸인 모든것은 `리스트(list)`이다. @@ -61,7 +61,7 @@ 리스프에서 `리스트`는 여러가지가 될 수 있습니다. 가장 일반적인 경우, `리스트`는 프로그램이나 데이터가 될 수 있습니다. 그리고 `리스트`가 스스로 다른 리스트를 만들 수 있기에, 여러분은 복잡한 데이터의 조합과 여러 단계의 리스트 구조로 된 프로그램을 가질 수 있습니다. 이를 잘 이해하는 자에게는 리스프는 엄청난 유연성을 부여해 줄 것이며, 그렇지 않은 자에게는 많은 혼란을 줄 것입니다. 이번장을 계속해서 나아가면서 이러한 혼란을 없애도록 노력해 봅시다. -## 아톰(Atom)은 공백이나 괄호로 분리된 것입니다. +## 아톰(Atom)은 공백이나 괄호로 분리된 것이다 이제 여러분은 리스트를 구분할 수 있으며, 괄호 사이에 나타나지만 (리스트가 아닌)단어나 숫자인 것들에 대한 것들을 뭐라고 부르는지 알고 싶을 것입니다. 이러한 것들을 `아톰(atom)`이라 부릅니다. diff --git a/src/ch03/lesson_02.md b/src/ch03/lesson_02.md index 59ec9d8..1f69b79 100644 --- a/src/ch03/lesson_02.md +++ b/src/ch03/lesson_02.md @@ -2,7 +2,7 @@ - [원문](https://dept-info.labri.fr/~strandh/Teaching/MTP/Common/David-Lamkins/chapter03-02.html) -## 폼(form)은 평가될 수 있습니다. +## 폼(form)은 평가될 수 있다 `폼(form)`은 `아톰(atom)` 혹은 `리스트(list)`가 될 수 있습니다. 중요한 것은 `폼`이 `평가(evaluation)`된다는 것입니다. 평가라는 것은 상당한 기술적 의미를 지니고 있으며, 이번 섹션에서 서서히 그 모습을 드러나게 될 것입니다. @@ -10,13 +10,13 @@ 숫자는 `아톰`입니다(이 값은 상수입니다). 리스프는 숫자에 값을 저장 할 수 없습니다: 숫자는 자체적으로 평가됩니다. - 정의가 완전히 내려지지 않은 새로운 용어를 소개합니다. 이제, 심볼을 값을 가질 수 있는 `아톰`이라고 여기기 바랍니다. 레슨 5[p 53]에서 심볼에 대해 더욱 자세히 살펴볼 것입니다. + 정의가 완전히 내려지지 않은 새로운 용어를 소개합니다. 이제, 심볼을 값을 가질 수 있는 `아톰`이라고 여기기 바랍니다. [레슨 5](./lesson_05.md)[p 53]에서 심볼에 대해 더욱 자세히 살펴볼 것입니다. `defconstant`로 정의된 심볼은 상수 값을 지닙니다. 리스프는 변수처럼 아톰에 값을 저장한 다음, 값을 바꿀 수 없다라는 메모를 추가합니다. 패키지에 있는 `키워드(keyword) 심볼`은 스스로 평가됩니다. 패키지에 관한 것은 31장[p 247]에서 자세히 살펴볼 것입니다. 지금, 여러분이 알아야 할것은 (패키지 프리픽스라 불리는) `:` 문자로 시작하는 심볼은 `키워드 심볼`이라는 것입니다. `키워드 심볼`은 그 자신을 값으로 갖습니다. - 다양한 방식으로 심볼에서 값을 얻을 수 있습니다. 리스프는 실제로 심볼에 다양한 값을 저장합니다. 하나는 변수로서의 심볼의 값. 그리고 다른 하나는 함수로서 심볼입니다. 또 다른 것들은 해당 심볼에 대한 문서를 얻거나, 출력값으로 활용하거나, 연관리스트(associated list)처럼 속성값으로 쓰이기도 합니다. 이러한 것들에 대해 레슨 5 [p 53], 레슨 6 [p 56], 레슨 7 [p 59]에서 더욱 자세히 살펴볼 것입니다. + 다양한 방식으로 심볼에서 값을 얻을 수 있습니다. 리스프는 실제로 심볼에 다양한 값을 저장합니다. 하나는 변수로서의 심볼의 값. 그리고 다른 하나는 함수로서 심볼입니다. 또 다른 것들은 해당 심볼에 대한 문서를 얻거나, 출력값으로 활용하거나, 연관리스트(associated list)처럼 속성값으로 쓰이기도 합니다. 이러한 것들에 대해 [레슨 5](./lesson_05.md) [p 53], [레슨 6](./lesson_06.md) [p 56], [레슨 7](./lesson_07.md) [p 59]에서 더욱 자세히 살펴볼 것입니다. 폼이 리스트라면, 첫번째 요소는 심볼이거나 람다(lambda)표현식이라 불리는 특별한 폼일 것입니다. (람다 표현식에 대한것은 잠시 뒤로 미루겠습니다.) 심볼은 함수의 이름을 짓습니다. 리스프에서 심볼 `+`, `-`, `*`, `/`는 일반적인 산술 연산자입니다: 덧셈, 빨셈, 곱셈, 나누기. 각 심볼은 산술 연산을 수행하는 함수와 연관되어있습니다. @@ -24,7 +24,7 @@ 따라서 리스프가 폼 `(+ 2 3)`을 평가하면, 이는 덧셈 함수`+`에 인자 `2`와 `3`을 적용시킬 것이며, 예상되듯이 결과 `5`를 반환할 것입니다. 함수로서 심볼 `+`가 인자들 앞에 있습니다. 이는 `전위 표기법(prefix notation)`입니다. 리스프가 리스트를 폼으로 평가하기 위해 무얼할 것인지 이해하기 위해선, 리스트의 첫번째 요소를 살펴보시기 바랍니다. -## 함수는 인자를 받을 수 있습니다. +## 함수는 인자를 받을 수 있다 주어진 리스트를 평가할때 리스프는 폼을 함수 호출로써 다룹니다. 지금부터 우리는 수 많은 리스프의 평가를 보게 될 것이며, 리스프의 입력과 이의 반응을 구분하기 위해 다음과 같이 시각적 표시를 할 것입니다: @@ -105,7 +105,7 @@ WHAT-IS-THIS? 심볼 `WHAT-IS-THIS?`는 리스프에 의해 미리 정의되지 않아 값을 지니지 않으며, 이에 값을 얻을 수 없습니다. 시스템은 값 대신에 에러메시지로 응답할 것입니다. 에러 메시지 앞에 `;;>|`를 붙여 표시하였습니다. 시스템에 따라 다른 에러 메시지가 출력될 수 있습니다. -## 함수는 다수의 값을 반환 할 수 있다. +## 함수는 다수의 값을 반환 할 수 있다 우리는 종종 다수의 값을 반환하는 함수를 갖길 원합니다. 예를들어, 데이터베이스 전체를 살펴보는 함수는 요구하는 값과 완료상태코드를 동시에 반환해야 합니다. 이를 행할 방법으로는 해당 결과값을 저장할 위치 자체를 함수에 전달하는 것입니다; 가능은 하지만, 리스프 프로그램에서는 매우 드믄 일입니다. @@ -126,13 +126,14 @@ WHAT-IS-THIS? 리스프가 `values` 폼으로 각 인자에 대한 값을 반환하는 것을 확인할 수 있습니다. -## 함수에서 인자를 수정하지 않는다. +## 함수 안에서 인자를 수정하지 않는다 앞서, 결과값을 저장할 위치 자체를 인자로 함수에 넘길 수 있으며, 함수가 그 위치의 값을 바꿀 수도 있다고 말한 바가 있습니다. 다른 언어들은 이를 일반적인 레파토리로 말할지라도, 리스프 프로그램에서 매우 드문 일입니다. 저장할 위치에 키워드가 아닌 심볼이나 구조체 같은 것을 넣을 수 는 있습니다. 심볼을 넣을 경우, 함수는 심볼에 새로운 값을 넣는 코드를 수행해야만 합니다. 구조체를 넣을 경우 구조체의 각 값을 올바르게 변경하는 코드를 수행해야만 합니다. 이러한 작업 자체도 복잡하고 이렇게 작성된 프로그램을 이해하는 것도 어렵습니다. 따라서 리스프 프로그래머들은 일반적으로 인자를 수정하지 않고, 인자는 인자, 결과는 결과로 구분된 함수를 작성합니다. -## 인자는 (보통은) 함수가 적용 전에 평가된다. + +## 인자는 (보통은) 함수가 적용 전에 평가된다 리스프가 함수를 평가하면, 앞서 봤던것처럼[p 42], 항상 모든 인자를 우선적으로 평가합니다. 불행히도, 모든 규칙에는 예외가 있으며, (곧 보게될 것처럼)이 규칙도 예외는 아닙니다... 문제는 리스프가 함수의 인자를 평가하지 않을 수 있다라는 점이 아니라, 리스트 폼은 함수 호출이 아닐 수 도 있다라는 점입니다. @@ -142,12 +143,12 @@ WHAT-IS-THIS? 리스트 폼이 함수를 호출하면, 이의 인자는 항상 좌측에서 우측으로 순서대로 평가됩니다. -## 스페셜 폼과 매크로는 인자의 평가하는 방법을 바꿀 수 있다. +## 스페셜 폼과 매크로는 인자의 평가하는 방법을 바꿀 수 있다 리스트 폼이 함수 호출이 아닐 수 도 있다 라고 했는데, 그럼 무엇이 될 수 있을까요? 2가지 경우가 있지만, 결과는 같습니다: 몇몇 인자는 평가되며 몇몇은 평가가 안됩니다. 폼이나 폼이 아니냐에 달려있습니다. 이 예외에 대해서만 알면 됩니다. 다행히도, 대부분의 리스프 시스템은 한두번의 키 입력으로 이에 대한 온라인 문서를 여러분에게 보여줄 것입니다. - 모든 인자가 평가되지 않는 폼은 두가지가 있습니다: 스페셜 폼과 매크로. 리스프는 몇몇 스페셜 폼을 미리 정의해 두었습니다. 언어 자체의 주요 기능이기에 여러분만의 스페셜 폼을 추가할 수는 없습니다. 또 리스프는 몇몇 매크로를 미리 정의해두었습니다. 단, 매크로는 저희가 작성할 수 있습니다. 리스프의 매크로를 이용하면 언어의 강력한 힘을 이용하여 우리만의 기능을 추가 할 수 있습니다. 이 장의 뒷 부분에서 간략하게 간단한 매크로를 작성해 볼 것입니다 [p 61]. 20장에서는[p 188] 복잡한 매크로에 대해 다뤄볼 것입니다. + 모든 인자가 평가되지 않는 폼은 두가지가 있습니다: 스페셜 폼과 매크로. 리스프는 몇몇 스페셜 폼을 미리 정의해 두었습니다. 언어 자체의 주요 기능이기에 여러분만의 스페셜 폼을 추가할 수는 없습니다. 또 리스프는 몇몇 매크로를 미리 정의해두었습니다. 단, 매크로는 저희가 작성할 수 있습니다. 리스프의 매크로를 이용하면 언어의 강력한 힘을 이용하여 우리만의 기능을 추가 할 수 있습니다. 이 장의 뒷 부분에서 간략하게 간단한 [매크로를 작성해 볼 것입니다](./lesson_08.md) [p 61]. 20장에서는[p 188] 복잡한 매크로에 대해 다뤄볼 것입니다. diff --git a/src/ch03/lesson_03.md b/src/ch03/lesson_03.md index 0a38b3c..36d3473 100644 --- a/src/ch03/lesson_03.md +++ b/src/ch03/lesson_03.md @@ -231,14 +231,14 @@ a 차이점은 `(setq a b)`에서 사용된 `b`의 *값* 과 `(setq a (quote b))`에서의 *심볼* `b`입니다. - `quote` 폼은 매우 자주 사용되며, 리스프는 약칭 표기를 제공합니다: + `quote` 폼은 매우 자주 사용되며, 리스프는 다음과 같은 표기법를 제공합니다: ``` txt (QUOTE form) == 'form ``` - 리스프는 리더 매크로를 통해 `'`와 `quote`를 동일하게 처리합니다. 레슨 12 [p 82]에서 어떻게 여러분만의 리더 매크로를 정의할 수 있는지 간략하게 살펴볼 것입니다. + 리스프는 리더 매크로를 통해 `'`와 `quote`를 동일하게 처리합니다. [레슨 12](./lesson_12.md) [p 82]에서 어떻게 여러분만의 리더 매크로를 정의할 수 있는지 간략하게 살펴볼 것입니다. ## 짚고 넘어가기 diff --git a/src/ch03/lesson_05.md b/src/ch03/lesson_05.md index 6959e31..5622012 100644 --- a/src/ch03/lesson_05.md +++ b/src/ch03/lesson_05.md @@ -69,7 +69,7 @@ first 심볼은 변수나 함수의 값 외에 다른 값을 가질 수 있습니다. 심볼은 문서, 프로퍼티 리스트(property list) 혹은 출력시 표시되는 값을 가질 수 있습니다. 심볼의 문서는 해당 심볼의 설명을 위한 텍스트입니다. `documentation` 폼을 사용하거나 심볼의 값을 정의하는 몇몇 폼에서 심볼에 대한 문서도 같이 만들 수 있습니다. 심볼은 다양한 의미를 가질 수 있으므로 함수 및 변수와 같이 여러 가지 의미에 맞는 각각에 대한 문서를 만들 수 있습니다. - 프로퍼티 리스트는 엔트리(entry)당 하나의 키를 지닌 자그마한 데이터 베이스와 같습니다. 레슨 10 [p 65]에서 이러한 심볼의 사용법을 살펴볼 것입니다. + 프로퍼티 리스트는 엔트리(entry)당 하나의 키를 지닌 자그마한 데이터 베이스와 같습니다. [레슨 10](./lesson_10.md) [p 65]에서 이러한 심볼의 사용법을 살펴볼 것입니다. 출력 이름은 리스프에서 심볼을 출력하기 위해 사용하는 것입니다. 일반적으로 이 이름을 변경하지 않는게 좋습니다; 다른 이름으로 변경한다면, 다른 이름으로 출력된 결과를 리스프가 다시 읽어들일때 원래 심볼값과 다른 의미로 받아들여 혼란을 야기할 것입니다. diff --git a/src/ch03/lesson_06.md b/src/ch03/lesson_06.md index 495c2d7..f00102f 100644 --- a/src/ch03/lesson_06.md +++ b/src/ch03/lesson_06.md @@ -15,7 +15,7 @@ 리스프는 각 바인딩마다 이름을 부여합니다. 만일 그렇지 않다면, 프로그램은 어떻게 바인딩을 참조할 수 있을까요? 간단하게, 어? 잠시만요... -## 바인딩은 동시에 다른 값을 가질 수 있다. +## 바인딩은 동시에 다른 값을 가질 수 있다 중첩 바인딩에서 동일한 이름을 공유하는 것은 매우 일반적인 일입니다. 예를들어: diff --git a/src/ch03/lesson_09.md b/src/ch03/lesson_09.md index b727d8f..9ff4101 100644 --- a/src/ch03/lesson_09.md +++ b/src/ch03/lesson_09.md @@ -8,7 +8,7 @@ 폼은 보통 하나의 값을 반환합니다. 리스프는 여러개의 값을 생성하거나 받을 수 있는 폼을 갖고 있습니다. -## VALUES는 여러개의 값을 생성하거나 아무것도 생성하지 않는다. +## VALUES는 여러개의 값을 생성하거나 아무것도 생성하지 않는다 `values` 폼은 0개 이상의 값을 반환합니다: @@ -29,7 +29,7 @@ `values`는 함수이며, 따라서 이의 인수를 평가합니다. -## 몇몇 특수한 폼은 여러개의 값을 받을 수 있다. +## 몇몇 특수한 폼은 여러개의 값을 받을 수 있다 여러개의 값들을 다루고자 한다면 어떻게 해야 할까요? 가장 기본적인 것들로는 : @@ -61,7 +61,7 @@ ``` -## 몇몇 폼은 여러개의 값들을 그대로 넘긴다. +## 몇몇 폼은 여러개의 값들을 그대로 넘긴다 몇몇 폼은 새로운 값을 생성하는 대신에, 본체의 마지막 값을 넘김니다. 예제는 `let`, `cond`, `defun`, `lambda`의 본체를 포함합니다. diff --git a/src/ch03/lesson_10.md b/src/ch03/lesson_10.md index 9dd2aff..5e24f70 100644 --- a/src/ch03/lesson_10.md +++ b/src/ch03/lesson_10.md @@ -3,7 +3,7 @@ - [원문](https://dept-info.labri.fr/~strandh/Teaching/MTP/Common/David-Lamkins/chapter03-10.html) -## 리스프는 대부분의 숫자를 제대로 처리한다. +## 리스프는 대부분의 숫자를 제대로 처리한다 뭔가 이상한 소리처럼 들립니다. 컴퓨터는 항상 숫자로 일을 처리하지 않나요? 음, 아닙니다... 보통은 그렇지 않습니다. @@ -81,7 +81,7 @@ 리스프는 소수를 소수점과 함께, 정수에는 소수점 없이 출력합니다. -## 문자는 리스프가 읽고 쓸 수 있는 무언가를 제공합니다. +## 문자는 리스프가 읽고 쓸 수 있는 무언가를 제공한다 기본적으로 리스프 I/O(input/output)는 문자를 이용합니다. `READ`와 `WRITE` 함수는 문자를 리스프 오브젝트로 그리고 그 반대로 변환시킵니다. `READ-CHAR`와 `WRITE-CHAR`는 단일 문자를 읽고 씁니다. @@ -160,7 +160,7 @@ P Q R S T U V W X Y Z [ \ ] ^ _ p q r s t u v w x y z { | } ~ ``` -## 배열은 데이터를 테이블로 정리한다. +## 배열은 데이터를 테이블로 정리한다 여러분이 데이터를 2차원, 3차원 혹은 더 많은 차원의 테이블로 역으려고자 한다면, 배열(array)을 만들 수 있습니다: @@ -283,7 +283,7 @@ s1 ``` -## 심볼은 유니크하지만, 여러개의 값을 가진다. +## 심볼은 유니크하지만, 여러개의 값을 가진다 이미 [레슨 5](./lesson_05.md)에서 심볼은 고유한 동일성(identity)을 지닌다고 했는데, 반복해 설명할 필요가 있습니다: 심볼은 철자가 같은 다른 심볼과 동일합니다(이번 레슨 끝부분에서 좀 더 배우게 될 패키지 지정(designation)에 포함된). 이는 리스프로 하여금 프로그램이나 데이터를 읽을 수 있도록 만들어 주며, 철자가 같은 심볼은 모두 동일한 심볼입니다. 리스프가 이를 위한 매커니즘을 제공하기에, 심볼 정보를 다루는 프로그램을 작성하는 것에 대한 걱정을 하나 덜게 되었습니다. @@ -322,7 +322,7 @@ object-1 오늘날의 리스프 프로그램에서는 프로퍼티는 거의 사용되지 않습니다. 해쉬테이블(Hashtables) (아래 참조) [p 73] , (다음 단락에서 기술된) 구조체(structures), CLOS 오브젝트(7장 [p 117]과 14장 [p 157] 참조)는 사용하기 더 편리하며 더욱 효율적인 방식으로 프로퍼티 리스트의 모든 기능을 제공합니다. 현대 리스프의 개발에선 프로퍼티 파일과 심볼을 정의하는 폼의 파일 위치, 함수의 인자 리스트의 정의와 같은 (프로그래밍 환경에서 유용한 도구로 이용하기 위한) 특정 정보를 프로그램에 주석으로써 기록하는 목적으로 주로 사용합니다. -## 구조체는 연관된 데이터들을 모아 저장할 수 있다. +## 구조체는 연관된 데이터들을 모아 저장할 수 있다 리스프 구조체는 명명된 슬롯(slot)과 관계된 데이터를 저장하는 오브젝트를 생성하는 방법을 제공해 줍니다. @@ -364,7 +364,7 @@ object-1 6장[p 112]에서 `DEFSTRUCT`의 optional 기능에 대해 살펴볼 것입니다. -## 타입 정보를 런타임에 알 수 있다. +## 타입 정보를 런타임에 알 수 있다 심볼은 런타임시 어떠한 변수 타입과도 연관지을 수 있습니다. 문제가 있는 경우, 리스프는 해당 값의 타입을 질의할 수 있는 방법을 제공합니다: @@ -390,7 +390,7 @@ object-1 CLOS(14장 [p 157] 참조)의 제네릭 함수의 도입으로, `TYPE-OF`는 예전만큼 중요하지는 않습니다. -## 해쉬 테이블은 룩업키로 빠르게 데이터에 접근 할 수 있다. +## 해쉬 테이블은 룩업키로 빠르게 데이터에 접근 할 수 있다 해쉬 테이블은 유니크 키(유일 키, unique key)와 값의 연결로 이루어져 있습니다. 프로퍼티 리스트완 다르게, 해쉬 테이블은 수 많은 키/값 쌍에 적합하며, 적은 수의 연결 집합에 대해서는 과도한 오버헤드(overhead)가 발생합니다. @@ -434,7 +434,7 @@ object-1 키를 없애고자 한다면 `(REMHASH key hash-table)`폼을 이용합니다. 그리고 키에 해당하는 값을 바꾸고자한다면, 키/값 쌍을 추가했던 것처럼 `GETHASH`와 `SETF`를 이용합니다. -## 패키지로 이름 충돌을 방지할 수 있다. +## 패키지로 이름 충돌을 방지할 수 있다 프로그램을 작성시 어려운 점 중 하나는 이름 짓는 것입니다. 한편으론, 기억하기 쉽고 해당 객체의 역할이나 목적을 떠올릴 수 있는 이름을 사용하기 원할 것입니다. 그리고 다른 한편으론, 다른 프로그램의 어딘가에 이미 사용한 (혹은 사용될 것 같은)이름을 여러분의 프로그램에서 사용하고 싶진 않을 것입니다. diff --git a/src/ch03/lesson_11.md b/src/ch03/lesson_11.md index 76d66eb..d44ee68 100644 --- a/src/ch03/lesson_11.md +++ b/src/ch03/lesson_11.md @@ -3,7 +3,7 @@ - [원문](https://dept-info.labri.fr/~strandh/Teaching/MTP/Common/David-Lamkins/chapter03-11.html) -## READ는 리스프 데이터를 받는다. +## READ는 리스프 데이터를 받는다 [레슨 10](./lesson_10.md)에서 봤던것처럼, `read`는 문자를 리스프 데이터로 변환시킵니다. 이제까지, 우리들은 리스프 데이터 여러 출력 값들을 살펴 보았습니다: @@ -116,7 +116,8 @@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ;;=> |A BC| ``` -## OPEN과 CLOSE는 파일을 다룰 수 있게 한다. + +## OPEN과 CLOSE는 파일을 다룰 수 있게 한다 보통, `READ`는 키보드를 읽고 `PRINT`는 화면에 출력합니다. 이러한 함수 모두 옵셔널(optional) 인수를 취합니다; 인수로 `READ`를 위한 입력 스트림과 `PRINT`를 위한 출력 스트림을 지정합니다. 스트림(stream)은 무엇일까요? 스트림은 데이터의 소스(source)이자 밑바닥(sink)이며, 보통은 (그치만 절대적이지는 않은) 문자들(characters)입니다. 이제부터, 저희는 텍스트 파일이 어떻게 문자 스트림의 소스가 될 수 있는지를 살펴볼 것입니다. 19장 [p 183]에서 저희는 몇몇 다른 가능성들을 살펴볼 것입니다. diff --git a/src/ch03/lesson_12.md b/src/ch03/lesson_12.md index 6b94107..10d3c91 100644 --- a/src/ch03/lesson_12.md +++ b/src/ch03/lesson_12.md @@ -7,7 +7,8 @@ [레슨 11](./lesson_11.md)에서 리스프 리더(reader)가 구성문자들을 심볼과 숫자로 모았으며, 매크로 문자들로 리더를 제어하여 리스트, 문자열, `quote`된 폼, 주석을 처리하는 것을 보았습니다. 이 모든 경우에서와 같이, 리더(reader)는 문자들을 데이터로 바꿉니다 (좀 더 정확히 하자면, 주석은 "데이터가 아닙니다".) -## 표준 리더 매크로는 내장 데이터 타입을 다룰 수 있다. + +## 표준 리더 매크로는 내장 데이터 타입을 다룰 수 있다 지금까지, 우리는 리스프의 기본 문법만을 살펴보았습니다. 이는 리더에 의해 구현되며, 리드테이블(readtable)에 의해 제어됩니다. 리더는 리드테이블에 저장되어있는 정보를 따라 문자들을 처리합니다.