로그인하고 있지 않습니다. 편집하면 당신의 IP 주소가 공개적으로 기록됩니다. 계정을 만들고 로그인하면 편집 시 사용자 이름만 보이며, 위키 이용에 여러 가지 편의가 주어집니다.스팸 방지 검사입니다. 이것을 입력하지 마세요!== 특징 == === Atom === 초기 Lisp에서 Datatype 은 크게 Atom 과 리스트로 구분되었다. Atom은 상수나 심볼을 뜻하고, 리스트는 이러한 Atom 또는 다른 리스트를 원소로 포함하며 유한한 길이를 가진다. 여기서 두드러지는 특징은, Atom의 값이 불변(immutable)이라는 점이다. 이후 여러 Lisp 사투리가 등장하고 분화되는 과정에서 Atom의 Immutable 특성이 사라지는 경우도 많이 발생했으며, 이는 아마도 실용적인 목적에 의해 이렇게 된 것이 아닐까라고 추측한다. === List === Lisp에는 기본적으로 개수를 셀 수 있고 변경 가능한 리스트가 기본 자료형으로 주어진다. 리스트의 원소는 Atom과 함께 다른 리스트 또한 원소가 될 수 있다. === 문법 === Lisp 은 표현식 지향 언어이다. 문장이나 식, 데이터의 구분 없이 모든 것은 리스트와 그 안에 내용을 채우는 표현식으로 간주된다. 표현식이 평가(Evaluate)될 때 실제 코드가 실행되며, 평가 후 값이 나온다. 값 또한 코드와 데이터 구분 없이 아무것이나 올 수 있다. 즉 코드 실행의 결과가 값 뿐만이 아닌 함수도 될 수 있다. 또한 기본적으로 전위 표기법(또는 폴란드 표기법, Polsih Notation)을 사용한다. 즉, 통상 프로그래밍 언어에서 1 + 2를 수행하는 코드를 작성하면 다음과 같이 되는데 <syntaxhighlight lang=Lisp> 1 + 2 </syntaxhighlight> Lisp에서는 다음과 같이 + 이 제일 앞에 나오고 숫자가 뒤에 표기되는 형식을 취한다. 이는 + 라는 함수에 숫자 1과 2인 인자를 주어 호출함을 뜻한다. <syntaxhighlight lang=Lisp> (+ 1 2) </syntaxhighlight> 이와 같이 괄호와 Atom을 사용하여 표기하는 방법을 Lisp에서는 S-Expression(Symbolic Expression)이라고 부른다. 이것 때문에 Lisp의 소스 코드는 중첩괄호의 연속이 된다. M-Expression(Meta Expression)이라는 것이 초기 Lisp 에 존재했는데, 이것은 일반적인 절차형 언어에서 함수를 호출하는 구문을 떠올리면 된다. 나중에 이것을 동등한 S-Expression으로 변환하고, 이를 평가(Evaulate)하면 결국 코드를 실행하는 것과 동일하다는 것이 밝혀졌고, 이후에 등장한 Lisp 사투리에서는 찾아볼 수 없게 되었다. === Homoiconicity === "Code is data, data is code." 로 설명되는 바로 그것이다. Lisp에서는 코드도 일종의 데이터이다. 이는 S-Expression 에 의해 Lisp에서 모든 것은 List 로 표현되기 때문이다. 위의 List 단락에서 예로 들었던 (+ 1 2) 라는 List를 입력하면 코드로 해석이 되어(평가, Evlauation) + 함수에 1 과 2를 인자로 넘겨주고, 1 + 2 가 연산되어 3 을 출력하며, 평가하지 말고 그대로 리스트로 저장하는 ' (quote)를 붙여서 '(+ 1 2)를 입력하면 첫 번째 원소가 + 이고 두 번째 원소가 1, 세 번째 원소가 2 인 리스트로 인식된다. 즉, 이 리스트를 코드로 보고 그대로 실행할 수도 있고, 실행하지 않고 다른 함수에 리스트형 데이터로 넘겨주는 것도 가능하다.. === Lambda Function === 소위 익명 함수를 뜻하는 Lambda Function을 정의하여 사용할 수 있다. 이 자체만으로는 "표현 가능"하다는 것 외에 의미가 없지만 Lisp 계열 언어에서 주어지는 기본 함수나 API 들이 이를 적극 사용하여 간결하면서도 동시에 편리하게 코딩을 할 수 있도록 도와주는 강력한 요소이다. 예를 들어 [[Java]] 7 이하의 API에서 지원하는 컬렉션 정렬 기능을 사용하려면 Comparator 인터페이스를 구현하여 compare 메서드를 구현해야 한다. 즉, 고작 이거 하나 하려고 클래스를 하나 더 만들어야 한다. 하지만 Lisp에서는 그냥 람다 함수로 대소비교를 할 수 있는 익명 함수를 정의해서 파라미터로 넘기면 끝이다. 자바도 8부터 이러한 람다 표현식을 수용하여 보다 편리하게 코딩할 수 있게 되었다. === Macro === 문법의 추상화, [[메타 프로그래밍]]을 가능하게 해 주는 매크로(Macro)를 지원한다. 바로 이것에 의해 Lisp 은 다른 프로그래밍 언어 대비 새로운 패러다임을 쉽게 수용할 수 있다. 이 기능은 매우 쉽게 말해서 C언어의 #define과 유사하지만 훨씬 강력한 기능을 제공한다. C의 #define은 소스 코드의 전처리기에 의해 미리 정의된 내용을 소스 코드 수준에서 치환하는 데 그치지만, Lisp의 매크로는 모든 것을 리스트에 들어 있는 내용으로 치환하는 덕에, 실행 도중에 미리 정의된 프로그램으로 직접 치환된다. 즉, 매크로 자체가 입력되는 리스트의 내용을 미리 정의된 리스트의 내용으로 대체하는 매우 강력한 함수이다. 하지만 기능이 강력한 만큼 양날의 검 같은 존재가 바로 이 Macro 다. 나 혼자서만 작업하는 경우면 상관없으나 여러 사람이 작성하는 프로그램에서 사전에 충분한 협의 없이 만들어 쓰는 매크로는 프로그램 전체에 독이 될 가능성이 높다. 먼저 다른 개발자가 설명을 듣거나 해당 매크로의 소스코드를 완전히 이해하기 전에는 코드를 해독하거나 사용하기 힘들고, 여러 명이 공동 작업으로 프로그램을 작성한다는 자체가 프로그램의 덩치가 꽤 크다는 것을 뜻하기 때문에 충분한 사전검토나 협의 없이 만들어진 매크로는 안만드니 못하는 경우도 충분히 있을 수 있기 때문이다. 요약: 리브레 위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 3.0 라이선스로 배포됩니다(자세한 내용에 대해서는 리브레 위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요. 글이 직접 작성되었거나 호환되는 라이선스인지 확인해주세요. 리그베다 위키, 나무위키, 오리위키, 구스위키, 디시위키 및 CCL 미적용 사이트 등에서 글을 가져오실 때는 본인이 문서의 유일한 기여자여야 하고, 만약 본인이 문서의 유일한 기여자라는 증거가 없다면 그 문서는 불시에 삭제될 수 있습니다. 취소 편집 도움말 (새 창에서 열림) | () [] [[]] {{}} {{{}}} · <!-- --> · [[분류:]] · [[파일:]] · [[미디어:]] · #넘겨주기 [[]] · {{ㅊ|}} · <onlyinclude></onlyinclude> · <includeonly></includeonly> · <noinclude></noinclude> · <br /> · <ref></ref> · {{각주}} · {|class="wikitable" · |- · rowspan=""| · colspan=""| · |} {{lang|}} · {{llang||}} · {{인용문|}} · {{인용문2|}} · {{유튜브|}} · {{다음팟|}} · {{니코|}} · {{토막글}} {{삭제|}} · {{특정판삭제|}}(이유를 적지 않을 경우 기각될 가능성이 높습니다. 반드시 이유를 적어주세요.) {{#expr:}} · {{#if:}} · {{#ifeq:}} · {{#iferror:}} · {{#ifexist:}} · {{#switch:}} · {{#time:}} · {{#timel:}} · {{#titleparts:}} __NOTOC__ · __FORCETOC__ · __TOC__ · {{PAGENAME}} · {{SITENAME}} · {{localurl:}} · {{fullurl:}} · {{ns:}} –(대시) ‘’(작은따옴표) “”(큰따옴표) ·(가운뎃점) …(말줄임표) ‽(물음느낌표) 〈〉(홑화살괄호) 《》(겹화살괄호) ± − × ÷ ≈ ≠ ∓ ≤ ≥ ∞ ¬ ¹ ² ³ ⁿ ¼ ½ ¾ § € £ ₩ ¥ ¢ † ‡ • ← → ↔ ‰ °C µ(마이크로) Å °(도) ′(분) ″(초) Α α Β β Γ γ Δ δ Ε ε Ζ ζ Η η Θ θ Ι ι Κ κ Λ λ Μ μ(뮤) Ν ν Ξ ξ Ο ο Π π Ρ ρ Σ σ ς Τ τ Υ υ Φ φ Χ χ Ψ ψ Ω ω · Ά ά Έ έ Ή ή Ί ί Ό ό Ύ ύ Ώ ώ · Ϊ ϊ Ϋ ϋ · ΐ ΰ Æ æ Đ(D with stroke) đ Ð(eth) ð ı Ł ł Ø ø Œ œ ß Þ þ · Á á Ć ć É é Í í Ĺ ĺ Ḿ ḿ Ń ń Ó ó Ŕ ŕ Ś ś Ú ú Ý ý Ź ź · À à È è Ì ì Ǹ ǹ Ò ò Ù ù · İ Ż ż ·  â Ĉ ĉ Ê ê Ĝ ĝ Ĥ ĥ Î î Ĵ ĵ Ô ô Ŝ ŝ Û û · Ä ä Ë ë Ï ï Ö ö Ü ü Ÿ ÿ · ǘ ǜ ǚ ǖ · caron/háček: Ǎ ǎ Č č Ď ď Ě ě Ǐ ǐ Ľ ľ Ň ň Ǒ ǒ Ř ř Š š Ť ť Ǔ ǔ Ž ž · breve: Ă ă Ğ ğ Ŏ ŏ Ŭ ŭ · Ā ā Ē ē Ī ī Ō ō Ū ū · à ã Ñ ñ Õ õ · Å å Ů ů · Ą ą Ę ę · Ç ç Ş ş Ţ ţ · Ő ő Ű ű · Ș ș Ț ț