2013-09-23 7 views
0

소개

지금이 프로젝트를 수 주일 동안 빌드하고 여러 가지 해결책을 시도해 보았습니다. 주위에 머리. 이 프로젝트를 조금 설명해 드리겠습니다. 플레이어가 텔넷이나 클라이언트를 통해 로그인 할 수있는 텍스트 기반 서버입니다. 기본적으로 머드 (MUD)와 같습니다. 그런 다음 '객체'를 만들고 상호 작용하여 '동사'와 '속성'을 부여 할 수 있습니다.네트워크 액세스 가능, 다중 사용자, 프로그래밍 가능한 대화 형 환경 구축에 대한 몇 가지 질문

서버는 기본적으로 '개체'의 데이터베이스이며 각 개체는 ID, 이름, 위치 (다른 개체), 콘텐츠 (개체) 목록 및 기타 플래그를 가지고 있습니다. 객체는 '동사'와 '속성'을 가질 수 있습니다. 속성은 저장된 데이터 (문자열, int, 부동, w/e)입니다. 동사는 메소드/함수입니다. 객체는 "컨테이너에 무엇인가 넣기"와 같은 명령을 사용하여 상호 작용합니다. 이전 버전의 서버가 이미 존재합니다. LambdaMOO입니다. 아주 오래 동안 업데이트되지 않았으므로 다시 작성하려고합니다.

당신은 객체, 동사와 특성에 작동 방법에 대해 더 깊이 읽을 수 있습니다 :

날 내가 원하는 것을 설명하자 http://bit.ly/17XIqjY

예를. 우리가 물건을 가지고 있다고 상상해보십시오. Object # 256, "버튼"이라고합니다. 부모로부터 상속 된 모든 기본 속성 (예 : '설명')과 함께 '개수'속성이 있습니다. 그것에는 "푸시 (push)"라는 동사가 하나 있습니다. 이 동사는이 코드가 포함되어 서버의 플레이어 유형 '푸시 버튼'는 '푸시'동사가 실행

this.count += 1; 
this.description = "This button has been pushed " + this.count + " times."; 
player.tell("You press the button and feel a chill run down your spine."); 

출력

You press the button and feel a chill run down your spine. 

하면 다음 look 만약 버튼에서을 당신을 업데이트 된 설명이 표시됩니다.

위의 스크립트에서 player은 동사를 실행하는 플레이어의 개체를 나타냅니다. tell은 플레이어 개체의 또 다른 동사입니다. 그러나 tell 동사에는 다른 동사에서 실행 가능하다는 플래그가 있습니다.

어떤 언어입니까?

내 주요 질문은 '동사'에 사용할 수있는 언어는 무엇입니까? 나는 node.js와 'VM'라이브러리를 사용해 보았습니다. C#을 사용하여 구문 분석을 시도했습니다. C#을 사용하여 JavaScript 구문 분석을 시도했습니다. 계속 문제가되는 것은 내가 동사와 속성의 사용 권한을 제어 할 수있는 방법이 없다는 것입니다. JavaScript에서 리터럴 함수로 변환하면 어떤 객체가 실행되고 있고 어떤 권한이 있어야하는지 확인할 수 없습니다. 사용자가 다른 사용자 객체에서 함수를 호출하면 권한이 올바르지 않으면 해당 호출을 가로 채고 중지하는 방법이 없습니다. 모든 언어가 동사 코드에 사용되는 것처럼 "sandboxed"할 필요가 없다는 것에 전적으로 의아해하지 않습니다. 속성은 동사와 마찬가지로 사용자가 설정 한 경우에만 읽기/쓰기 가능해야합니다. PHP (__get, __set, __call 같은) 과부하가있는 언어를 사용할 수 있다고 상상합니다.

는 나는 또한 동사에 이러한 변수를 삽입 할 수 있어야

:

player (object)   the player who typed the command 
this (object)   the object on which this verb was found 
caller (object)   this will be the same as ‘player’, unless another 
          verb calls the command in which case it is the object 
          containing that verb. 
verb (string)   the first word of the command 
argstr (string)   everything after the first word of the command 
args (list of strings) a list of the words in ‘argstr’ 
dobjstr (string)   the direct object string found during parsing 
dobj (object)   the direct object value found during matching 
prepstr (string)   the prepositional phrase found during parsing 
iobjstr (string)   the indirect object string 
iobj (object)   the indirect object value 

(동사가 다른 동사에서 호출되지 않는 한 대부분 입력 한 명령에서 결정) 또한 할 수 있어야합니다 다른 개체의 개체에 액세스하십시오 (권한이 작동하는 한).

// Object #128. Verb: multiply Prep: this none this Perms: +r +x 
return (args[0] * args[1]); 

// Object #256. Verb: square  Prep: this none this Perms: +r +x 
return #128:multiply(args[0], args[0]); 

// Object #512. Verb: touch  Prep: any any this  Perms: +r 
// Has a property (int) 'size' on it. 
this.size = #256:square(this.size); 
this.description = "It's a large button, it spans " + this.size + " metres."; 
player:tell("You touch the button, it gets bigger."); 

그러면 사용자는 push button 일 수 있으며 버튼 개체의 크기 속성은 제곱됩니다.

읽기 추천

내가보기 엔 당신이 시스템이 작동하는 방법에 대한보다 깊이있는 아이디어를 http://bit.ly/17XIqjY에서 문서를 읽을 것을 권장합니다.

+0

이 질문에 대한 자세한 내용을 고맙게 생각하지만, 질문을보다 간결하게 이해하기 위해 약간 편집 해 두는 것이 좋습니다. 또한 참고로, 활발한 MOO 개발자 커뮤니티가 있습니다. https://groups.google.com/forum/#!forum/moo-talk – georgek

+0

MOO 토크 포럼에 대해 알고 있습니다 만, 포럼은 원래 내용을 중심으로 진행됩니다. MOO 서버 및 코어 이것은 이전의 원칙에 기반한 완전히 새로운 프로젝트입니다. 나는 옛 작품이 어떻게 효과가 있었는지를 잘 알고 있으며, 나는이 작품에 관해서 그들이 많이 도움이 될 것이라고 생각하지 않는다. 나는 그것을 어떻게해서든지 시험 할 것이다. 더 모호하지 않고 질문을 편집 할 수 있는지 잘 모르겠다. 대답을하면 대답 전체 개념을 고려하지 않을 것이다. – R4wizard

+0

GitHub에서 LambdaMOO를 (를) 검색합니다.당신이 체크 아웃 할 수있는 몇 가지 현대적인 포트가 있습니다. – Brendan

답변

1

I :

또한 μMOO가 LambdaMOO를 기반으로 당신이, 다음의 서류를 읽고 그 방법론의 권장 이 질문을 쑤시기를 요구하는 것으로 가져 가라. 당신이 필요로하는 것을 할 수있는 나이. 그것이 내가 대답하려고 노력할 것입니다.

먼저이 작업은 C# 또는 Java와 같은 주류 또는 명령형 언어에 적합하지 않을 수 있습니다. 나는 그것에 대해서 생각조차하지 않을 것이다. Javascript는 가능하지만 좋은 점이 아니라 권장할만한 점이 아닙니다.

둘째, 적절한 기술을 보유하고 있다면 완전히 새로운 언어를 디자인하고 앞으로 1 년 또는 2 년 동안 효과를 볼 수있는 좋은 기회가 될 것입니다. 사람들은 정말로 그렇게하지만, 그런 종류의 자폐증적인 경험을 좋아하지 않는다면 나는 그것을 추천하지 않습니다. [할 수 있습니다.]

그래서 내 성냥을 찾을 때까지 자신의 언어 경험을 넓히는 것이 좋습니다. 알맞은 언어 중 가장 먼저 시도하는 것이 루비입니다. inject these variables into the verb라고 말하면 바로 Ruby에 대한 생각이 들었습니다. Ruby 소프트웨어 (레일즈 포함)가 많이 만들어 졌기 때문입니다. Python, Perl, Javascript는 잊어 버려서 : 나는 정말로 그들이 그것을 해킹 할 것이라고 생각하지 않는다.

루비 너머 루아를 생각해 볼 수도 있습니다. 나는 최근에 그것을 많이 사용하지 않았고 적합하지 않을 수도 있지만 게임 스크립팅 언어로 널리 사용됩니다.

그 외에도 실제 기능 언어가 있습니다. 그들 중 가장 오래된 것 : Lisp이 있습니다. 처음에 찾고 있던 언어를 구현하는 것을 포함하여 Lisp에서 무엇이든 할 수 있습니다. 스칼라와 하스켈이 있습니다. 그들은 배우기에는 마음이 편치 않지만, 당신이 가지고있는 문제의 종류에 매우 적합합니다.

기본적으로 다음과 같이 대답하지 않으므로 각 언어를 차례대로 배우면 나에게 맞는 언어를 찾을 수 있습니다. [할 수 있으면 더 행복하게 도와주세요. 나는 곰의 추억을 가지고있다.]

+0

나는 자신의 언어를 디자인하는 것을 고려해 왔지만 그 수준까지 올라가는 것은 어려웠다. 나는 amatuer 프로그래머가 아니지만 언어를 디자인하는 것은 내가 심도 깊게 살펴 봤던 것이 아니다. 연락 할 수있는 이메일 주소가 있습니까? 우리가 뭔가를 할 수 있을지도 몰라. MOO는 컴퓨터에 대한 나의 관심을 촉발 시켰고, 그 이후로 멈추지 않고 있으며, 현대로 옮기고 싶습니다. – R4wizard

+0

내 프로필에 언급 된 회사 중 하나에서 davidb에게 이메일을 보내면 저에게 연락 할 수 있습니다. –