Development Tip

Lisp / Scheme에서 '(아포스트로피)는 무엇입니까?

yourdevel 2020. 12. 11. 20:22
반응형

Lisp / Scheme에서 '(아포스트로피)는 무엇입니까?


나는 스스로 계획을 가르치는 1 시간 1 일에 있습니다. 말할 필요도없이 나는 아무것도 이해하지 못한다. 그래서 저는 The Little Schemer를 읽고 이것을 사용하고 있습니다.

http://sisc-scheme.org/sisc-online.php

통역사로.

'예를 들어 사용해야합니다 .

(atom? 'turkey)

"정의되지 않은 변수"오류를 방지합니다. ',이 책에 따르면, 커먼 리스프 것입니다.

두 가지 질문이 있습니다.

  1. 위에서 언급 한 통역사가 좋은가요? 다른 것을 추천 할 수 있습니까? The Little Schemer 와 잘 어울리는 제품이 필요합니다 .

  2. 무엇입니까 '?


양식 'foo은 단순히 특수 양식을 입력하는 더 빠른 방법입니다.

(quote foo)

즉, "foo라는 이름을 평가하지 말고 그 값으로 바꾸지 마십시오. 진짜로 foo라는 이름을 의미합니다."

나는 SISC가 TLS에서 연습을 탐색하기에 완벽하다고 생각합니다.


Scheme의 기본 평가 규칙을 이해해야합니다.

첫째 :

(atom? 'turkey)

목록은 함수 응용 프로그램이므로 atom?함수로 평가됩니다. 'turkey에 대한 짧은 표기법입니다 (quote turkey). 평가 (quote turkey)하면 기호가 제공 turkey됩니다.

다음으로 함수가 기호에 적용되고 turkey반환 값이 계산됩니다.

둘째

(atom? turkey)

다시 우리는 함수 애플리케이션을 가지고 있고 함수로 atom?평가됩니다. 이번에 turkey는 변수입니다. 평가 turkey는 그것에 묶여있는 가치를 제공합니다.

그러면 함수가 변수 값에 적용됩니다 turkey.

요약

turkey값으로 평가되는 변수입니다. 'turkeyis (quote turkey), 기호로 평가됩니다 turkey.

Scheme은 s- 표현식을 재사용하고 s- 표현식으로 프로그램을 구축합니다. 이로 인해 언젠가 turkey는 변수가되어야하고 때로는 심볼이되어야한다는 문제가 발생합니다 . 이것은 초보자에게는 약간 혼란 스럽습니다. 시간이 지나면 그 뒤에있는 힘을 보게 될 것입니다.


SISC는 좋지만 더 가벼운 온라인 Scheme 실행기는 http://codepad.org 입니다. 대화식이 아니라는 점에서 실제로 REPL은 아니지만 꽤 가깝습니다. 제출 한 코드 는 브라우저 애플릿을 사용하는 대신 서버에서 실행됩니다 . 또한 짧은 URL로 실행중인 코드를 공유 할 수 있습니다.

코드 패드 정보 페이지에 "MzScheme v372 [cgc]"가 사용됩니다.

나는 모든 종류의 빠른 스 니펫 테스트에 코드 패드를 사용합니다 (SO 답변을위한 코드 샘플 테스트 포함!).

따옴표 구문의 경우 다음과 같은 코드를 사용하여 차이점을 확인할 수 있습니다.

(let ((x 5))
  (display x) (newline)
  (display 'x) (newline))

다음이 표시됩니다.

5
엑스

첫 번째 경우 x는 평가되고 display5를 인쇄하는에 전달됩니다 . 두 번째 경우에는 기호 x (문자열과 동일하지 않음)가 전달되어 display기호의 이름을 인쇄합니다.


속기에 대해 (quote ...), '데이터에 코드를집니다.

stuff는 기호입니다. 즉, 변수 이름이나 함수 이름 등이 될
'stuff수 있습니다. 기호 자체가 "물건"입니다.

(dostuff "on" those 4 :parameters)평가되면 dostuff문자열, 변수 내용, 숫자 및 키워드의 네 가지 매개 변수로 함수 실행합니다 .
'(dostuff "on" those 4 :parameters)평가 될 때 위의 코드를 반환하고, 평가할 때 dostuff네 개의 매개 변수를 사용하여 차례로 함수 실행합니다 .

예를 들어 : 실행 '''somecode, 그것은 반환합니다 ''somecode. 실행 ''somecode하면 'somecode. 실행 'somecode하면 somecode. 실행 somecode, 그리고 ... 음 ... somecode실행됩니다.

그것은 '의 반대와 약간 비슷 하다고 말할 수 있습니다 (eval..).

(eval (eval (eval '''(print "hello"))))"Hello"를 인쇄합니다.
(eval (eval (eval ''''(print "hello")))- 더 통지 한 '후, eval- 아무 것도 인쇄되지 것입니다,하지만 코드 반환 (print "hello")자체!

lispers는 반환 된 코드 (때로는 손으로 쓴 코드)를 "code"대신 "list"라고 부르는 경향이 있다는 점을 제외하고는 조금 더 깊이 파고 들면 분명하게 피를 흘릴 것입니다. 행운을 빕니다 :)


  1. IDE, 디버거 및 많은 라이브러리가있는 PLT Scheme 과 같은 더 나은 환경으로 이동하는 것이 좋습니다 . 앞으로 나아가고 더 큰 프로그램을 작성하기 시작하면 이러한 프로그램이 필요합니다.

  2. 작은 따옴표 문자는 "인용문"표현식에 대한 구문 설탕이므로 '터키는 (인용문 칠면조)와 동일합니다. 기본적으로 "인용문"이하는 일은 체계 평가기를 끄는 것입니다. 즉, "quote"는 그대로 표현을 반환합니다. "인용문"이 없으면 Scheme은 현재 환경에서 "터키"를 평가하려고합니다. 이것은 Common Lisp가 아니라 Lisp입니다. Common Lisp와 Scheme은 Lisp의 두 가지 방언입니다. "인용문"의 사용은 모든 Lisp 튜토리얼 / 책에 설명되어 있습니다. 또한 이 질문에 대한 답변을 참조하십시오 .


The single-quote character is shorthand way of saying (quote foo) where quote is the form to return just foo without evaluating it.

One thing to really remember in Scheme or any Lisp for that matter is that everything is evaluated by default. So, in cases where you don't want to evaluate you need a way to sat this.

Quoting something does just this and the single-quote is just requires less typing and leads to less verbose code.


If you looking for a best IDE for scheme then go for Dr Racket. But when start Dr Racket first line should be #lang scheme since Dr Racket has many language we have explicitly mention which language we are going to use.

When we want to pass an argument itself instead of passing the value of the argument then we use quote. It is mostly related to the procedure passing during using lists, pairs and atoms which are not available in C programming Language ( most people start programming using C programming, Hence we get confused) This is code in Scheme programming language which is a dialect of lisp and I guess you can understand this code.

(define atom?              ; defining a procedure atom?
(lambda (x)              ; which as one argument x
(and (not (null? x)) (not(pair? x) )))) ; checks if the argument is atom or not
(atom? '(a b c)) ; since it is a list it is false #f

The last line (atom? 'abc) is passing abc as it is to the procedure to check if abc is an atom or not, but when you pass(atom? abc) then it checks for the value of abc and passses the value to it. Since, we haven't provided any value to it

참고URL : https://stackoverflow.com/questions/1539144/what-is-apostrophe-in-lisp-scheme

반응형