문제

기호 이름을 문자열로 사용하고 해당 기호가 이미 정의되어 있는지 여부를 반환하는 함수가 필요합니다.함수 ValueQ 가깝지만 함수 이름에 대해서는 False를 반환합니다.또한 문자열이 아닌 기호를 사용합니다.

예:

defined["N"] --> True (predefined function N)
defined["x"] --> False
x = 7;
defined["x"] --> True (x is now defined)
defined["7"] --> True (7 is a number)
f[x_] := 2x
defined["f"] --> True (f has DownValues)
g[x_][y_] := x+y
defined["g"] --> True (g has SubValues)

추신:DownValues와 SubValues를 모두 확인해야 함을 지적한 Pillsy에게 감사드립니다.

도움이 되었습니까?

해결책 2

나는 이것을 함께 모았다.

defined[s_] := ToExpression["ValueQ[" <> s <> "]"] || 
               Head@ToExpression[s] =!= Symbol || 
               ToExpression["Attributes[" <> s <> "]"] =!= {} ||
               ToExpression["DownValues[" <> s <> "]"] =!= {} ||
               ToExpression["SubValues[" <> s <> "]"] =!= {}

더 예쁜 솔루션이 있기를 바랍니다.

추신 : DownValues와 Subvalues를 모두 확인할 필요성을 지적해 주신 Pillsy에게 감사드립니다.

다른 팁

나는 Names가 그 일을 해야 한다고 생각합니다.

Names["문자열"]은 기호의 이름과 일치하는 문자열입니다.

Names["foo"]가 {}를 반환하는 경우 foo에 대한 정의가 없어야 하며, 그렇지 않으면 {"foo"}를 반환해야 합니다.따라서 '정의된' 함수는 다음과 같이 수행될 수 있습니다.

defined[str_] := Names[str] != {}

적어도 기호의 경우 7은 기호가 아니기 때문에 "7"에서는 작동하지 않기 때문입니다.예를 들어 NumberQ를 사용하여 이 경우를 별도로 처리할 수 있습니다.

또한 기호를 사용하여 문자열에서 기호를 만들고(기호 자동 생성에 유용함) 정의를 사용하여 기호 정의를 확인할 수 있습니다.

기호 [ "이름"]는 지정된 이름의 기호를 나타냅니다.

정의[기호]는 심볼에 대해 주어진 정의입니다.

편집하다:Names가 반환하는 내용을 보는 것보다 NameQ["name"]은 특정 이름이 존재하는지 알려줍니다.그래도 기호에 명시적인 정의가 있는지 여부는 알려주지 않고 단지 언급된 것뿐입니다.

당신이 사용할 수있는 DownValues 기호와 관련된 "기능"이 있는지 확인합니다. 이것은와 같은 정의에 대해 작동합니다

f[x_, y_] := x + y

또는

g[3] = 72 * a;

그것은 이국적인 것들에 효과가 없습니다

h[a_][b] = "gribble";

그러나 대부분의 사람들은 어쨌든 그것을 함수를 정의하는 것으로 생각하지 않습니다. 함수 정의의 존재를 확인하려면 이름을 표현식으로 변환해야합니다 (그리고 래핑되었는지 확인하십시오. Hold 당신이 할 때!). 다음은 두 가지를 확인하는 합리적으로 강력한 기능입니다. DownValues 그리고 SubValues:

functionNameQ[name_String] := 
    With[{ hSymbol = ToExpression[name, InputForm, Hold] },
        MatchQ[hSymbol, Hold[_Symbol]] &&
            ((DownValues @@ hName) =!= {} || (SubValues @@ hName) =!= {})];
defined[str_] := Not[ToString[FullDefinition[str]] === ""]
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top