C # Dev-Lisps를 시도했지만 얻지 못했습니다.


37

CL과 약간의 Clojure에 대한 Lisp에 대해 몇 달 동안 배우고 놀고 난 후에도 C # 대신 무언가를 작성해야 할 강력한 이유를 찾지 못했습니다.

나는 몇 가지 설득력있는 이유를 원하거나 누군가가 내가 정말로 큰 것을 놓치고 있다고 지적하고 싶습니다 .

Lisp의 강점 (나의 연구 당) :

  • 콤팩트하고 표현적인 표기법-C #보다 더 그렇습니다. 그러나 C #에서도 그러한 아이디어를 표현할 수있는 것 같습니다.
  • 함수형 프로그래밍에 대한 암시 적 지원-LINQ 확장 메서드를 사용하는 C # :
    • mapcar =. 선택 (람다)
    • mapcan =. (람다)를 선택합니다. ((a, b) => a.Union (b))
    • 자동차 / 첫 번째 = .First ()
    • cdr / rest = .Skip (1) .... 등
  • 람다 및 고차 함수 지원-C #에는이 기능이 있으며 구문은 훨씬 간단합니다.
    • "(람다 (x) (본문))"대 "x => (본문)"
    • "# ("with "%", "% 1", "% 2"는 Clojure에서 훌륭합니다.
  • 객체와 분리 된 메소드 디스패치-C #은 확장 메소드를 통해이를 수행합니다.
  • 다중 메소드 디스패치-C #에는 기본적 으로이 기능이 없지만 몇 시간 안에 함수 호출로 구현할 수 있습니다
  • 코드는 데이터 (및 매크로)입니다. 매크로를 얻지 못했지만 매크로의 아이디어를 함수로 구현할 수없는 단일 예제는 보지 못했습니다. "언어"를 바꾸지는 않지만 그게 힘인지 잘 모르겠습니다
  • DSL-기능 구성을 통해서만 수행 할 수 있지만 작동합니다.
  • 형식화되지 않은 "탐사"프로그래밍-구조체 / 클래스의 경우 C #의 자동 속성 및 "개체"가 매우 잘 작동하며 진행하면서 더 강력한 타이핑으로 쉽게 에스컬레이션 할 수 있습니다.
  • Windows 이외의 하드웨어에서 실행됩니다. 대학 밖에서는 집에서 Windows를 실행하지 않는 사람이나 * nix / Mac에서 Windows의 VM을 하나 이상 알고있었습니다. (또 다시, 이것은 아마도 내가 생각했던 것보다 더 중요하고 방금 세뇌되었습니다 ...)
  • 상향식 디자인의 REPL-좋아, 이것이 정말로 훌륭하다는 것을 인정하고 C #에서는 그것을 놓친다.

Lisp에서 누락 된 것 (C #, .NET, Visual Studio, Resharper의 혼합으로 인해) :

  • 네임 스페이스. 정적 메소드를 사용하더라도 컨텍스트를 분류하기 위해 "클래스"에 묶는 것을 좋아합니다 (Clojure는 이것을 가지고있는 것으로 보이지만 CL은 보이지 않습니다).
  • 뛰어난 컴파일 및 디자인 타임 지원
    • 유형 시스템을 사용하면 내가 통과하는 데이터 구조의 "정확성"을 결정할 수 있습니다.
    • 철자가 틀린 것은 실시간으로 밑줄이 쳐집니다. 런타임까지 알고 기다릴 필요가 없습니다.
    • 코드 개선 (예 : 명령 방식 대신 FP 방식 사용)이 자동 제안됩니다.
  • GUI 개발 도구 : WinForms 및 WPF (Clojure가 Java GUI 라이브러리에 액세스 할 수 있다는 것을 알고 있지만 완전히 외국입니다.)
  • GUI 디버깅 도구 : 브레이크 포인트, 스텝 인, 스텝 오버, 값 검사기 (텍스트, XML, 사용자 정의), 시계, 스레드 별, 조건부 브레이크 포인트, 모든 레벨에서 코드로 이동할 수있는 콜 스택 창 스택에
    • (공평하게, Emacs + Slime에 대한 나의 견해는 이것의 일부를 제공하는 것처럼 보였지만 VS GUI 중심 접근 방식에 부분적입니다)

나는 Lisp를 둘러싼 과대 광고를 정말 좋아하고 기회를 주었다.

그러나 Lisp에서 C #으로 할 수없는 일이 있습니까? C #에서는 조금 더 장황하지만 자동 완성 기능도 있습니다.

내가 무엇을 놓치고 있습니까? Clojure / CL을 사용해야하는 이유는 무엇입니까?


4
이미 기능적 스타일로 프로그래밍하고 있으며 Windows 인프라에 상당히 의존하는 것처럼 들리므로 C #에서 변경해야 할 강력한 이유를 알 수 없습니다. 내가 아는 대부분의 사람들은 Mac 또는 Linux를 사용하므로 많은 사람들이 분명히 달려 있습니다 (3.1 이후 모든 Windows 버전을 사용했지만 여전히 크로스 플랫폼 소프트웨어 및 * nix 시스템으로 작업하는 것을 선호합니다 ... 하지만 나는 어떤 기본 GUI 작업, 모든 서버와 웹 UI 물건)하지 않는다
숀 Corfield

2
펄 전의 돼지를 볼 수 있습니다 . 듣기 좋은 이야기이며, 매크로가 좋은 것에 대한 간단한 예를 제시합니다.
Matthias Benkard 2019

4
"매크로의 아이디어를 함수로 구현할 수없는 하나의 예를 보지 못했습니다."-글을 AND쓰거나 OR함수로 쓰는 방법을보고 싶습니다 . 그것은 가능할 수도 있지만 ( LAMBDA매크로이기도합니다) 완전히 빠지지 않는 명확한 방법을 보지 못했습니다.

1
"네임 스페이스. ... Clojure는 이것을 가지고있는 것 같습니다. CL은 그렇지 않습니다"– 찾고있는 것에 대해 더 구체적으로 설명 할 수 있습니까? Clojure를 실제로 사용하지는 않았지만 네임 스페이스는 CL의 패키지와 거의 비슷합니다.

4
조나단 : CL의 사용 :(또는 ::사용하는 것이 여기에, 예를 들어, 패키지에 예를 문자 명명 내 보내지 않은 기호) http:sessionchat:session.

답변:


23

매크로를 사용하면 편안한 언어를 사용하지 않고도 컴파일러를 작성할 수 있습니다. C #과 같은 언어의 DSL은 일반적으로 런타임 인터프리터에 해당합니다. 도메인에 따라 성능상의 문제가있을 수 있습니다. 속도는 중요합니다 . 그렇지 않으면 C #이 아닌 해석 언어로 코딩됩니다.

또한 매크로를 사용하면 인적 요소를 고려할 수 있습니다. 특정 DSL에 가장 사용하기 쉬운 구문은 무엇입니까? C #을 사용하면 구문에 대해 할 수있는 일이 많지 않습니다.

따라서 Lisp을 사용하면 효율성을 향한 길을 희생하지 않고도 언어 디자인에 참여할 수 있습니다 . 이러한 문제는 당신에게 중요하지 않을 수 있지만 , 유용한 생산 지향 프로그래밍 언어의 기초가되기 때문에 매우 중요합니다. C #에서이 기본 요소는 최대한 제한적인 형태로 노출됩니다.

매크로의 중요성은 다른 언어에서는 없어지지 않습니다. Template Haskell, camlp4가 떠 오릅니다. 그러나 여전히 유용성 의 문제입니다. 현재까지 Lisp 매크로는 가장 사용자 친화적이지만 강력한 컴파일 타임 변환 구현 일 것입니다.

따라서 C #과 같은 언어로 사람들이 일반적으로하는 일은 DSIL (Domain Specific Interpreted Languages)을 빌드하는 것입니다. Lisp는 훨씬 더 급진적 인 DSP (Domain Specific Paradigms)를 구축 할 수있는 기회를 제공합니다. 라켓 (이전의 PLT-Scheme)은 특히이 점에서 고무적입니다-게으른 언어 (Lazy Racket), 타이핑 된 언어 (Typed Racket), Prolog 및 Datalog는 모두 매크로를 통해 관용적으로 내장되어 있습니다. 이러한 모든 패러다임 은 명령 클래스 프로그래밍이나 FP 패러다임으로 가장 잘 해결되지 않는 문제의 큰 클래스에 대한 강력한 솔루션을 제공합니다.


3
그 주장에 대해 흥미로운 점은 DSL / DSIL을 구현할 수있는 기회를 얻지 못했다는 것입니다. DSL의 힘에 대해 자세히 설명해 주시겠습니까? (개발자 및 사용자 모두에게 해당됩니다.) 이것은 내가 실제로 놓친 큰 것 같습니다 .

15
@Jonathan Mitchem, 이미 구성 파일, 빌드 스크립트, ORM 구성, 비주얼 코드 생성기 (예 : winforms 편집기), XAML, 파서 생성기 등 많은 외부 DSL을 사용하고 있습니다. 임베디드 DSL은 더 좋습니다. 별도의 빌드 도구가 필요하지 않으며 단일 언어로 제공됩니다. 또한 정규식과 SQL 중 적어도 두 개의 임베디드 DSL에 익숙해야합니다.
SK-logic

와우 나는 그것들을 DSL이라고 생각하지 않았습니다. 이제 저는 의도적으로 "C #으로 할 수있는 모든 것, c #을 고수 할 것"을 기반으로 많은 것을 피했습니다. 나는 개인적으로 일관된 행동으로 하나의 도구를 고집하는 것을 좋아합니다. 그러나이 예제에서 DSL의 가치를 이해합니다.

2
@Jonathan Mitchem, 주어진 도구의 문제점은 주어진 목적에 반드시 맞지 않을 것이라는 것입니다. 작업마다 다른 도구를 선택해야합니다. Lisp를 포함한 모든 메타 언어의 강점은 다른 언어로 완전히 전환 할 필요가 없다는 것입니다. 기본 언어 위에 고유 한 도메인 별 도구를 키울 수 있기 때문입니다. Nemerle을 살펴보면 C # 개발자가 이해하기 쉬울 것이며 매크로는 Lisp만큼 강력합니다.
SK-logic

3
"저는 하나의 도구를 고집하는 것을 좋아합니다 ..."Lisp에서 올바르게 제작 된 DSL은 Lisp의 모든 기능을 숨기지 않으므로 여전히 하나의 도구를 가지고 있습니다. 그들은 특정 도메인에 대한 코딩을보다 "자연적인"방식으로, 즉 더 나은 추상화와 전체 구성으로 어휘에 추가합니다.

15

원래 Lisps에서만 사용할 수 있었던 거의 모든 것이 고맙게도 다른 많은 현대 언어로 마이그레이션되었습니다. 가장 큰 예외는 "코드는 데이터"철학과 매크로입니다.

코드는 데이터 (및 매크로)입니다. 매크로를 얻지 못했을 수도 있지만 매크로의 아이디어를 함수로 구현할 수없는 단일 예제는 보지 못했습니다.

예, 매크로는 이해하기 어렵습니다. 일반적으로 메타 프로그래밍은 어렵습니다. 당신이 본 경우 어떤 함수로 구현 될 수있는 매크로를 다음 프로그래머는 잘못하고 있었다. 기능이 작동하지 않을 때만 매크로를 사용해야합니다.

매크로의 "hello world"예제는 cond로 "if"를 쓰는 것입니다. 매크로의 힘을 배우고 싶다면 클로저에서 함수를 사용하여 "my-if"를 정의하고 어떻게 깨지는 지 살펴보십시오. 나는 신비 할 뜻이 아니라, 그냥 사람이 단독으로 설명하여 매크로를 이해하기 시작 본 적이 있지만,이 슬라이드 쇼는 소개 꽤 좋은입니다 : http://www.slideshare.net/pcalcado/lisp-macros-in -20 분-기능-클로저-프레젠테이션

매크로를 사용하여 문자 그대로 수백 / 수천 줄의 코드를 저장하는 작은 프로젝트가있었습니다 (Java에서 가져온 것과 비교하여). Clojure의 대부분은 Clojure에서 구현되며 매크로 시스템으로 인해 가능합니다.


3
코드를 건드리지 않고 Clojure와 C # 모두에서 매크로없이 "if"를 구현하는 시나리오를 살펴 보았습니다. 효과적으로 (또는 문자 그대로) 수행 할 수 없습니다. 나는 그것이 깔끔하다는 것을 인정한다. 그러나 그것이 나에게 유용한 방법의 연결이 빠져 있습니다. 영리한 기능 또는 OO 디자인으로 할 수없는 매크로 ( "if"쓰기 제외)로 무엇을 할 수 있습니까? "이것이 어떻게 도움이 될 수 있습니까?"는 언어를 평가하는 데 유효한 기준은 아니지만 사용 여부를 평가하기위한 것입니다. (난 정말 원하는 리스프가 가치가 전환 될하지만, 실행 가능한 대안이되는 점을 명중하지 않았다.)

1
그 예를 이해하는 데 약간의 시간이 걸립니다. 저에게있어 "보일러 플레이트 코드 저장"은 일반적으로 "리팩토링"이라는 용어를 불러옵니다. 이것은 설명이 저를 설득하지 못한 이유의 일부입니다. 내가 적용 한 모든 인스턴스에서 작동하는 솔루션이 있습니다. 그렇다면 매크로를 사용할 수있는 사례를 어떻게 식별 할 수 있을까요?

1
나는 매크로가 가치가 있다는 것에 동의하지만 my-if에 매크로가 필요하다는 것은 사실이 아니며 상위 함수로 작성할 수 있습니다 (아래 CL 예 참조). 코드를 보거나 새로운 어휘 컨텍스트에 배치하려면 매크로 만 있으면됩니다. (defun my-if (test then &optional else) (cond (test (funcall then)) ('otherwise (funcall else))))

1
기본적으로 함수를 사용하면 인용 할 수있는 인용 된 코드를 선택할 수 있습니다.이 코드는 걸을 수 있지만 함수의 어휘 컨텍스트에서 걷고 실행하기 때문에 어휘 컨텍스트가 누락되었습니다. 또는 어휘 컨텍스트를 유지하는 클로저를 수락 할 수 있지만 호출하거나 걸을 수 없거나 어휘 컨텍스트에 무언가를 추가 할 수 없습니다. 두 가지를 모두 수행하려면 매크로가 필요합니다. 매크로가 확장되어 매크로 호출의 어휘 컨텍스트에 배치되기 전에 코드를 걸어서 감쌀 수 있습니다.

7
@Jonathan Mitchem의 LINQ 구문은 매크로로 수행 할 수있는 작업의 좋은 예이지만 언어가 적절한 메타 프로그래밍을 지원하지 않기 때문에 언어 코어로 구현해야했습니다.
SK-logic

14

저는 Common Lisp의 전문가는 아니지만 C #과 Clojure를 합리적으로 잘 알고 있기 때문에 이것이 유용한 관점입니다.

  • 간단한 구문 => 힘 -Lisps는 가능한 가장 간단한 구문에 관한 것입니다. S- 표현 만 있으면됩니다. "(function-call arg1 arg2 arg3)"을 움켜 쥐면 기본적으로 얻습니다. 나머지는 올바른 함수 호출과 인수를 선택하는 것입니다. 거의 단순 해 보이지만 사실이 단순함은 Lisps에 많은 힘과 유연성을 제공하고 특히 Lisp의 유명한 메타 프로그래밍 기능을 가능하게한다는 것입니다. 예를 들어 매크로가 동일한 인수에서 여러 가지 다른 함수를 호출하려면 다음과 같은 작업을 수행하십시오 (이것은 런타임 함수 응용 프로그램 이 아니라 모든 개별 함수 호출을 작성한 것처럼 컴파일 된 코드를 생성하는 매크로입니다) 손으로):
(defmacro print-many [functions args]  
  `(do   
     ~@(map   
        (fn [function] `(println (~function ~@args)))   
        functions)))

(print-many [+ - * /] [10 7 2])  
19  
1  
140  
5/7
  • 엄청나게 간단한 구문의 결과로 Lisp의 "코드는 데이터"라는 철학은 함수 구성 / 템플릿 / 제네릭 등으로 수행 할 수있는 것보다 훨씬 강력합니다. 컴파일 시간에 단순한 DSL, 코드 생성 및 조작 이상입니다. 언어의 기본 기능으로 당신이 비의 기능이 종류를 얻을하려고하면 homoiconic C #이나 자바 같은 언어, 당신은 결국 심하게 리스프를 재창조 될 겁니다. 그러므로 유명한 그린스펀 십분의 일 규칙: "충분히 복잡한 C 또는 Fortran 프로그램에는 비공식적으로 지정되고 버그가 해결되며 Common Lisp의 절반에 대한 느린 구현이 포함됩니다." 응용 프로그램 내에서 튜링 완료 템플릿 / 흐름 제어 언어를 발명 한 적이 있다면 아마도 내가 무슨 뜻인지 알 것입니다 .....

  • 동시성 은 Clojure의 고유 한 강점이지만 (다른 Lisp에 비해) 프로그래밍의 미래가 멀티 코어 머신으로 확장되는 응용 프로그램을 작성해야한다고 생각한다면 실제로이 점을 고려해야합니다. 획기적인. Clojure STM (Software Transactional Memory)은 Clojure 가 신원과 상태 의 새로운 분리를 기반으로 불변성과 잠금없는 동시성 구성을 수용하기 때문에 작동합니다 ( Rich Hickey의 신원 및 상태에 관한 훌륭한 비디오 참조 ). 이러한 종류의 동시성 기능을 언어 / 런타임 환경에 이식하는 것은 매우 고통스러운 일인데, 여기서 API의 상당 부분이 가변 객체에서 작동합니다.

  • 함수형 프로그래밍 -Lisp는 고차 함수를 사용한 프로그래밍을 강조합니다. 클로저 / 함수 객체 등을 사용하여 OO 객체에서 에뮬레이트 할 수 있다는 것이 맞지만 차이점은 전체 언어 및 표준 라이브러리가 이러한 방식으로 코드를 작성하는 데 도움이되도록 설계되었다는 것입니다. 예를 들어, Clojure 시퀀스는 게 으르 므로 C # / Java의 ArrayLists 또는 HashMaps와 달리 무한히 길 수 있습니다. 이를 통해 일부 알고리즘을 훨씬 쉽게 표현할 수 있습니다. 예를 들어 다음은 피보나치 수의 무한 목록을 구현합니다.

    (def fibs (lazy-cat '(0 1) (map + fibs (drop 1 fibs))))

  • 동적 타이핑 -Lisps는 함수형 프로그래밍 언어 스펙트럼의 "동적"끝에있는 경향이 있습니다 (정적 유형에 대한 매우 강력하고 아름다운 개념을 가진 Haskell과 같은 언어와는 반대). 여기에는 장단점이 있지만 동적 언어는 더 큰 유연성으로 인해 프로그래밍 생산성을 선호하는 경향이 있습니다. 이 동적 타이핑은 런타임 성능에 약간의 비용이 들지만 귀찮은 경우 코드에 타입 힌트를 추가하여 정적 타이핑을 얻을 수 있습니다. 기본적으로-기본적으로 편리함을 얻고 약간의 추가 작업을 수행하려는 경우 성능을 얻습니다.

  • 대화 형 개발 -실제로 C # 4.0 용 REPL을 얻을 수 있다고 생각하지만 Lisp에서는 참신함이 아닌 표준 사례입니다. 컴파일 / 빌드 / 테스트 사이클을 전혀 할 필요가 없습니다. 실행중인 환경에서 코드를 직접 작성하고 나중에 소스 파일로 복사하십시오. 코딩 방법이 매우 다르므로 결과를 즉시보고 솔루션을 반복적으로 개선 할 수 있습니다.

"누락"으로 표시되는 것에 대한 몇 가지 간단한 설명 :

  • 말했듯이 Clojure에는 네임 스페이스가 있습니다. 실제로 이들은 동적 네임 스페이스입니다. 런타임시이를 업데이트 할 수 있습니다. 이는 대화식 개발에 놀라운 이점을 제공합니다. 나는 스레드를 실행하거나 라이브 데이터 구조를 해킹하는 재미있는 기능을 많이 재정의했습니다 ....
  • 컴파일 / 디자인 타임 지원-REPL에서 코딩하는 경우 실제로 관련이 없음-그냥 수행하고 결과를 직접 봅니다. Clojure는 Eclipse 용 CounterClockwise 플러그인 과 같은 개선 된 IDE 지원을 받기 시작했습니다 .
  • GUI 개발-예, 새로운 API를 배워야하지만 언어를 전환 할 때 항상 그렇습니다 .... 좋은 소식은 Java API가 어렵지 않고 흥미로운 Clojure가 있다는 것입니다. 사용하기 쉬운 특정 래퍼 / 예제. 몇 가지 좋은 예를 보려면 Clojure GUI 개발관한이 질문을 참조하십시오
  • GUI 디버깅 : CounterClockwise를 사용하거나 Netbeans를 사용하는 경우 Enclojure를 사용한다고 가정하면 Eclipse의 GUI 디버거와 함께 작동합니다. 그러나이 기능을 사용하지 않습니다 .REPL의 대화 형 디버깅이 더 생산적이라는 것을 알았습니다.

나는 개인적으로 Clojure / Lisp의 장점을 매우 강력하게 생각하며 C # / Java로 돌아갈 계획이 없습니다 (유용한 모든 라이브러리를 빌려야하는 것 이상!).

그러나 실제로 모든 것을 해결하는 데 몇 달이 걸렸습니다. 계몽 학습 경험으로 Lisp / Clojure를 배우는 데 진정으로 관심이 있다면 다이빙을하고 몇 가지를 구현하도록 강요 할 수있는 방법은 없습니다 .....


1
아이디어의 큰 열거에 감사드립니다. 실제로 C #의 IEnumerable <> 구문을 통해 게으른 시퀀스를 많이 사용하지만 2005 년 이후 ArrayList를 만지지는 않았지만 아이디어를 이해합니다. Clojure의 동시성 프리미티브는 매우 인상적입니다. 몇 년 전 C #에서 그리드 컴퓨팅을하고 있었으며 많은 멀티 코어 시스템에서 동시성이 있습니다. 그리고 여전히 미래라고 생각합니다. 아마 내가 모든 사람에게서 얻은 가장 큰 아이디어는 "당신은 그것을 정말로 파헤쳐 서 경험해야한다. 그것은 실제로 설명 될 수 없다"는 것이다. 그래서 계속 파고 계속 경험할 것입니다.

1
시원하고 기꺼이 도와주었습니다. 그리고 그것은 절대적으로 올바른 정신입니다 !!
mikera

10

C #에는 많은 기능이 있지만 믹스는 다릅니다. 일부 언어에 여전히 기능이 있다고해서 사용이 쉽고, 패러다임이 있으며 나머지 언어와 잘 통합되어 있다는 의미는 아닙니다.

일반적인 Lisp에는 다음과 같은 혼합이 있습니다.

  • 데이터 구문으로서의 s- 표현
  • 데이터로 코드를 작성하여 매크로 및 기타 기호 계산 기술로 연결
  • 동적 언어는 런타임 수정 (후기 바인딩, MOP 등)을 허용합니다.
  • 강력한 유형, 동적 유형
  • 증분 컴파일러 또는 인터프리터와의 대화식 사용
  • 핵심 실행 엔진으로서의 평가자
  • 가비지 콜렉션으로 관리되는 메모리
  • 명령형, 기능성 및 객체 지향 프로그래밍을 많이 사용하는 하이브리드 언어. 다른 패러다임 (규칙, 논리, 제약 조건 등)을 추가 할 수 있습니다.

이제 C #과 같은 다른 언어에서도 마찬가지입니다. 그러나 종종 같은 강조점이 아닙니다.

C #은

  • C와 같은 구문
  • 일부 FP 기능과 함께 대부분 명령형 객체 지향
  • 정적으로 입력
  • 대부분 일괄 처리 컴파일러와 일괄 사용
  • 가비지 콜렉션으로 관리되는 메모리

C #이 Lisp 에서처럼 널리 사용되지 않는 경우 코드 조작 기능을 예로들 수 있습니다. Lisp에서는 모든 종류의 간단하고 복잡한 방식으로 매크로를 많이 사용하지 않는 소프트웨어를 많이 찾지 못합니다. 코드 조작을 사용하는 것은 실제로 Lisp에서 큰 기능입니다. 여러 언어로 일부 사용을 에뮬레이트하는 것이 가능하지만 Lisp에서와 같이 중심적인 기능은 아닙니다. 예를 들어 'On Lisp'또는 'Practical Common Lisp'과 같은 책을 참조하십시오.

대화식 개발에서도 마찬가지입니다. 대규모 CAD 시스템을 개발하는 경우 대부분의 개발은 편집기 및 REPL에서 실행중인 CAD 응용 프로그램과 직접 대화식으로 이루어집니다. 확장 언어를 구현하여 C # 또는 다른 언어로 많은 것을 에뮬레이션 할 수 있습니다. Lisp의 경우 변경 사항을 추가하기 위해 개발중인 CAD 응용 프로그램을 다시 시작하는 것은 어리석은 일입니다. CAD 시스템에는 CAD 객체와 그 관계 (부분, 포함 등)를 설명하기위한 언어 기능 (매크로 및 기호 설명 형식)을 추가 한 향상된 Lisp도 포함됩니다. C #에서도 비슷한 작업을 수행 할 수 있지만 Lisp에서는 이것이 기본 개발 스타일입니다.

대화식 개발 프로세스를 사용하여 복잡한 소프트웨어를 개발하거나 소프트웨어에 상당한 상징적 요소 (메타 프로그래밍, 기타 패러다임, 컴퓨터 대수, 음악 구성, 계획 등)가있는 경우 Lisp가 적합 할 수 있습니다.

Windows 환경에서 작업하는 경우 (그렇지 않습니다) C #은 Microsoft의 주요 개발 언어이므로 이점이 있습니다. Microsoft는 Lisp 형식을 지원하지 않습니다.

당신은 쓰기:

  • 네임 스페이스. 정적 메소드를 사용하더라도 컨텍스트를 분류하기 위해 "클래스"에 묶는 것을 좋아합니다 (Clojure는 이것을 가지고있는 것으로 보이지만 CL은 보이지 않습니다).

Common Lisp은 네임 스페이스를 클래스에 연결하지 않습니다. 네임 스페이스는 심볼 패키지로 제공되며 클래스와 무관합니다. CLOS를 사용하는 경우 객체 지향 프로그래밍에 대한 접근 방식의 방향을 바꿔야합니다.

  • 컴파일 및 디자인 타임에 대한 강력한 지원 유형 시스템을 통해 맞춤법이 틀린 부분을 전달하는 데이터 구조의 "정확성"을 실시간으로 확인할 수 있습니다. 필연적 인 코드 대신 FP 접근 방식을 사용하는 등 코드 개선이 자동으로 제안되는 것을 알기 위해 런타임까지 기다릴 필요가 없습니다.

Lisp 컴파일러를 사용하십시오. 알 수없는 변수에 대해 알려주고, 사용 된 컴파일러에 따라 스타일 권장 사항이있을 수 있으며, 효율성 힌트를 제공합니다 ... 컴파일러는 키 입력입니다.

  • GUI 개발 도구 : WinForms 및 WPF (Clojure가 Java GUI 라이브러리에 액세스 할 수 있다는 것을 알고 있지만 완전히 외국입니다.)

LispWorks 및 Allegro CL과 같은 상용 Lisp는 Windows에서 유사한 기능을 제공합니다.

  • GUI 디버깅 도구 : 브레이크 포인트, 스텝 인, 스텝 오버, 값 검사기 (텍스트, XML, 사용자 정의), 시계, 스레드 별, 조건부 브레이크 포인트, 모든 레벨에서 코드로 이동할 수있는 콜 스택 창 스택에서 (공정하게 말하면, Emacs + Slime에 대한 나의 stint는 이것 중 일부를 제공하는 것처럼 보였지만 VS GUI 중심 접근 방식에 부분적입니다)

LispWorks 및 Allegro CL과 같은 상용 Lisp는 Windows에서 모든 것을 제공합니다.


1
저의 비판은 실제로 리스프에 대한 것이 아닙니다. 나는 그들이 상당히 유능하다고 생각합니다. 나는 내가 아직하지 않은 Lisp가 무엇을 할 수 있는지 찾고 있습니다. 나는 대부분의 C # 개발자들이 많은 "새로운"언어 기능을 사용하지 않는다는 것을 잘 알고 있습니다. 더 큰 요점은 GUI 외부에서 실제로 100 % FP 스타일로 작성한다는 것입니다. FP는 개념적으로 도약했지만 그만한 가치가있었습니다. 그러나 내가있는 곳에서 Lisp로 전환하면 거의 이점이없는 것 같습니다. 계속 기회를 주어야 할 이유가 있기를 바라고 있습니다.

@Jonathan Mitchem : C #은 언어를 지원하는 기능이 있고 일부 라이브러리가이를 사용할 수 있더라도 실제로는 FP 언어처럼 보이지 않습니다. Microsoft 에코 시스템에서 FP 프로그래밍을 수행하려는 경우 F #이 적합 할 수 있습니다.

@Rainer 아니요, FP 언어처럼 보이지는 않지만 그렇게 할 수 있습니다. 그리고 명령형 코드 또는 OO를 원하거나 필요로 할 때도 그렇게 할 수 있습니다. (약간 논외 주제 : 나는 F #을 파헤칠 가치가있는 심각한 언어라고 생각하지 않고, Haskell에서 모나드 주위에 머리를 갖기를 원하지만 C ++ 개발자 였고 C #이 나왔을 때 그것을 고려하지 않았습니다 "실제"언어 (그리고 그 당시에는 그렇지 않았습니다))


@Jonathan Mitchem : 왜보아야합니까? C #은 일부 FP 기능을 지원한다고 썼습니다. 그것은 명령형 객체 지향 언어에 추가되었으며 Lisp, Scheme과 같이 관용적이지 않으며 특히 SML, F #, Haskell 또는 기타 주로 기능적인 언어와 비교되지 않습니다. 요점은 C #에서 일부 FP가 가능하지만 핵심 기능은 아닙니다.

5

Rainier Joswig가 최고라고 말했습니다.

저에게 Lisp 기능의 목록을 보면 Lisp의 힘을 이해할 수 없습니다. Lisp 및 특히 Common Lisp의 경우 전체가 파트의 합보다 큽니다. REPL, s- 표현식, 매크로, 멀티 메소드 디스패치, 클로저, 패키지, CLOS, 재시작, X, Y, Z만이 아닙니다. 다른 프로그래밍 언어의 일상 경험과는 매우 다른 일상 경험입니다.

Lisp는 다르게 보이며, 다르게 사용되며, 다른 방식으로 프로그래밍 할 때 사용합니다. 우아하고 완벽하며 크고 완벽합니다. 자체 결점과 페 카딜로가없는 것은 아닙니다. 앞으로 나올 수없는 다른 언어와 비교할 수 있습니다. 그러나 Lisp가 언어 X + REPL 및 매크로, 또는 언어 Y + 다중 메소드 디스패치 및 재시작만으로는 결코 아닙니다 .


3
코드는 데이터 (및 매크로)입니다. 매크로를 얻지 못했지만 매크로의 아이디어를 함수로 구현할 수없는 단일 예제는 보지 못했습니다. "언어"를 바꾸지는 않지만 그게 힘인지 잘 모르겠습니다

일반적으로 매크로는 함수 호출로 표현할 수없는 것에 사용해야합니다. C #에 스위치와 같은 조건이 있는지는 알 수 없지만 (C에 존재하는 것과 유사하지만 스위치 (양식) {사례 ...}), 그러나 그것이 동일한 것으로 가정하고 동일한 제한 ( 일체형이 필요합니다).

이제 우리는 당신이 그런 것처럼 보이지만 문자열에 파견한다고 가정합시다. lisp (특히, 일반적인 Lisp와 다른 것)에서, 그것은 단지 "거의"매크로 일 뿐이며, 사용자가 상수 문자열 (아마도 힘들지 않음)을 갖도록 제한한다면, (컴파일 타임) 계산할 수 있습니다 어떤 경우와 일치하는지 판별하기위한 최소한의 테스트 순서 (또는 해시 테이블 사용, 클로저 저장 등)

함수 (비교 문자열, 실행 사례 및 클로저 목록)로 표현하는 것이 가능할 수도 있지만 아마도 "일반 코드"처럼 보이지 않을 것이며 lisp 매크로가 확실한 승리를 거둔 곳입니다. 당신은 아마 꽤 매크로 나 매크로와 같은, 등이있다 taht를 특별한 형태로 사용했습니다 defun, defmacro, setf, cond, loop그리고 더 많은합니다.


2

이것은 내가 찾은 최고의 설명 기사로서 Lisp 옹호의 표면에서 독자가 사용되는 개념의 더 깊은 의미를 보여줍니다.

http://www.defmacro.org/ramblings/lisp.html

나는 다른 곳에서 다음과 같은 생각을 읽는 것을 상기한다 : 다른 언어들은 Lisp의 다양한 기능을 채택했다; 더 나은 C ++ / C / Algol을 생성하기위한 가비지 수집, 동적 입력, 익명 함수, 클로저. 그러나 Lisp의 모든 기능을 사용하려면 필수 기능이 모두 필요합니다.이 시점에서 50 년 넘게 한 형태로 다른 언어 군인 Lisp의 다른 방언이 있습니다.

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