Mathematica의 "정의"와 동일
-
22-07-2019 - |
문제
기호 이름을 문자열로 사용하고 해당 기호가 이미 정의되어 있는지 여부를 반환하는 함수가 필요합니다.함수 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]] === ""]