1) 새로운 변수 개념. Lisp에서 모든 변수는 사실상 포인터입니다. 값은 변수가 아닌 유형을 갖는 것이므로 변수를 할당하거나 바인딩하는 것은 포인터가 가리키는 것이 아니라 포인터를 복사하는 것을 의미합니다.
(defun print-twice (it)
(print it)
(print it))
'it'은 변수입니다. 모든 값에 바인딩 될 수 있습니다. 변수와 관련된 제한 및 유형이 없습니다. 함수를 호출하면 인수를 복사 할 필요가 없습니다. 변수는 포인터와 유사합니다. 변수에 바인딩 된 값에 액세스하는 방법이 있습니다. 메모리 를 예약 할 필요가 없습니다 . 함수를 호출 할 때 모든 크기와 유형의 모든 데이터 객체를 전달할 수 있습니다.
데이터 개체에는 '유형'이 있으며 모든 데이터 개체는 해당 '유형'에 대해 쿼리 할 수 있습니다.
(type-of "abc") -> STRING
2) 심볼 타입. 포인터를 비교하여 동등성을 테스트 할 수 있다는 점에서 기호는 문자열과 다릅니다.
심볼은 이름을 가진 데이터 객체입니다. 일반적으로 이름을 사용하여 객체를 찾을 수 있습니다.
|This is a Symbol|
this-is-also-a-symbol
(find-symbol "SIN") -> SIN
심볼은 실제 데이터 객체이므로 동일한 객체인지 테스트 할 수 있습니다.
(eq 'sin 'cos) -> NIL
(eq 'sin 'sin) -> T
이를 통해 예를 들어 기호가있는 문장을 작성할 수 있습니다.
(defvar *sentence* '(mary called tom to tell him the price of the book))
이제 문장에서 THE의 수를 셀 수 있습니다 :
(count 'the *sentence*) -> 2
공통 Lisp 기호에서 이름은 물론 값, 함수, 속성 목록 및 패키지도 가질 수 있습니다. 따라서 기호를 사용하여 변수 또는 함수의 이름을 지정할 수 있습니다. 속성 목록은 일반적으로 메타 데이터를 심볼에 추가하는 데 사용됩니다.
3) 심볼 트리를 사용하는 코드 표기법.
Lisp는 기본 데이터 구조를 사용하여 코드를 나타냅니다.
목록 (* 3 2)은 데이터와 코드가 될 수 있습니다.
(eval '(* 3 (+ 2 5))) -> 21
(length '(* 3 (+ 2 5))) -> 3
나무:
CL-USER 8 > (sdraw '(* 3 (+ 2 5)))
[*|*]--->[*|*]--->[*|*]--->NIL
| | |
v v v
* 3 [*|*]--->[*|*]--->[*|*]--->NIL
| | |
v v v
+ 2 5
4) 항상 사용 가능한 언어. 읽기 시간, 컴파일 시간 및 런타임은 실제로 구별되지 않습니다. 코드를 읽거나 컴파일하는 동안 코드를 컴파일 또는 실행하고, 컴파일하는 동안 코드를 읽거나 실행하며, 런타임에 코드를 읽거나 컴파일 할 수 있습니다.
Lisp는 텍스트에서 데이터와 코드를 읽기위한 READ,로드하기 위해 코드로드, 코드를 평가하기위한 EVAL, 코드를 컴파일하기위한 COMPILE 및 데이터와 코드를 텍스트에 쓰는 PRINT 기능을 제공합니다.
이 기능은 항상 사용 가능합니다. 그들은 멀리 가지 않습니다. 그들은 모든 프로그램의 일부가 될 수 있습니다. 즉, 모든 프로그램이 항상 코드를 읽거나로드하거나 평가하거나 인쇄 할 수 있습니다.
C 또는 Java와 같은 언어에서 어떻게 다른가요?
이러한 언어는 기호, 데이터 코드 또는 데이터 런타임 코드를 코드로 제공하지 않습니다. C의 데이터 개체는 일반적으로 형식이 지정되지 않습니다.
LISP 계열 언어 이외의 다른 언어에 이러한 구성이 있습니까?
많은 언어에는 이러한 기능 중 일부가 있습니다.
차이점:
Lisp에서 이러한 기능은 사용하기 쉽도록 언어로 설계되었습니다.