2014-10-02 8 views
0

일반적인 언어로 된 문자열에 구조를 가져오고 싶습니다. Rebol의 부품 상자를 사용하여 어떻게 처리하는지 궁금합니다.임베디드 환경 변수가있는 파일 경로의 선언적 표현

something = ("/foo/mumble" "/foo/${BAR}/baz") 

내가 REBOL의 기본 요소를 사용하려면, 그래서 확실히 파일 경로 :

그럼 내가 방언으로 노력하고있어 원래 언어로 다음과 같습니다 라인을 가지고 가정 해 봅시다. 이 코드가 있다면

something: [%/foo/mumble [%/foo/ BAR %/baz]] 

당신이 재 연결을 사용하거나 COMBINE 것 : 여기가 내 머리 위로 떨어져 무슨 생각의 임의의 예입니다. 그러나 이것은 으로 실행되도록 설계되지 않았습니다. 설정 파일과 비슷합니다. 임의의 코드를 실행하지 않고 파일 목록 만 가져 오는 것이 좋습니다.

문자열을 사용하는 것이 얼마나 타당한 지 아직 모르지만이 유형은 FILE! 모든 문자는 예를 들어! 파일에 작업 :

>> load "%/foo/${BAR}/baz" 
== [%/foo/$ "BAR" /baz] 

그것은 내 옵션 설정 파일을 표현하기로했다 REBOL 데이터에 무엇인지 궁금합니다. 평범한 오래된 문자열을 사용할 수 있고 다른 것들처럼 대체 할 수 있습니다. 환경을 나타내는 OBJECT 블록이있는 REWORD일까요?

What is the 'reword' function in Rebol and how do I use it?

은 어떤 경우에도,이 같은 환경 변수 치환과 함께 선언 컨텍스트에서 파일 이름을 표현하는 방법을 알고 싶어요.

답변

2

경로를 사용할 수 있습니다! 쇠사슬로.

유일한 문제는 루트로, 다른 문자를 사용하여 파일에 사용 된 "%"를 대체 할 수 있습니다. '를 사용하십시오! (이 단어는 유효한 문자 여야 함).

경로에서 블록을 호출 할 때! 형식을 사용하면 각 부분을 자체 토큰 ...으로 반환합니다. 여기

to-block '!/path/(foo)/file.txt 
== [! path (foo) file.txt] 

세 가지 경로를로드하고 경로의 구성 부분으로 괄호를 사용하고 경로 잘못된 문자를 탈출 태그를 사용하는 작은 스크립트 (공간처럼!)

environments: make object! [ 
    foo: "FU" 
    bar: "BR" 
] 

paths: [ 
    !/path/(foo)/file.txt 
    !/root/<escape weird chars $>/(bar ".txt") 
    !/("__" foo)/path/(bar) 
] 

parse paths [ 
    some [ 
     (print "------")  
     set data path! here: (insert/only here to-block data to-block data) 
     (out-path: copy %"") 
     into [ 
      path-parts: (?? path-parts) 
      '! 
      some [ 
        [ set data [word! | tag! | number!] (
        append out-path rejoin ["/" to-string data] 
       )] 
       | 
       into [ 
        (append out-path "/") 
        some [ 
          set data word! (append out-path rejoin [to-string get in environments data]) 
         | set data skip (append out-path rejoin [ to-string data]) 
        ] 
       ] 
       | here: set data skip (to-error rejoin ["invalid path token (" type? data ") here: " mold here]) 
      ] 
     ] 
     (?? out-path) 
    ] 
] 

참고이를 다음과 같이 작동 모두 Rebol3 및 Rebol2에

출력은 다음과 같습니다

------ 
path-parts: [! path (foo) file.txt] 
out-path: %/path/FU/file.txt 
------ 
path-parts: [! root <escape weird chars $> (bar ".txt")] 
out-path: %/root/escape%20weird%20chars%20$/BR.txt 
------ 
path-parts: [! ("__" foo) path (bar)] 
out-path: %/__FU/path/BR 
------ 
+0

내가 추가 할 수있는 것들이 많이 있지만, 가능한 한 직접 간단한 예를 들어 답장하고 싶습니다. 네 개의 태그를 직접 모두 포함합니다 :-) – moliad

+0

It 's 흥미로운 아이디어이지만 전체 경로 하위 섹션을 차지하는 환경 변수에 대한 경우 만 해결합니다.사람들은 매크로와 같은 기능을 기대하기 때문에 **/foo/bar/$ {FIRST} $ {LAST}/baz "**와 같이 할 수 있습니다. 두 개의 대체가 서로 붙어서 디렉토리 이름을 두 개 밑줄로 구분 된 부분. 공백 경로의 시작으로 빈 파일을 사용할 수 없다는 것에 대한 새로운 내용은 새로운 간격 규칙이 적용될 수 있는지 궁금해하는 것들 중 하나입니다. ** (a)/b/c **와 같이 고정되어 있습니다. – HostileFork

+0

아, 개념을 개념적으로 회의적으로 생각하기 때문에 자세히 설명하지 않았습니다. 그것은 이러한 경로 세그먼트 경계가 항상 암시 적으로 슬래시와 관련되어있는 것과 같습니다. 따라서 괄호 안에있는 태그 나 시퀀스가있는 이스케이프 된 별난 문자는 앞뒤에 슬래시가 있습니다. 그것은 당신이 경로의 각 부분에 대한 양식을 선택하도록 강제합니다. 나는 그것에 대해 생각할 것이다. 이 성격을 가진 많은 것들이 있습니다. 나는 그것이 유령 같거나 깨끗한 것처럼 보이는지 모르겠습니다. :/ – HostileFork

3

내가해야 파일을 사용하십시오! == %/foo는 /; : "{/ foo는/$ {BAR}/바즈"

하는 F를 대체 $ {BAR} ""MYVALUE "당신의 예는 부하 %}"% 이후

F "를"필요 MYVALUE/baz