2011-03-02 2 views
18

흔히 나는 {foo->value,...} 형태의 함수 옵션 목록 (또는보다 일반적인 대체 목록)을 다루고 있습니다. foo가 이미 $ Context에 값을 가지고있을 때 이것은 버그가됩니다. 이를 방지하는 한 가지 확실한 방법은 심볼 대신 문자 "foo"를 사용하는 것입니다 : {"foo"->value,...}. 이것은 작동하지만, 내가 아는 노련한 LISPers의 분노를 불러 일으키는 것처럼 보입니다. 누가 상징과 문자열이 섞여 있는지 나를 징계하고 내장 된 인용 구조를 사용하라고합니다.기호 대신 문자열을 사용 : good 또는 evil?

이지만 문자열을 사용하지 않고도 충돌을 피할 수있는 코드를 작성할 수 있지만 종종 가치가있는 것보다 더 많은 문제가있는 것으로 보입니다. 반면에 {"string"->value} 대체 규칙의 예가 너무 많습니다. 그래서 당신에게 질문은 - 이것이 받아 들일 수있는 사용 패턴인가? ... 특히 적절할 경우가 있는가? .. 피해야 할 곳 ... ..

답변

16

내 의견으로는 (면책 조항 - 그것은 나의 의견), 적어도 함수의 "기본"옵션에 대해서는 문자열을 옵션 이름으로 사용하지 않는 것이 가장 좋습니다. 문자열 OTOH는 설정 (옵션의 r.h.s.s)으로 완전히 훌륭합니다. 이것은 당신이 지적한대로 문자열을 사용할 수 없다는 것을 말하는 것이 아닙니다. 아마도 하위 옵션에 더 적합 할 수 있으며 많은 시스템 기능 (일반적으로 옵션 내에 하위 옵션이있는 NDSolve과 같은 "수퍼 함수")에 의해 이러한 방식으로 사용됩니다. 문자열을 사용할 때의 주요 문제점은 시스템과 사용자 모두에 대한 내성 기능을 줄이는 것입니다. 즉, 심볼 이름보다 문자열 이름이있는 옵션을 발견하는 것이 더 어렵습니다. 후자의 경우 패키지의 심볼 이름을 검사 할 수 있으며 기호 옵션 이름에도 사용법 메시지가 있습니다. 또한 패키지에 모든 옵션 이름을 찾는 유틸리티를 작성하는 것과 같은 작업을 자동화 할 수도 있습니다. 옵션 이름이 모두 같은 컨텍스트에 속하기 때문에 옵션 이름이 기호 일 때 더 쉽게 수행 할 수 있습니다. 또한 일부 옵션에는 사용법 메시지가 없으며 유틸리티 기능을 작성하여 자동으로 옵션을 사용할 수 있음을 발견하기 쉽습니다.

마지막으로 유사한 옵션 이름의 우발적 인 충돌을 방지 할 수 있습니다. 많은 옵션 시퀀스가 ​​함수에 전달되고 때로는 같은 이름의 옵션을 포함 할 수도 있습니다. 옵션 이름이 기호 인 경우 전체 기호 이름이 다릅니다. 그런 다음 섀도 잉 경고를 받고 동시에 보호 기능을 수행합니다. 올바른 옵션 (전체) 이름 만 사용됩니다. 문자열의 경우 경고가 표시되지 않으며 잘못된 설정 (다른 기능을 위해 만들어진)이있는 중복 문자열 옵션 이름이 목록의 첫 번째 항목 일 경우 잘못된 옵션 설정을 사용하여 끝날 수 있습니다. 이 시나리오는 더 큰 프로젝트에서 발생할 가능성이 더 높지만 이런 버그는 잡기가 매우 어려울 것입니다 (이것은 추측입니다. 그런 상황이 없었습니다).

충돌 가능성에 대해서는 대문자로 시작하는 옵션 이름과 같은 이름 지정 규칙을 따르고 대부분의 코드를 패키지에 넣고 변수 또는 함수 이름을 시작하지 마십시오 (대화 형 함수의 경우 세션)을 대문자로 쓰면 충돌 가능성이 크게 줄어 듭니다. 또한 정의 할 때 또는 패키지의 끝에서 Protect 옵션 이름을 지정해야합니다. 그런 다음 충돌이 섀도 잉의 경우로 감지됩니다. shadowing을 피하는 것은 일반적으로 필요하기 때문에 options의 경우는 함수 이름 등보다이 점에서 더 이상 특별한 것이 아닙니다.

+2

+1 기술적으로 대문자 기호는 Mathematica 내장 함수를 위해 예약되어 있습니다. 그러나이 규칙은 광범위합니다 무시. 그 이유는 대문자로 된 심볼이 다운 값을 갖지 않을 것이라는 사실을 거의 확신 할 수 있기 때문입니다. 나는 함수 이름에 대한 예약을 존중하려고 노력하지만 옵션의 경우 나는 대문자로 된 이름을 사용하여 내 자신을 정의한다. – WReach

+1

@WReach : 대문자로 된 이름은'System '컨텍스트의 기호에만 예약됩니다. 다른 규칙은 규칙이 아니며 대화 형 세션에서 작성된 기호에만 적용되며 패키지에는 적용되지 않습니다. 패키지에서, 관례는 내 보낸 함수와 옵션 이름을 대문자로 사용하는 것입니다.이는 WRI와 제 3 자에 의해 제작 된 많은 애드온 패키지에서 볼 수 있습니다. 또한 이것은 Roman Maeder가 "Programming in Mathematica"에서 제공 한 조언인데, 이는 패키지 작성을위한 표준 참조입니다. 전체 이름이 다르므로 충돌로 인해 그림자가 발생하므로 경고 메시지가 나타납니다. –

+1

+1 "문자열을 사용할 때 볼 수있는 주된 문제점은 내성 검사 기능을 줄일 수 있다는 것입니다." –

관련 문제