A Gentle Introduction To Symbolic Computation: http://www.cs.cmu.edu/~dst/LispBook/ ì½ìœ¼ë©´ì„œ ì •ë¦¬í•´ë³´ìž == 서문 == * 리스프는 ì¸ê³µì§€ëŠ¥ ì—°êµ¬ì˜ ì£¼ìš” 언어로 ìœ ëª…í•˜ë‹¤ * ì—¼ë‘ì— ë‘” ë…ìž: í”„ë¡œê·¸ëž˜ë° ìž…ë¬¸í•˜ëŠ” í•™ìƒ / 심리학ìž, 언어학ìž, 컴퓨터 ê³¼í•™ìž ë“± ì¸ê³µì§€ëŠ¥ì— ê´€ì‹¬ 있는 사람들 / 취미로 컴퓨터 하는 사람 * ì±…ì˜ êµ¬ì„± * 1, 2장: ìƒìž, 화살표 표기로 기초ì ì¸ í•¨ìˆ˜, 함수 합성 설명 * 3장: EVAL 표기 * 8장까지는 부수효과 없는 í”„ë¡œê·¸ëž˜ë° * 9장: ìž…ì¶œë ¥ * 10장: ordinary variables, generalized variables, destructive sequence operations. * 11장: 반복(DO, DO*) * 12장: 구조 * 13장: ë°°ì—´, 해시테ì´ë¸”, property list * 14장: 매í¬ë¡œ, 컴파ì¼, lexical scopingê³¼ dynamic scopingì˜ ì°¨ì´ * 간략화 * Common Lisp는 복잡한 ì–¸ì–´ë¼ ì 당히 간략화한 ê²ƒë“¤ì´ ìžˆë‹¤ * 1+와 1-는 ì´ë¦„ì´ í˜¼ëž€ìŠ¤ëŸ¬ì›Œ ëºë‹¤ * EQUALì„ ì£¼ë¡œ 사용. EQ, EQL, EQUALP, =는 ê³ ê¸‰ ì£¼ì œì—서 ë…¼ì˜ * 잘 ì•Œë ¤ì§€ì§€ ì•Šì€ PUSHNEW ê°™ì€ ì›ì‹œí˜•ì„ ì‚¬ìš©í•˜ëŠë‹ˆ 함수를 좀 ë” í’€ì–´ì“´ ê²ƒì´ ëª‡ êµ°ë° ìžˆë‹¤ * 가장 ê³ ê¸‰ ì£¼ì œì¸ multiple value나 package systemì€ ë‹¤ë£¨ì§€ 않는다 PDF 파ì¼ì— 목차가 없어 ã…¡ã…¡ == 1장. 함수와 ë°ì´í„° == === 1장 요약 === * ì‚°ìˆ í•¨ìˆ˜: +, -, *, /, ABS, SQRT * 숫ìží˜•: ì •ìˆ˜(integer), ë¶€ë™ì†Œìˆ˜ì 수(floating number), 비율수(ratio) * ì •ìˆ˜ë¡œ ì‚°ìˆ ì—°ì‚°ì„ í•˜ë©´ 결과는 ì •ìˆ˜ ë˜ëŠ” 비율수다. * 3/6 = '''1/2''' <- ì´ê²Œ ratio * 3/6.0 = 0.5 * 심볼: ìˆ«ìž ì´ì™¸ì˜ ë˜ë‹¤ë¥¸ ìžë£Œí˜• * 특수 심볼: T는 ì°¸ ë˜ëŠ” ê¸ì •, NILì€ ê±°ì§“ ë˜ëŠ” ë¶€ì • * T ë˜ëŠ” NILì„ ë°˜í™˜í•˜ëŠ” 함수는 ìˆ ì–´ì‹(predicate) * 기본ì ì¸ ë‚´ìž¥ 함수들 * NUMBERP: ë°ì´í„°ê°€ 숫ìží˜•ì¸ê°€? * SYMBOLP: ë°ì´í„°ê°€ 심볼ì¸ê°€? * 숫ìží˜• ì „ìš© ìˆ ì–´ì‹ë“¤: ZEROP(ì˜), ODDP(홀수), EVENP(ì§ìˆ˜) * í¬ê¸° 비êµ: <. > * í•등 비êµ: EQUAL * 내장 í•¨ìˆ˜ë“¤ì€ ì›ì‹œ 함수(primitive function) ë˜ëŠ” 그냥 primitiveë¼ê³ 부른다 * ìž…ë ¥ì—서 1ì„ ë”하거나 빼는 1+, 1- 함수가 있지만 ì´ ì±…ì—ì„ ì“°ì§€ ì•Šê² ë‹¤. 헷갈림 * ë¶€ì •: NOT(NILì€ T로, '''NILì´ ì•„ë‹Œ ëª¨ë“ ê²ƒì€ NIL으로''') * 그럼 NOT(NOT(5))는 5ê°€ ì•„ë‹ˆë¼ Tì¸ê°€? * í•¨ìˆ˜ì˜ ì¸ìž 개수 * ODDPì˜ ì¸ìžëŠ” ë”± 1ê°œ, EQUALì€ 2ê°œ * +, -, *, /ì˜ ì¸ìž 개수는 여러 ê°œ * +ì˜ ì¸ìžê°€ 2, 3, 4ë©´ 2ëž‘ 3부터 ë”í•˜ê³ ì—¬ê¸°ì— 4를 ë”한다 * -, /ì˜ ì¸ìžê°€ í•˜ë‚˜ì¸ ê²½ìš° * -ì˜ ì¸ìžê°€ nì´ë©´ 결과는 0ì—서 n 뺀 ê±° * /ì˜ ì¸ìžê°€ nì´ë©´ 결과는 1ì—서 n 나눈 ê±° * 타 언어는 ì‚°ìˆ ì—°ì‚°ì´ ì´í• ì—°ì‚°ì´ê³ 2+3+4는 단순히 (2+3)+4로 처리ë˜ëŠ”ë° * 리스프는 + ìžì²´ê°€ ní• ì—°ì‚°ì´ ë 수 있다는 ê±´ê°€??? * 오류: 3ì´ëž‘ FRED를 ë”í• ìˆ˜ ì—†ê³ , EQUALì˜ ì¸ìžë¥¼ 한 개만 넘기면 안 ë˜ê³ , 0으로 나누면 안 ë˜ê³ . === 1장 ê³ ê¸‰ ì£¼ì œ === * ë¦¬ìŠ¤í”„ì˜ ì—사 * 1956ë…„ Dartmouth 대학ì—서 ì—¬ë¦„ì— ì—´ë¦° ì¸ê³µì§€ëŠ¥ ê´€ë ¨ 연구 모임ì—서 ì¡´ 매카시가 "list processing"ì´ëž€ ê¸°ë²•ì„ ë°°ì› ë‹¤ * 1950년대ì—는 어셈블리어로 프로그래ë°ì„ 했지 * "list processing"ì„ ë°œí‘œí•œ ì‚¬ëžŒë“¤ì€ ì‹¬ë³¼ê³¼ 리스트를 다루는 보다 ì¶”ìƒì ì¸ IPLì´ëž€ 언어를 만들었다 * ê·¸ ë¬¸ë²•ì´ ì–´ì…ˆë¸”ë¦¬ì–´ì— ê°€ê¹Œì›Œì„œ ê´´ìƒí–ˆë‹¤ * 한편 수치ì ê³„ì‚°ì— íŠ¹í™”ëœ FORTRANì´ ê°œë°œë˜ê³ 있었다 * 어셈블리어는 Y = (X + 5) * 10 í•˜ë ¤ë©´ LOAD Y, X -> ADD Y, 5 -> MULT Y, 10 ë¼ê³ ì¨ì•¼ í•˜ëŠ”ë° * FORTRANì€ ê·¸ëƒ¥ Y = (X + 5) * 10 ì´ë¼ê³ ì“°ë©´ ëœë‹¤. 표현ì‹(expression)ì˜ ìž‘ì„±ì´ ê°€ëŠ¥í•˜ë‹¤ëŠ” 뜻 * ê·¸ 당시ì—는 ì´ ê°œë…ì´ í˜ëª…ì´ì˜€ë‹¤ë”ë¼ * ì¡´ 매카시: 나ë„... ë‚˜ë„ ì´ëŸ° ê±° 만들 거야! * FORTRANì— ë¦¬ìŠ¤íŠ¸ ì¡°ìž‘ì„ ìœ„í•œ 특별한 í•˜ìœ„ë£¨í‹´ë“¤ì„ ì¶”ê°€í•˜ë©´ 어떨까? * IBMì˜ Herbert Gelerntner와 Carl Gerberichê°€ ì´ ì•„ì´ë””어를 따와 FLPLì„ ë§Œë“¦ * 매카시는 IPL, FORTRAN, FLPLì„ í† ëŒ€ë¡œ LISP를 설계 * Lisp 1.5는 처ìŒìœ¼ë¡œ ë„리 í¼ì§„ 리스프 ë°©ì–¸ * 1960년대 중반부터 온갖 리스프 ë°©ì–¸ì´ ìƒê¸°ê¸° 시작 * MacLisp, Interlisp, Stanford Lisp 1.6, UCI Lisp... * ëª¨ë‘ Lisp 1.5ì„ í™•ìž¥í•œ 것. 하지만 서로 í˜¸í™˜ì´ í•˜ë‚˜ë„ ì•ˆ ëœë‹¤ * 1970년대: ALGOL계 ì–¸ì–´ì˜ íŠ¹ì§•ë“¤ê³¼ ë¦¬ìŠ¤í”„ì˜ ë¬¸ë²•ì„ ê²°í•©í•œ Schemeì´ ë‚˜ì™”ì–´ìš” * ê·¸ë¦¬ê³ ë˜ë‹¤ì‹œ Schemeì˜ ë°©ì–¸ë“¤ì´ ìš°í›„ì£½ìˆœ ìƒê²¨ë‚˜ê¸° 시작했다 * 1980년대: ë„리 ì“°ì´ëŠ” 리스프 방언만 í•´ë„ ìˆ˜ë‘룩한ë°... ë˜ ì¨ì•¼ 하지? * ë§Œêµê³µìš©ì–´ë¥¼ 만들ìž!!! * 1984ë…„ Common Lisp 초안 발표 * í•™ìˆ ê³„ì—ì„œë„ ì‚°ì—…ê³„ì—ì„œë„ ë¹ ë¥´ê²Œ 주류로 성장 * ì§€ê¸ˆì€ Common Lisp ë•Œë¬¸ì— Scheme ë¹¼ê³ ê±°ì§„ 다 죽었지ë * ë§Žì€ í”„ë¡œê·¸ëž˜ë° ì•„ì´ë””ì–´ê°€ 리스프ì—서 ì¶œë°œí• ê²ƒ * ì¸í„°í”„리터 함수와 ì»´íŒŒì¼ í•¨ìˆ˜ì˜ ê²°í•© * 함수 재귀 호출 * 소스 수준 ì¶”ì & 디버깅 * 문법 지향 편집기 * ì˜¤ëŠ˜ë‚ ì˜ ë¦¬ìŠ¤í”„ëŠ” 함수형, ê°ì²´ì§€í–¥, ë³‘ë ¬ í”„ë¡œê·¸ëž˜ë° ì—°êµ¬ì˜ ì„ ë‘ ì£¼ìž == 2장. 리스트 == === 2장 요약 === * Lisp는 List Processorë¼ëŠ” 뜻 * 리스트는 가장 다재다능한(versatile) 타입ì´ë‹¤ * ì§‘í•©, í…Œì´ë¸”, 그래프, ì˜ì–´ 문장 등 ëë“ ì§€ 표현 가능 * í•¨ìˆ˜ë„ ë¦¬ìŠ¤íŠ¸ë¡œ 표현 가능 * ëª¨ë“ ë¦¬ìŠ¤íŠ¸ëŠ” ë‘ ê°€ì§€ 형태를 가진다 * printed representation * ì‚¬ëžŒì´ í‚¤ë³´ë“œë¡œ 쓰기 편한 í˜•ì‹ * internal representation * ì‹¤ì œë¡œ ë©”ëª¨ë¦¬ì— ê±°ì£¼í•˜ëŠ” í˜•ì‹ * ë¦¬ìŠ¤íŠ¸ì˜ ì˜ˆ: {{{(RED GREEN BLUE)}}}, {{{(AARDVARK)}}}, {{{(2 3 5 7 11 13 17)}}} * 메모리ì—ì„œì˜ ì‹¤ì œ 형태: ì…€(cell)마다 ì›ì†Œë¥¼ 가리키는 í¬ì¸í„°, ë‹¤ìŒ ì…€ì„ ê°€ë¦¬í‚¤ëŠ” í¬ì¸í„°ë¥¼ 가진다 * 마지막 ì…€ì€ NILì„ ê°€ë¦¬í‚¨ë‹¤ * attachment:Figure_2.1.png * í¬ì¸í„°ëŠ” 대개 4ë°”ì´íЏì´ë¯€ë¡œ ì…€ì€ 8ë°”ì´íЏ * 중첩 리스트 * {{{((BLUE SKY) (GREEN GRASS) (BROWN EARTH))}}} * attachment:Figure_2.2.png * ë¦¬ìŠ¤íŠ¸ì˜ ê¸¸ì´: ì›ì‹œ 함수 LENGTH를 ì´ìš© * 빈 리스트는 NIL로 표현 * 사실 NILì€ ()다. NILê³¼ 빈 리스트는 ë™ì¹˜ * NILì€ ì‹¬ë³¼ì´ìž ë¦¬ìŠ¤íŠ¸ì¸ ìœ ì¼í•œ 존재 * ë¦¬ìŠ¤íŠ¸ì˜ ì›ì†Œ 얻기 * FIRST, SECOND, THIRD 함수: 첫 번째, ë‘ ë²ˆì§¸, 세 번째 ì›ì†Œ * REST 함수: 첫 번째를 ì œì™¸í•œ 나머지 리스트 * FIRST는 CAR와 ê°™ê³ REST는 CDRê³¼ 같다. * CAR, CDRì´ë¼ëŠ” ì´ë¦„ì€ ë¦¬ìŠ¤í”„ê°€ 처ìŒì— íŠ¸ëžœì§€ìŠ¤í„°ë„ ì—†ì–´ì„œ 진공관 쓰는 컴퓨터ì—서 ìž‘ë™í• 때 ì“´ ë§ * CAR: Contents of Address portion of Register * CDR: Contents of Decrement portion of Register (''ì¹´ìš°ë”cou-der''ë¼ê³ ë°œìŒ) * 요즘 컴퓨터ì—는 ë§žì§€ 않지만 ì•„ì§ë„ 쓴단다 * CADR: CDR 다ìŒì— CAR (kae-derë¼ê³ ë°œìŒ) * CDAR: CAR 다ìŒì— CDR (cou-dar) * CADDR: CDR 다ìŒì— CDR 다ìŒì— CAR (ka-dhi-der) * ì´ê²Œ ë야 ã…¡ã…¡ * attachment:Figure_2.3.png * CAR와 CDRì— NILì„ ìž…ë ¥í•˜ë©´ NILì´ ì¶œë ¥ëœë‹¤ * ì—러가 아니구요??? * ì´ê²Œ ë” ì¢‹ëŒ€ * 리스트 ìƒì„± * CONS는 한 ë°ì´í„°ì™€ 리스트를 받아서 ê·¸ ë°ì´í„°ë¥¼ 첫 번째 ì›ì†Œë¡œ ë¼ì›Œë„£ì€ 리스트를 반환한다 * x = CONS of (CAR of x) and (CDR of x) * LIST는 ìž„ì˜ ê°œìˆ˜ì˜ ì›ì†Œë¥¼ 받아 ê·¸ê²ƒë“¤ì˜ ë¦¬ìŠ¤íŠ¸ë¥¼ ìƒì„±í•œë‹¤ * 리스트 ìˆ ì–´ì‹ * LISTP: ìž…ë ¥ì´ ë¦¬ìŠ¤íŠ¸ì¸ê°€? * CONSP: ìž…ë ¥ì´ cons cellì¸ê°€? * LISTP와 비슷하지만, NILì€ ë¦¬ìŠ¤íŠ¸ì¸ ë°˜ë©´ cons cellì´ ì•„ë‹ˆë‹¤ * ATOM: ìž…ë ¥ì´ cons cellì´ ì•„ë‹Œê°€? (CONSPì˜ ë¶€ì •) * NULL: ìž…ë ¥ì´ NILì´ë©´ T 반환. NOTê³¼ ë™ì¹˜. * 논리 ì—°ì‚°ì—는 NOTì„, 리스트 ì—°ì‚°ì—는 NULLì„ ì‚¬ìš©í•˜ëŠ” 관례가 있다 === 2장 ê³ ê¸‰ ì£¼ì œ === * 리스트를 ì´ìš©í•œ 1진법 ì‚°ìˆ * 0 = NIL, (X) = 1, (X X) = 2, (X X X) = 3... * REST는 1 빼기. 단 0 빼기 1ì€ 0 * LENGTH는 ì‹¤ì œ 숫ìžë¡œ 변환 * ì´ê±¸ ì–´ë”° ì¨ë¨¹ì£ * 진리스트(proper list)는 NIL로 ë나는 리스트 * NIL로 안 ë나는 리스트는? dotted list * A와 Bì˜ CONS : {{{(A . B)}}} <- dotted pair * LIST는 진리스트만 ìƒì„± 가능. CONS는 Dotted list를 만들 수 있다 * 순환 리스트(circular list)ë„ ìžˆë‹¤ * ì›ì†Œ A, B, Cê°€ ìžˆëŠ”ë° C를 í¬í•¨í•˜ëŠ” cellì´ ë‹¤ì‹œ A를 í¬í•¨í•˜ëŠ” cellì„ ê°€ë¦¬í‚¤ë©´? * sharp-equal notation: {{{#1=(A B C . #1#)}}} ë¼ê³ 표기한다 * (A B C . D)ì˜ LENGTH는 4ê°€ ì•„ë‹ˆë¼ 3 * 순환 ë¦¬ìŠ¤íŠ¸ì˜ LENGTH는 무한 루프 í•˜ë£¨ì— í•œ 챕터씩 ì½ì„ë ¤ê³ í–ˆëŠ”ë° ì´ìƒí•œ ê±° 코딩하다가 못 했네 ã…¡ã…¡ 3ìž¥ì€ ë‚´ì¼ == 3장 EVAL 표기 == === 3장 요약 === * 함수를 그림으로 그리지 ë§ê³ 리스트로 í‘œí˜„í•˜ìž * 리스프ì—서 함수는 ë°ì´í„°ë‹¤ * EVAL 표기를 ì •ë³µí–ˆìœ¼ë©´ 리스프를 통해 컴퓨터와 대화하는 ë° í•„ìš”í•œ ê±´ 대부분 알게 ëœ ì…ˆ * EVAL 함수는 ë¦¬ìŠ¤í”„ì˜ í•µì‹¬ì´ë‹¤ * 리스프 '''표현ì‹'''ì„ í‰ê°€í•´ì„œ ê²°ê³¼ê°’ì„ ë‚´ë†“ëŠ”ë‹¤ * 함수 ë’¤ì— ìž…ë ¥ê°’ë“¤ì´ ë”°ë¼ì˜¤ëŠ” í˜•ì‹ * í‘œí˜„ì‹ {{{(+ 2 3)}}}는 5로 í‰ê°€ëœë‹¤ * {{{(+ 1 6) => 7}}} * {{{(oddp (+ 1 6)) => t}}} * {{{(* 3 (+ 1 6)) => 21}}} * {{{(/ (* 2 11) (+ 1 6)) => 22/7}}} * EVALì˜ ë™ìž‘ì„ ì •ì˜í•˜ëŠ” í‰ê°€ 규칙들 * 숫ìží˜•, T, NILì€ ê·¸ ìžì‹ 으로 í‰ê°€ëœë‹¤ * ë¦¬ìŠ¤íŠ¸ì˜ ì²« ì›ì†ŒëŠ” 함수, 나머지는 ê·¸ í•¨ìˆ˜ì— ì „ë‹¬ë˜ëŠ” ì•„ì§ í‰ê°€ë˜ì§€ ì•Šì€ ì¸ìžë‹¤ * ì¸ìžë“¤ì€ 왼쪽ì—서 오른쪽으로 í‰ê°€ëœë‹¤ * ì‹¬ë³¼ì€ ê·¸ ì‹¬ë³¼ì´ ê°€ë¦¬í‚¤ëŠ” ë³€ìˆ˜ì˜ ê°’ìœ¼ë¡œ í‰ê°€ëœë‹¤ * {{{(ODDP (+ 1 6))}}}ì˜ evaltrace diagram(í‰ê°€ì¶”ì ë„표?) attachment:Figure_3.1_evaltrace_diagram.png * EVAL 표기로 함수 ì •ì˜í•˜ê¸° * ë‘ ìˆ˜ì˜ í‰ê· ì„ êµ¬í•˜ëŠ” AVERAGE 함수: {{{(defun average (x y) (/ (+ x y) 2.0))}}} * defunì€ '''매í¬ë¡œ 함수'''로서 ê·¸ ì¸ìžë¥¼ í‰ê°€í•˜ì§€ 않는다 * defunì€ í•¨ìˆ˜ë¥¼ ì •ì˜í•˜ê¸° 위한 함수다 * 첫 번째 ì¸ìžëŠ” 함수 ì´ë¦„ * ë‘ ë²ˆì§¸ ì¸ìžëŠ” ì¸ìž ëª©ë¡ * 세 번째 ì¸ìžëŠ” 함수 몸체 * ì´ì œ (AVERAGE 6 8) 처럼 쓸 수 있다 * T와 NILì„ ì œì™¸í•œ ê±°ì˜ ëª¨ë“ ì‹¬ë³¼ì„ ì¸ìž ì´ë¦„으로 쓸 수 있다 * 변수: ë°ì´í„°ê°€ ì €ìž¥ë˜ëŠ” 공간 * {{{(defun average (x y) (/ (+ x y) 2.0))}}}ì—서 x와 yê°€ 변수 * 변수는 ì‹¬ë³¼ì´ ì•„ë‹ˆë‹¤ * ì‹¬ë³¼ì„ ê°€ì§€ê³ ë³€ìˆ˜ì— ì´ë¦„ì„ ë¶™ì¸ ê²ƒ * 리스프 í”„ë¡œê·¸ëž˜ë¨¸ë“¤ì´ "ì–´ë–¤ 변수가 ì–´ë–¤ 값으로 í‰ê°€ëœë‹¤"ê³ ë§í• 때 * ì‚¬ì‹¤ì€ "ì‹¬ë³¼ì´ ê·¸ ì‹¬ë³¼ì´ ê°€ë¦¬í‚¤ëŠ” ë³€ìˆ˜ì˜ ê°’ìœ¼ë¡œ í‰ê°€ëœë‹¤"ê³ ë§í•˜ëŠ” 것 * average란 ì‹¬ë³¼ì„ ê°€ì§€ê³ í•¨ìˆ˜ì— ì´ë¦„ì„ ë¶™ì¸ ê²ƒ * x, y 변수는 average 함수 안ì—서만 사용 가능 * 머 í”히 ë§í•˜ëŠ” 스코프 ê°œë…ì´ê² ì§€ * ì „ì— ë³€ìˆ˜: ì–´ë–¤ í•¨ìˆ˜ì™€ë„ ì—®ì´ì§€ ì•Šì€ ë³€ìˆ˜ * 예: PI = 3.14159 * ê°’ì´ í• ë‹¹ë˜ì§€ ì•Šì€ ë³€ìˆ˜ì˜ ê°’ì„ ìš”êµ¬í•˜ë©´ "ë¯¸í• ë‹¹ 변수 오류(unassigned variable error)"ê°€ ë°œìƒí•œë‹¤ * "unbound variable error"ë¼ê³ 하는 ì‚¬ëžŒë“¤ë„ ìžˆì§€ë§Œ ì´ê±´ ì—사ì ì¸ ìš©ì–´ë¼ Common Lispì— ë§žì§€ ì•ŠìŒ * 그럼 CAR니 CDRì€ ì™œ 쓰는 ê±´ë° ã…¡ã…¡ * Common Lispì—는 EGGPLANTë¼ëŠ” 내장 변수가 없으며 EGGPLANT ì‹¬ë³¼ì„ í‰ê°€í•˜ë©´ 오류가 ë°œìƒí•œë‹¤ * {{{{color:#ff0000} ì‹¬ë³¼ì´ ì™œ ìžê¾¸ 문단ì—ì„ ëŒ€ë¬¸ìžë¡œ 나왔다 코드ì—ì„ ì†Œë¬¸ìžë¡œ 나왔다 하는 거야 ëê°€ 맞는 거야}}} * 심볼과 리스트를 ë°ì´í„°ë¡œ 활용하기 * 심볼 KIRKê³¼ SPOCKì´ ê°™ì€ ì§€ 비êµí•˜ê³ ì‹¶ì–´ìš” * (equal kirk spock) ë¼ê³ ì“°ë©´ ë˜ì§€ * 아니, KIRKì´ë¼ëŠ” 심볼과 SPOCKì´ë¼ëŠ” 심볼 ìžì²´ë¥¼ 비êµí•˜ê³ 싶다니까요 * ì•„ã…‹ {{{(equal ’kirk ’spock)}}} 따옴표를 붙여 * T와 NILì€ ê·¸ ìžì‹ 으로 í‰ê°€ë˜ê¸° ë•Œë¬¸ì— ë”°ì˜´í‘œë¥¼ ë¶™ì¼ í•„ìš”ê°€ 없다 * Quoted Objectì˜ í‰ê°€ 규칙: 따옴표를 ë—€ ìžì‹ 으로 í‰ê°€ëœë‹¤ * (third (my aunt mary)) => Error! MY undefined function. (third ’(my aunt mary)) => mary * {{{{color:#ff0000}그러니까 따옴표는 í‰ê°€ë˜ëŠ” 걸 막는다는 뜻ì¸ê°€}}} * 리스트를 만드는 세 가지 방법 * ’(foo bar baz) => (foo bar baz) * (list ’foo ’bar ’baz) Þ (foo bar baz) * (cons ’foo ’(bar baz)) Þ (foo bar baz) * ì´ëŸ° ê±´ 오류 * (list foo bar baz) => Error! FOO unassigned variable. * (foo bar baz) => Error! FOO undefined function. * (’foo ’bar ’baz) => Error! ’FOO undefined function. * 슬슬 멘붕온다 ê²ë‚˜ 헷갈린다 * READ-EVAL-PRINT LOOP(REPL) * 그냥 ì½˜ì†”ì— ë 치면 ì½ê³ í‰ê°€í•˜ê³ ì¶œë ¥ ë§Žì´ í•˜ë˜ ê±°ë„¤ * 리스프 í”„ë¡œê·¸ëž˜ë° í™˜ê²½ * 코드 ì—디터: 괄호 오류 잘 찾아주는 ê±° * ë”± ë´ë„ 괄호 ë•œì— ì˜¤ë¥˜ ê²ë‚˜ ìŸì•„지게 ìƒê¸¸ 언어네 === 3장 ê³ ê¸‰ ì£¼ì œ === * ì¸ìž 없는 함수 * 85ì— 97ì„ ê³±í•˜ëŠ” 함수를 ì •ì˜í•˜ê³ ì‹¶ì€ë°ìš” * {{{(defun test () (* 85 97))}}} * 특수 함수 QUOTE * QUOTEì˜ ì¸ìžëŠ” í‰ê°€ë˜ì§€ 않는다 * (quote foo) => foo * 따옴표랑 ê°™ì€ ê±° ì•„ëƒ * (cons ’up ’(down sideways)) * (cons (quote up) (quote (down sideways))) * ì‹¬ë³¼ì˜ ë‚´ë¶€ 구조 * CONS ì‹¬ë³¼ì€ ìžì‹ ì˜ function cellì— í•¨ìˆ˜ í¬ì¸í„°ë¥¼ 가진다 attachment:Figure_3.2_Symbol_Internal_Structure.png * (EQUAL 3 5)를 cons cell 연쇄로 표현 attachment:Figure_3.3_EQUAL_cons_cell_chain.png * ë” ìžì„¸ížˆ 표현하면? attachment:Figure_3.4_EQUAL_cons_cell_chain_detailed.png * 내장 함수 SYMBOL-NAMEê³¼ SYMBOL-FUNCTION * 람다 표기 * 프린스턴 ëŒ€í•™ì˜ ìˆ˜í•™ êµìˆ˜ 처치가 창안 * ë¦¬ìŠ¤í”„ì˜ ì›ìž‘ìž ì¡´ 매카시는 ì²˜ì¹˜ì˜ í•™ìƒì´ì—¬ë”° * x + 3ì„ ëžŒë‹¤ë¡œ 표현하면 {{{(lambda (x) (+ 3 x))}}} * DEFUNì´ëž‘ 비슷한ë°? * LAMBDA는 함수가 아니다 --ëë¼êµ¬ìš” * EVALì´ íŠ¹ë³„ 취급하는 마커,,marker,, * DEFUNì˜ ì—í• ì€ ì´ë¦„ê³¼ 함수를 엮어주는 것 * HALFë¼ëŠ” 새로운 함수를 ì •ì˜í• 때 * 문ìžì—´ "HALF"는 ì‹¬ë³¼ì˜ ì´ë¦„ * 심볼 HALF는 í•¨ìˆ˜ì˜ ì´ë¦„ attachment:Figure_3.5_LAMBDA_STRUCTURE.png * ì›ì‹œ 함수 EVAL * (eval ’(+ 2 2)) => 4 * ’(list ’* 9 6)) => (list ’* 9 6) (eval ’(list ’* 9 6)) => (* 9 6) (eval (eval ’(list ’* 9 6))) => 54 * ì›ì‹œ 함수 APPLY * 함수와 ì¸ìž 목ë¡ì„ ì¸ìžë¡œ 취해서 * ê·¸ ì¸ìž 목ë¡ì„ ê°€ì§€ê³ í•¨ìˆ˜ë¥¼ 호출한다 * (apply #’+ ’(2 3)) => 5 * 함수를 다른 í•¨ìˆ˜ì˜ ì¸ìžë¡œ 넘길 때는 'ê°€ ì•„ë‹ˆë¼ #'를 ì¨ì•¼ 한다 * 7장ì—서 ì•Œë ¤ì¤„ê²Œ == 4장. 조건문 == === 4장 요약 === * ì¡°ê±´ë¬¸ì€ ëª¨ë‘ íŠ¹ìˆ˜ 함수 ë˜ëŠ” 매í¬ë¡œì´ê¸° ë•Œë¬¸ì— ì¸ìžë“¤ì´ ìžë™ í‰ê°€ë˜ì§€ 않는다 * 3장ì—서 본 DEFUN, QUOTE í•¨ìˆ˜ë„ ê·¸ëŸ° ì„±ì§ˆì„ ê°€ì§„ë‹¤ * +, CONS ê°™ì€ í•¨ìˆ˜ëŠ” í•ìƒ ì¸ìžë¥¼ í‰ê°€í•œë‹¤ * 특수 함수 IF * 문법: {{{(if (test) (true-part) (false-part))}}} * ì ˆëŒ“ê°’ 함수: {{{(defun my-abs (x) (if (< x 0) (- x) x))}}} * 세 번째 ì¸ìž 즉 false-part는 ìƒëžµí• 수 있다. ì´ ê²½ìš° NIL로 처리ëœë‹¤. * COND 매í¬ë¡œ * 간략한 형태 (COND (test-1 consequent-1) (test-2 consequent-2) (test-3 consequent-3) .... (test-n consequent-n)) * test-1ì´ ì°¸ì´ë©´ consequent-1로 í‰ê°€ë¨ * 아니면 test-2를 확ì¸í•´ë³´ê³ ì°¸ì´ë©´ consequent-2로 í‰ê°€ë¨ * ... ê·¸ë ‡ê²Œ test-n까지 반복 * test-n까지 ê±°ì§“ì´ë©´ NIL로 í‰ê°€ë¨ * (defun compare (x y) (cond ((equal x y) ’numbers-are-the-same) ((< x y) ’first-is-smaller) ((> x y) ’first-is-bigger))) * test-nì— T를 넣으면 consequent-nì´ ë¬´ì¡°ê±´ 실행ë¨ì„ 보장 * (IF test true-part false-part) = (COND (test true-part) (T false-part)) * AND 매í¬ë¡œì™€ OR 매í¬ë¡œ * (and clause-1 clause-2 ... clause-n) * clause-1ì´ NILì´ë©´ NIL로 종료. 아니면 ê³„ì† * clause-2ì´ NILì´ë©´ NIL로 종료. 아니면 계ì†... * clause-nì´ NILì´ë©´ NIL로 종료. 아니면 clause-nì˜ ê°’ 반환 * (and 1 2 3 4 5) => 5 * (or clause-1 clause-2 ... clause-n) * clause-1ì´ NILì´ ì•„ë‹ˆë©´ clause-1ì˜ ê°’ 반환. NILì´ë©´ ê³„ì† * clause-2ì´ NILì´ ì•„ë‹ˆë©´ clause-2ì˜ ê°’ 반환. NILì´ë©´ ê³„ì† * ... * clause-nì´ NILì´ ì•„ë‹ˆë©´ clause-nì˜ ê°’ 반환. NILì´ë©´ NIL 반환 * (or ’george ’fred ’harry) => george * (or nil ’fred ’harry) => fred * '''clause-xì—서 í‰ê°€ê°€ ë나면 ê·¸ ë’¤ì˜ clauseë“¤ì€ í‰ê°€ë˜ì§€ 않는다''' * (defun posnump (x) (and (numberp x) (plusp x))) * (numberp x)ê°€ NILì´ë©´ plusp는 실행ë˜ì§€ 않는다 * 만약 부수효과가 있는 코드ë¼ë©´... ì‹ ì¤‘í•´ì•¼ í• ê²ƒ * 리스프ì—서 부수효과를 어떻게 ì¼ìœ¼í‚¤ëŠ”ì§€ ì•„ì§ì€ 모르지만 * ì°¸ê³ ë¡œ PLUSP는 숫ìžê°€ 양수ì¸ì§€ 확ì¸í•˜ëŠ” ìˆ ì–´ì‹ * 리스프 ë„구: STEP * 리스프 표현ì‹ì˜ í‰ê°€ ê³¼ì •ì„ ë‹¨ê³„ë³„ë¡œ 보여준다. 디버깅용 === 4장 ê³ ê¸‰ ì£¼ì œ === * 불리언 함수 * (defun logical-and (x y) (and x y t)) * (logical-and ’tweet ’woof) => t * (and ’tweet ’woof) => woof * 드 ëª¨ë¥´ê°•ì˜ ë²•ì¹™ * (and x y) = (not (or (not x) (not y))) * (or x y) = (not (and (not x) (not y))) * 난 법칙ì´ë¼ê³ ë°°ì› ëŠ”ë° ì˜ì–´ë¡œëŠ” theoremì´ë„¤... theoremì€ ì •ë¦¬ ì•„ë‹Œê° * T, NILì— ëŒ€í•œ 논리 ì—°ì‚°ì¼ ë•Œë§Œ 성립 * (not (not fred))는 fredê°€ ì•„ë‹ˆë¼ T다 짧네 ã…‹ ë‚´ì¼ 5장 == 5장. 변수와 부수효과 == === 5장 요약 ===