S- 표현 가독성


9

간단히 말해서 그것을 알지 못하는 사람들을 위해 Lisp 함수 / 연산자 / 생성자는 모두 다음과 같이 균일하게 호출됩니다.

(function arg0 arg1 ... argN)

C와 같은 언어로 무엇을 표현할까요?

if (a > b && foo(param))

같은 Lisp sexp로 변환됩니다

(if (and (> a b) (foo param)))

. 상황이 현실화되고 복잡 해짐에 따라 해당 s- 표현식도 나에게 해당됩니다.

나는 이것이 주관적인 질문 일 가능성이 높다는 것을 알고 있지만 많은 Lisp 해커에게는이 작은 성가심이 항상 다루어야 할 것입니까?

아니면 조만간이 구문에 익숙하지 않습니까?

어쨌든 가독성을 위해 브레이크 라인을 추가하고 있습니까 (대부분 C와 동일하지는 않습니다), 특히 장기적으로 좋은 아이디어입니까? 다른 제안은 환영받을 것입니다.


1
emacs와 같은 Lisp 인식 환경에서 Lisp를 사용해 보셨습니까? 나는 다른 방법으로 만지지 않을 것입니다.
David Thornley

아니요. Lisp 경험을 향상시킬 수있는 양식은 무엇입니까?
vemv

클로저를 가지고 놀았지만 짧은 기능을 쓰는 것도 매우 중요합니다.
Kevin

3
좋은 Lisp 환경에서는 괄호를 무시하고 들여 쓰기로 구조를 읽습니다. 알다시피, 괄호를 세어 구조를 읽는 것은 정말 성가신 일입니다.
David Thornley

답변:


8

어떻게 파싱하니

if (a > b && foo(param)) {
  doSomething();
} else {
  doSomethingElse();
}

구문 분석 트리는 아마도

if:
  condition:
    and:
      lt:
        left: a
        right: b
      function:
        name: foo
        param: param
  true-block:
    function:
      name: doSomething
  false-block:
    function:
      name: doSomethingElse

흠 ...이 트리를 접두사 표기법으로 목록으로 직렬화합시다.

if(and(<(a, b), function(foo, param)), function(doSomething), function(doSomethingElse))

이 구문 분석 트리 형식은 조작하기가 쉽지만 한 가지 문제가 있습니다. 나는 구분 기호가 싫어. 나는 터미네이터를 좋아한다. 동시에, 나는 공백에 뿌리는 것을 좋아합니다.

if( and (<(a b) function(foo param)) function (doSomething) function ( doSomethingElse))

흠 ... 추가 공백은 특정 것들을 구문 분석하기 어렵게 만듭니다 ... 어쩌면 나무가 (뿌리 잎 잎)으로 표시되는 규칙을 만들 수 있습니다.

(if (and (< a b) (function foo param)) (function doSomething) (function doSomethineElse)

이제 구문 분석 트리의 직렬화 lisp입니다 (적용 할 함수 이름 바꾸기, 아마도 실행됩니다). 프로그램을 작성하는 프로그램을 원한다면 구문 분석 트리를 조작하는 것이 좋습니다.

이것이 전적으로 s-expression의 방식은 아니지만 초기에 확인되었으며 lisp 프로그래머가 사용하는 기능 중 하나입니다. 우리의 프로그램은 어떤 의미에서 미리 파싱되어 있으며, 형식 때문에 프로그램을 조작하기위한 프로그램을 작성하는 것은 매우 쉽습니다. 이것이 구문 부족이 때로는 강점으로 여겨지는 이유입니다.

그러나 David가 말했듯이 s- 표현식 인식 편집기를 사용하십시오. xml의 ​​닫는 중괄호보다 s- 표현의 닫는 중괄호를 잃어 버릴 가능성이 높습니다 ( </foo>닫히지 <foo>만 오른쪽 paren은 모든 s- 표현을 닫습니다). 라켓에서는 일부 들여 쓰기 스타일과 함께 대괄호를 사용하여 대부분의 문제를 해결합니다.

lisp 버전 :

(if (and (< a b) (foo param))
  (doSomething)
  (doSomethingElse))

나쁘지 않아.


목록은 의심의 여지없이 exprs + statement보다 더 다양하고 강력합니다. Emacs (또는 다른 것)를 시도하는 것은 유혹적이지만 최근에 시도했을 때 나는 크게 무서웠습니다. sexp 인식은 정확히 무엇을 가져 옵니까?
vemv

간단한 것들 : 그들은 닫고 열린 parens에 강조 표시를 튀기거나 전체 s- 표현을 다르게 강조 표시합니다. 그들은 좋은 들여 쓰기 규칙이 있습니다. 이맥스는 다른 것들을 가지고 있지만 아마도 가독성에 중요하지 않을 것입니다. 다른 s-expression 인식 편집기가 있습니다. 이맥이 필요 하지 않습니다 . emacs가 당신을 두려워한다면, 텍스트 메이트, 숭고한 등의 번들을 사용해보십시오. 편집자가 가독성을 돕기 시작하면 조금 더 쉬워집니다. 라켓에서 대부분의 lispy 작업을 수행하므로 parens를 사용할 수있는 곳이면 대괄호를 사용할 수 있습니다. 전환 할 수 있으면 가독성이 향상됩니다.
ccoakley

1
옆으로, 중첩 된 렛, 정의 등을 사용하여 그 물건을 더 작은 조각으로 나눕니다. 청크에 대한 좋은 이름을 찾지 못하면 디자인에 대한 경고로 취급하십시오. 이름이 너무 작고 읽기에 너무 큰 균형을 찾으십시오.
ccoakley

아, 마지막 조언은 ... 기억에 남습니다 :) 이것을 쓰고있는 동안 Sublime을 시험해보십시오.
vemv

5

무엇 S-애 썼는데 정말 좋은 데요 것은 시간의 짧은 기간 후에, 당신은 더 이상 그들을 볼 수 없다는 것입니다, 당신의 눈에 파이썬처럼 하지만 컴퓨터는 여전히 쉽게 나무가있다.

  • 들여 쓰기는 자동이며 모호성이 없으므로 블록을 끝내고 싶을 때 탭을 두 번 누르지 않아도됩니다.

  • 임의의 코드를 선택하면 좋아하는 편집기에서 하나의 명령으로 전체 내용을 쉽게 들여 쓸 수 있습니다.

  • 당신은 당신의 코드를 탐색 할 수 있습니다 정말 좋은 편집기로 교환 등등, 쉽게 S-특급 사이 점프

또한 조작하는 데이터가 작성하는 코드와 동일하기 때문에 동일한 언어를 사용하여 코드를 올바르게 조작 할 수 있습니까?

글쎄, 당신은 그것을 할 수 있습니다. 그것은 매크로입니다. 다른리스트처럼 평가되기 전에 작성중인 코드를 조작하기 때문에 Lisp는 "프로그래밍 가능한 프로그래밍 언어"라고합니다. 코드를 작성하는 코드를 작성합니다.

다음 은 Lisp의 특성과 Lisp 프로그래머가 XML을 볼 때 왜 웃었는지 설명하는 좋은 기사입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.