Julia에서 "기호"는 무엇입니까?
특히 : Julia의 DataFrames 패키지, 특히 names 옵션이있는 readtable () 함수를 사용하려고하는데 기호 벡터가 필요합니다.
- 상징은 무엇입니까?
- 왜 그들은 문자열 벡터보다 그것을 선택했을까요?
지금까지 줄리아 언어의 상징이라는 단어에 대한 언급을 몇 가지만 찾았습니다. 기호는 ": var"로 표시되는 것 같지만 그것이 무엇인지는 분명하지 않습니다.
곁에 : 나는 달릴 수있다
df = readtable( "table.txt", names = [symbol("var1"), symbol("var2")] )
내 두 개의 글 머리 기호 질문이 여전히 남아 있습니다.
Julia의 기호는 Lisp, Scheme 또는 Ruby와 동일합니다. 그러나 대답 그 관련 질문은 정말 만족스럽지 제 생각에. 이 답변을 읽으면 기호가 문자열과 다른 이유는 문자열은 변경 가능하지만 기호는 변경할 수 없으며 기호도 "인터 닝"되기 때문인 것 같습니다. 문자열은 Ruby와 Lisp에서 변경 가능하지만 Julia에는 없습니다. 그 차이는 실제로 붉은 청어입니다. 심볼이 인턴된다는 사실 (즉, 빠른 동등성 비교를 위해 언어 구현에 의해 해시 됨)은 구현 세부 사항과 관련이 없습니다. 인턴 심볼을 사용하지 않는 구현을 가질 수 있으며 언어는 정확히 동일합니다.
그래서 상징이란 무엇입니까? 대답은 Julia와 Lisp가 공통적으로 갖고있는 것, 즉 언어 자체의 데이터 구조로서 언어의 코드를 표현하는 능력에 있습니다. 어떤 사람들은 이것을 "동성애" ( Wikipedia ) 라고 부르지 만, 어떤 사람들 은 언어가 동성애가되기에 충분하다고 생각하지 않는 것 같습니다. 그러나 용어는 실제로 중요하지 않습니다. 요점은 언어가 자체 코드를 나타낼 수있을 때 할당, 함수 호출, 리터럴 값으로 쓸 수있는 것 등과 같은 것을 나타내는 방법이 필요하다는 것입니다. 또한 자체 변수를 나타내는 방법이 필요합니다. 즉, foo
왼쪽에있는 데이터를 나타내는 방법이 필요합니다 .
foo == "foo"
이제 문제의 핵심을 살펴 보겠습니다. 기호와 문자열의 차이는 foo
비교의 왼쪽과 "foo"
오른쪽의 차이입니다. 왼쪽 foo
에는 식별자 foo
가 있으며 현재 범위 의 변수 에 바인딩 된 값으로 평가됩니다 . 오른쪽 "foo"
은 문자열 리터럴이며 문자열 값 "foo"로 평가됩니다. Lisp와 Julia의 기호는 변수를 데이터로 나타내는 방법입니다. 문자열은 자신을 나타냅니다. 적용하면 차이를 확인할 수 있습니다 eval
.
julia> eval(:foo)
ERROR: foo not defined
julia> foo = "hello"
"hello"
julia> eval(:foo)
"hello"
julia> eval("foo")
"foo"
기호가 :foo
평가하는 것은 변수 foo
가 바인딩되는 대상에 따라 달라 지지만 "foo"
항상 "foo"로 평가됩니다. Julia에서 변수를 사용하는 표현식을 구성하려면 기호를 사용하고 있습니다 (알든 모르 든). 예를 들면 :
julia> ex = :(foo = "bar")
:(foo = "bar")
julia> dump(ex)
Expr
head: Symbol =
args: Array{Any}((2,))
1: Symbol foo
2: String "bar"
typ: Any
물건을 버린 것은 무엇보다도 :foo
코드를 인용하여 얻은 표현식 객체 내부에 기호 객체 가 있다는 것을 보여줍니다 foo = "bar"
. 다음 :foo
은 변수에 저장된 기호로 표현식을 구성하는 또 다른 예입니다 sym
.
julia> sym = :foo
:foo
julia> eval(sym)
"hello"
julia> ex = :($sym = "bar"; 1 + 2)
:(begin
foo = "bar"
1 + 2
end)
julia> eval(ex)
3
julia> foo
"bar"
이 sym
문자열에 바인딩되어 있을 때 이렇게하면 "foo"
작동하지 않습니다.
julia> sym = "foo"
"foo"
julia> ex = :($sym = "bar"; 1 + 2)
:(begin
"foo" = "bar"
1 + 2
end)
julia> eval(ex)
ERROR: syntax: invalid assignment location ""foo""
It's pretty clear to see why this won't work – if you tried to assign "foo" = "bar"
by hand, it also won't work.
This is the essence of a symbol: a symbol is used to represent a variable in metaprogramming. Once you have symbols as a data type, of course, it becomes tempting to use them for other things, like as hash keys. But that's an incidental, opportunistic usage of a data type that has another primary purpose.
Note that I stopped talking about Ruby a while back. That's because Ruby isn't homoiconic: Ruby doesn't represent its expressions as Ruby objects. So Ruby's symbol type is kind of a vestigial organ – a leftover adaptation, inherited from Lisp, but no longer used for its original purpose. Ruby symbols have been co-opted for other purposes – as hash keys, to pull methods out of method tables – but symbols in Ruby are not used to represent variables.
As to why symbols are used in DataFrames rather than strings, it's because it's a common pattern in DataFrames to bind column values to variables inside of user-provided expressions. So it's natural for column names to be symbols, since symbols are exactly what you use to represent variables as data. Currently, you have to write df[:foo]
to access the foo
column, but in the future, you may be able to access it as df.foo
instead. When that becomes possible, only columns whose names are valid identifiers will be accessible with this convenient syntax.
See also:
- https://docs.julialang.org/en/latest/manual/metaprogramming/
- In what sense are languages like Elixir and Julia homoiconic?
참고URL : https://stackoverflow.com/questions/23480722/what-is-a-symbol-in-julia
'Programming' 카테고리의 다른 글
실행중인 AsyncTask를 취소하는 이상적인 방법 (0) | 2020.08.07 |
---|---|
HTML5 오디오가 재생 중인지 확인 하시겠습니까? (0) | 2020.08.07 |
R에서 변수 이름을 지정할 때 선호하는 스타일은 무엇입니까? (0) | 2020.08.07 |
Rails : 컨트롤러에서 다른 컨트롤러 작업 호출 (0) | 2020.08.07 |
잡히지 않은 ReferenceError : jQuery가 정의되지 않았습니다 (0) | 2020.08.07 |