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.