2013-10-14 2 views
1

기본 스크립팅 기능 (예 : 변수, 조건부 표현식, 콜백 함수)을 사용하여 데이터 설명 (a la YAML 또는 JSON)을 혼합 한 언어를 찾고 있습니다. 목록의 계층 적 구조를 설명하는 것 &은 YAML과 유사하지만 리프 값은 문자 데이터가 아닌 함수입니다.YAML을 기반으로 한 기능적 언어 찾기

지금까지 YAML 위에 표현 논리를 추가하여 접근 해 왔습니다. 이것은 기존의 파서를 기반으로 구축 할 수 있지만 구문이 너무 어색해서 컴파일러/인터프리터 측면을 직접 구현해야합니다. 나는 그것을 할 능력이 있다고 생각하지 않는다.

대안은 실제 컴파일러를 빌드 할 수 있도록 기존 언어의 일부 하위 집합을 채택하는 것입니다. 슬프게도 나는 함수형 프로그래밍 언어에 정통하지 않습니다. 나는 정직하게 어디에서 시작해야할지 모르겠다.

는 사람이 일부 또는 이러한 속성을 모두 가지고있는 기능적인 언어 제안 할 수 있습니다 :

compact syntax for expressing hierarchical lists and maps 
pure functional 
lexical scoping 
no OOP (using maps rather than static compound types) 
first class functions (primary data structures will be lists/maps of functions) 
type inference 
compilable from an AST (if I have to write my own parser) 
compilable to JVM bytecode (it would make my life a lot easier) 

스칼라는 JVM을 대상으로하기 때문에 분명한 선택을하지만 모두 내가있을 수 있습니다에게 뭔가 거기에 더 가까이 알고 내가 필요한 것. 어떤 제안?

답변

1

Clojure이 가장 적합합니다. 지도와 목록에 대한

  • 컴팩트 구문 - 예
  • 순수 기능 - 하스켈처럼 순수하지만
  • 충분히 기능하지
  • 어휘 범위 지정-
  • 없음 OOP - 처음부터 코드베이스를 시작할 때 기본 아키텍처입니다.
  • 개 첫 번째 클래스 함수 - 예
  • 추론유형 - 유형을 지원하는 동적 타입 시스템은 AST에서
  • 에 Compilable 힌트 - Clojure의 구문은
  • 에 Compilable JVM 바이트 코드로 시작하는 거의 AST입니다-

예 나는 그것이 더 잘 맞는 스칼라보다도 이러한 이유에 대한 생각 :

  • 더 많은 기능과 객체 지향 스타일의 적은
  • 더 많은지도와 목록의 소형 구문
  • 구문 (Clojure에가있는 AST에 가까운 더 나은 적합 할 수있다
0

다른 옵션을 구문 분석하는 것이 더 쉽습니다 언급했지만) 여기 Ruby로 할 수있는 일이 있습니다. (JRuby는 JVM으로 컴파일 할 수있다). Ruby 해시 구문은 충분히 편리합니다. 다른 종속성이 없으면 다른 형식을 사용할 필요가 없습니다.lambda에 대한 임의의 "src"매개 변수에주의하십시오.

to_lambdas = lambda{ |m| 
    m.respond_to?(:map) ? 
    Hash[ 
     m.map{ |k, v| [ k, to_lambdas[v||k] ] } # Paired array to hash 
    ] : lambda{ |src| eval(m.to_s) } 
    } 
to_values = lambda{ |m, src_doc| 
    m.respond_to?(:map) ? 
    Hash[ 
     m.map{ |k, v| [ k, to_values[v||k, src_doc] ] } 
    ] : m[src_doc] 
    } 
# Target structure with function definitions: 
instructions = { 
    a: { a: 'src[:b][:b]', b: 'src[:b][:a]' }, 
    b: { a: 'src[:a][:b]', b: 'src[:b][:c].upcase' } 
    } 
# Source structure with data: 
src = { 
    a: { a: 'aa', b: 'ab' }, 
    b: { a: 'ba', b: 'bb', c: 'wat' } 
    } 

lambdas = to_lambdas[ instructions ] 
tgt_doc = to_values[lambdas, src] 
puts tgt_doc.to_s 
0

체크 아웃 PyYAML. 상당히 완성 된 것처럼 보입니다.

문제가 있지만, 파이썬이 모든 요구 사항을 충족시키지는 못합니다.

장점 : 당신을 위해 그래서

단점,

  • , 나는 ... see Python's docs here
  • 자이 썬을 사용하여 JVM 바이트 코드로 컴파일 가능한 생각 AST에서 컴파일 가능한 것입니다 일류의 기능을 가지고있다
    • stat 전신적으로는되지 어휘 ...
    • 는 OOP의
    • 을 범위 그러나 당신이 당신에게
    • 없는 타입 추론을 다치게하지만, 좋은 IDE는 코드로 경고합니다 이유를 잘 모르겠어요 기능을 사용할 수 있습니다 주어진 범위
  • 관련 문제