2010-11-24 5 views
5

Gregogy는 REBOL 여기에 자바 스크립트 http://blog.revolucent.net/2009/05/javascript-rebol.htmlRebol에는 javascript 프로토 타입 속성에 해당하는 것이 있습니까?

에 대한 게시물을했다하지만 비교 자바 스크립트와 REBOL에 깊은거야, 나는 자바 스크립트 프로토 타입 REBOL의 상응하는 무엇을 볼 수 없습니다. js 프로토 타입은 모든 인스턴스를 한 번에 확장 할 수 있으므로 rebol을 사용하여 다른 인스턴스에서 객체 인스턴스를 확장하는 것이 javascript 프로토 타입 속성과 정확히 같지 않기 때문입니다.

그래서 내가 잘못 오전 또는 거기는 REBOL 아래 코드의 것과 같습니다

<html> 
<head> 
</head> 

<body> 
    <script>   
    function Person(firstName, lastName, sex) { 
     this.firstName = firstName; 
     this.lastName = lastName;  
     this.whoAreYou = function() { 
     alert("I've been built with Constructor and my name is " + this.firstName + " " + this.lastName); 
     } 
     this.WhatIsYourSex = function() { 
     alert(this.sex); 
     } 
    }; 

    Person.prototype.sex = "Man"; 

    </script> 

    <script> 
    JaneDoe = new Person("Jane", "Doe"); 
    JaneDoe.whoAreYou(); 
    JaneDoe.WhatIsYourSex(); 
    alert("Are you sure?"); 
    JaneDoe.sex = "Woman"; 
    JaneDoe.WhatIsYourSex(); 
    </script> 

</body> 
</html> 

업데이트 : 물론 문법 설탕 걱정하지 않는다. 객체를 다시 정의하는 것만으로 R2의 확장을 막을 수는 없습니다. 내 질문은 개체 INSTANCE의 확장에 관한 것이 아니라 모든 INSTANCES의 확장에 관한 것입니다. js 프로토 타입 속성에서 허용하는 것입니다.

그래서 내 질문을 다시 쓰기 : Rebol은 또한 자바 스크립트와 같은 상위 클래스를 확장하여 자동으로 모든 인스턴스를 확장 할 수 있습니다. 상관 없어도 상관 없습니다.

성능을 위해 한 인스턴스에서 R2와 R3의 차이점을 볼 수 있지만 언어 기능에 대해서는 모든 자식 개체의 자동 확장이 없기 때문에 큰 부담이됩니다. 그것이 시스템 자체에 의해 수행되지 않기 때문에 아주 느릴 것입니다. 이런 종류의 기능에 크게 의존하는 jquery와 같은 프레임 워크를 만들고 싶다면 어떻게해야할까요? 큰 번거 로움이 될 것입니다.

+0

구문에 대한 언어 비교는 오히려 바보입니다. 물론 Self, Lisp, Scheme에서 가져온 개념을 가진 함수형 언어 인 경우 유사점이 있습니다 ... CoffeeScript가 JavaScript와 얼마나 비슷한지 확인하거나 Groovy와 그 점을 비교해보십시오. – BGerrissen

+0

구문 비교에 대해 이야기하는 사람 ? 그것은 물론 능력을 비교하는 방법입니다. 구문에 대해 1 센트를 신경 쓰지 않습니다. –

+0

내 블로그 게시물 Rebol Tutorial에서 그러한 주장을 한 적은 한 번도 없었지만 REBOL에 대해 더 많이 배우게 된 것을 기쁘게 생각합니다. 프로토 타입 언어는 여러 가지 다른 방식으로 작동 할 수 있습니다. REBOL은 클래스 스펙이 아닌 기존 오브젝트를 기반으로 새 오브젝트를 작성하기 때문에 프로토 타입 언어입니다. –

답변

6

REBOL에는 해당하지 않는 항목이 있습니다.

다른 객체을 프로토 타입으로 사용하여 만듭니다. 그러나 일단 창조되면, 그것은 독립적 인 존재입니다. 프로토 타입으로 사용 된 개체에 대한 변경 사항은 새로운 개체에 영향을주지 않으며 그 반대의 경우도 마찬가지입니다.

일단 생성 된 REBOL 2의 객체는 새 필드를 추가 할 수 없습니다. 당신이 정말로 할 수있는 일은 오래된 것을 기반으로하지만 새로운 필드를 가진 새로운 객체를 만드는 것입니다. 그것은 오래된 객체에 대한 참조를 깨뜨릴 수 있기 때문에 성가신 일이 될 수 있습니다.

REBOL 3은 그런면에서 훨씬 좋습니다. 의 경우을 추가하면 모든 필드에 새 필드를 추가 할 수 있습니다.


이 스크립트는 약간 도움이 될 수 있습니다 : link text.

  • IT는 기준 개체로 대상체를 비교하고 누락 필드 추가 : 그것은 REBOL 2 코드이므로 대상 객체 사본 의해 대체 오히려
  • 연장보다 도착
  • 하지만
+0

Sunanda 나는 합성 설탕을 제외하고 그 시점에서 R3와 R2의 실제 차이를 볼 수 없다. 객체를 다시 정의하는 것만으로 R2의 확장을 막을 수는 없습니다. 내 질문은 개체 INSTANCE의 확장에 관한 것이 아니라 모든 INSTANCES의 확장에 관한 것입니다. js 프로토 타입 속성에서 허용하는 것입니다. –

+0

동일한 객체에 대한 참조가 여러 개있는 경우 (예 : blk1/3 및 blk2/7 모두로 저장되는 경우) 차이점을 확인할 수 있습니다. REBOL 2에서는 두 가지를 모두 교체해야합니다. REBOL 3을 사용하면 두 개의 참조를 확장 할 수 있습니다. 놀아보고보십시오. – Sunanda

+0

성능면에서 나는 차이점을 보았습니다. 그러나 언어 기능적인 특징으로는 모든 아이들 객체를 자동으로 확장 할 필요가 없습니다. 나는 스스로 관리해야하므로 큰 부담이됩니다. 시스템 자체. –

3

REBOL 튜토리얼, 귀하를 Reacti 한 번에 복잡한 중첩 변경을 할 수 있도록 그것은, 중첩 된 객체를 재귀 않습니다 너무 많은 것을 포함하는 "나는 상관하지 않는다"라고 생각하지 않습니까?그런데, 현명한 디자인 - 클래스 입문 후에 라이브 오브젝트에 영향을주는 클래스 정의 아이디어가있는 사람은 누구입니까? :-)

그래서 실제로 루프에서 관련 객체를 확장하는 것이 얼마나 느린 지 비교하려면 어떤 측정을 했습니까? 귀하의 주장은 "... 아주 느릴 것입니다"는 입증되지 않은 것으로 나타날 수 있습니다.

는의 몇 가지 측정을하자 :

OBJ : 컨텍스트 [A : 1] == 개체를 만들! [ A : 1 ]

DT 루프 1'000'000 [BLK 추가 복사 OBJ] == 0 : 00 : 00.023372

길이? BLK == 1,000,000

DT [BLK의 foreach OBJ [OBJ [B 추가 2]] == 0 : 00 : 02.677348

길이? blk == 1000000

blk/1 == 개체를 만드십시오! [ A : B가 1 ]

BLK/2 == 개체을! [ 는 : 1 B : 2 ]

BLK/1/A : 3 == 3

BLK/1 == 개체을! [ A : B는 3 ]

BLK/2 == 개체을! [ A : 1 B는 2 ] : 00 : 02.677348 시간 당신이 볼 수있는

그래서, 나는 == 0에서 사용자 정의 필드와 객체의 1 백만을 확장 할 수 있었다. 나는 4 살짜리 기계에있다. 애플리케이션에있는 오브젝트의 수는 얼마입니까?

나는 당신이 확장하는 객체의 목록을 구축해야 당신이 아마 원하는 것을하지 알고,하지만 난 당신이 좋아하지 않을 것 같아요 :-)

-pekr-

+0

귀하의 사례가 폐지되었습니다. 현실 세계에서는 객체의 계층 구조가 있습니다. Rebol은이 트리를 관리하지 않으므로 개발자에게는 큰 부담이됩니다. 다른 사람들보다 쉬워 진 언어는 좋지 않습니다. 또한 aggregators를 구축하기 위해 rss 피드를 파싱하는 것과 같은 다른 필드에서도 rebol이 너무 느리고 PHP로 돌아와야한다는 것을 알았습니다. 그래서 현실 세계에서 저는 리볼이 전문가를 해킹하는 것을 제외하고는 충분히 견고하지 못하다는 것을 두려워합니다. 하지만 저는 전문가가 아니며 많은 사람들도 아닙니다. 리볼이 더 쉽게되기를 원한다면 쉬운 작업이 아닌 복잡한 작업이 쉬워 져야합니다. –

+2

다시 "너무 느리다"와 같은 주장과 "PHP로 돌아 오기"에 대한 언급은 나에게 무언가입니다. 특히 문제의 설명을 제공하지 않을 때는 더욱 그렇습니다. 언어를 사용할 때, 그것은 자연 시설을 사용하고 그것이 제공하는 것에 당신의 alghoritms를 조정하는 것입니다. 소스 코드의 1 : 1 직접 변환은 제대로 작동하지 않습니다. Max는 Rebol에있는 노드 기반 객체 시스템을 사용합니다.이 시스템은 수백만 개의 노드를 처리 할 수 ​​있으며 실제 응용 프로그램에서 사용할 수있을만큼 빠릅니다. 그것은 특정 솔루션을 만들 때 사용되는 사고 방식에 관한 것이므로 도구간에 재조정하거나 PHP, JS로 유지해야합니다. –

+0

이것은 rebol에서 발생하는 문제 중 하나입니다. http://stackoverflow.com/questions/4297653/rebol-problem-with-not-enough-memory 예를 들어이 확장 프로그램을 사용할 때 나는 보통 리볼과 만남 : 벽 :) –

1

선발이다

person: context [ 
    firstName: secondName: none 
    whoAreYou: does [print [firstName secondName]] 
    WhatIsYourSex: does [print sex] 
] 
extend person 'sex "male" 
JaneDoe: make person [firstName: "Jane" secondName: "Doe"] 
JaneDoe/whoAreYou 
JaneDoe/WhatIsYourSex 
ask "Are you sure?" 
JaneDoe/sex: "female" 
JaneDoe/WhatIsYourSex 

나는 내가 기능과 데이터를 혼합해야하는 이유 이유를하지 않는 한 내가 실시간으로 이와 같은 코드를 사용하지 않을 것이라고 말해야한다 : 어떤 이유에서. JS 코드를 모방하려고하는 것입니다.

<script> 
    JaneDoe = new Person("Jane", "Doe"); 
    DoeJane = new Person("Doe", "Jane"); 
    Person.prototype.sex = "Man"; 
    JaneDoe.WhatIsYourSex(); 
    DoeJane.WhatIsYourSex(); 
</script> 

내가 말을해야보다, REBOL이 같은 적어도 현재 지원되지 않습니다 :

는하지만 난 당신이 잘못된 예를 가지고 당신이 보여주고 싶은, 같아요.

+0

코드가 내 js 코드와 동일한 의도를 반영하지 않습니다. 내 js 코드의 의도는 js의 프로토 타입이 모든 인스턴스에 변경 사항을 한 번에 전달할 수있는 반면 rebol에서는 그렇게 할 수 없다는 것을 보여주는 것이 었습니다. js 프로토 타입을 좀 더 명확히하기 위해 클래스 상속을 쉽게 시뮬레이트하고 jquery와 같은 강력한 프레임 워크를 만들 수 있습니다. –

+0

보시다시피, 저는 답안의 두 번째 부분에 보여주고 싶은 것을 보여주기 위해 예제를 수정했습니다. 귀하의 예가 변경 사항을 모든 인스턴스로 전파하지는 않습니다.또한 REBOL에서 전파 전파를 시뮬레이션 할 수 있다고 생각하지만 시간이 없다면 어떤 작업이 필요합니다. – Oldes

+0

또한 "js 프로토 타입을 사용하면 클래스 상속을 쉽게 시뮬레이션 할 수 있습니다"라고 말할 때 어떤 의미입니까? JS는 ECMAScript이므로 클래스 상속이 있으므로 무언가를 시뮬레이션 할 필요가 없습니까? – Oldes

7

Oldes가 맞습니다. 기본적으로 JS 유사 프로토 타이핑은 REBOL에 없습니다. 그러나 자신의 필요에 맞는 고유 한 기능을 자유롭게 만들 수 있습니다. 다음은 JS 프로토 타이핑을 시뮬레이트하기 위해 여러 인스턴스 간의 값 공유에 중첩 된 컨텍스트를 사용하는 간단한 예제입니다.

creature: func [ 
    /prototype 
     field [word!] 
     value [any-type!] 
    /local result proto 
][ 
    proto: [ 
     context [ 
      static: context [ 
       vars: reduce [ 
        'kind "Monkey" 
       ] 
       extend: func [ 
        blk [block!] 
        field [word!] 
        value [any-type!] 
        /local pos 
       ][ 
        either pos: find/skip blk field 2 [ 
         change/only next pos :value 
        ][ 
         insert/only insert tail blk reduce field :value 
        ] 
        :value 
       ] 

       get: func [ 
        field [word!] 
       ][ 
        all [ 
         field: any [ 
          select/skip this/instance field 2 
          select/skip vars field 2 
         ] 
         first field 
        ] 
       ] 

       set: func [ 
        field [word!] 
        value [any-type!] 
       ][ 

        extend this/instance field :value 
       ] 

       prototype: func [ 
        field [word!] 
        value [any-type!] 
       ][ 
        extend vars field :value 
       ] 

       who-are-you: does [ 
        print ["Hello I'm" this/get 'kind this/get 'sex this/get 'first-name join this/get 'last-name "."] 
       ] 
      ] 

      instance: reduce [ 
       'first-name none 
       'last-name none 
      ] 

      ;exported "API" 
      get: system/words/get in static 'get 
      set: system/words/get in static 'set 
      prototype: system/words/get in static 'prototype 
      who-are-you: system/words/get in static 'who-are-you 

      this: none 
     ] 
    ] 
    unless object? proto/1 [result: reduce proto append clear proto result] 

    if prototype [proto/1/prototype field :value] 

    result: make proto/1 [] 
    result/this: result 
] 

creature/prototype 'sex "male" 


jane: make creature [] 
jane/set 'first-name "Jane" 
jane/set 'last-name "Rebol" 

john: make creature [] 
john/set 'first-name "John" 
john/set 'last-name "Doe" 

jane/who-are-you 

jane/set 'sex "female" 

jane/who-are-you 

john/who-are-you 

creature/prototype 'kind "Human" 

jane/who-are-you 
john/who-are-you