2014-06-18 3 views
4

하스켈과 같은 언어를 사용하면 자신 만의 연산자를 만들 수 있습니다. 다음 답변은 연산자에서 허용되는 구두점 문자를 설명합니다. https://stackoverflow.com/a/10548541/783743기본 라틴 소문자 알파벳 매핑에 대한 아스키 구두점 문자

JavaScript는 다른 한편으로는 JavaScript와 같은 언어는 변수 이름에 구두점 문자 (옆에 $)를 사용하는 것을 허용하지 않습니다. [1]

하스켈의 하위 집합을 JavaScript로 컴파일하는 컴파일러를 작성하고 있는데 연산자를 유효한 JavaScript 식별자로 변환하는 방법을 모르겠습니다.

따라서 각 구두점 문자를 기본 라틴 소문자 알파벳 (즉, a-z)으로 매핑하기로 결정했습니다. 예를 들어 :

& = a 
| = l 
@ = q 

그러나 대신 자신에 대한 문자 매핑을 결정, 내가 먼저 다른 사람이 이미 같은 일을했는지 ​​여부를 매핑하는 방법을 결정하는 표준이인지 알고 싶어요.

이 질문은 주로 (어떤 이유에서든 StackOverflow에서 엄격하게 허용되지 않는) 의견 기반이 될 수 있음을 알고 있습니다. 그러므로 나는 (아마도 링크가있는) "이것을 수행하는 방법"이라는 것을 확실하게 밝히는 표준적인 답변만을 찾고 있습니다. opine을 원할 경우 주석에서 그렇게 할 수 있습니다. $가 너무 알파벳에 매핑하는 것이 좋을 것이다 자바 스크립트에서 식별자에 대한 유효한 문자

! # $ % & * + ./<=> ? @ \^| - ~ 

있지만 :

내가 알파벳에 매핑 할 19 자 현재이 있습니다.


[1] 속성 이름에 특수 문자가있을 수 있지만 그 추한 해킹.

+1

[Haskell -> JS?] (http://www.haskell.org/haskellwiki/The_JavaScript_Problem#Haskell_-.3E_JS) – merlin

+0

질문 : js 코드를 사람이 읽을 수있게 만들었습니까? – didierc

+0

@didierc 제 생각에는'True.aa (True)'는'True [ "&&"] (True)'보다 사람이 읽을 수 있습니다. 후자의 경우는 좀 더 설명력이 있지만 제 생각에는보기가 흉하게 보입니다. –

답변

3

Ghc는 z 인코딩이라고하는 것을 사용합니다. 예를 들어 >>=zgzgze으로 인코딩됩니다. https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler/SymbolNames

+0

GHC가 공식적으로하는 일을 알아 냈습니다. 그러므로 +1. 그럼에도 구두점 문자를 두 개의 문자 코드로 확장하면 연산자의 크기가 두 배가됩니다. 가독성과 이해 가능성이 중요 할 때이를 용인 할 수 없습니다. –

+1

2 문자로 확장하는 이유는 완전히 모호하지 않아야합니다. 'gge' 함수가'>> = '연산자와 충돌하는 것을 원하지 않을 것입니다. 이름이 기호와 문자를 섞어 쓰지 않는다는 것을 안다면, 이름의 시작 부분에 연산자 표식 만 남겨 놓을 수 있습니다 (예 :'op_gge'). –

+0

참. 단순히'&&'를'aa'로 변환하는 줄을 생각하고있었습니다. 그러나 이미'aa'라는 함수가 있다면'$ aa'로 컴파일 할 것입니다.'$'는 하스켈의 varsyms에서 유효한 문자가 아니고'$'가 자바 스크립트의 식별자에 허용되기 때문에 모든 모호성을 해결할 수있을뿐만 아니라 심볼의 길이를 최소로 유지합니다. –