Metro icon De Digitale Metro
Naar de Metro Voor beginners Programmeren Infrastructuur Sociaal Links
   
  Metrologo Hoe zit het met.. eval (;)  

Hoe zit het met.. eval (;)
Door Doesbo

Een handig commando voor bouwvakkers kan het commando 'eval' zijn, een commando waarmee je van de commandoregel in de metro zelf (dus niet in een editor of door het schrijven van een verb) een regel verb-code kan intikken en laten verwerken.

Allereerst is dit handig om verbs te runnen die normaal niet van de commandoregel te runnen zijn. Deze verbs hebben vaak als argumenten 'this none this' (kortweg: tnt) zodat het van de commandoregel bijna onmogelijk is de juiste zin in een keer in te tikken. Ze worden gebruikt om vanuit andere, meestal gewone verbs, aangeroepen te worden.

Stel, je ziet op een utilities-object (een object waar allemaal handige tnt verbs opstaan) een verb wat je snel even wilt gebruiken zonder er meteen zelf een verb voor te hoeven schrijven. Bijvoorbeeld het verb 'uppercase' van de String Utilities (#20). Je wilt snel zien hoe 'Doesbo' er in hoofdletters uitziet. Eigenlijk zou je een verb moeten schrijven waarin als enige regel staat:

#20:uppercase("Doesbo");

Nu tik je direct in:

eval #20:uppercase("Doesbo");

en je krijgt als antwoord:

=> "DOESBO"

Korter voor eval is de puntkomma (;) en dan direct de dingen erachteraan, net zoals je het kent bij het zeggen (") en emoten (:). Dus

eval #20:lowercase("dIMITRI");

kun je tikken als:

;#20:lowercase("dIMITRI");

Nog een handig voorbeeld: je wilt van een intern verb_commando (zoals setadd()) gebruik maken om een waarde toe te voegen aan een property. In plaats dat je daar een eenregelig verb voor schrijft, tik je in:

;#14972.verbs = setadd(#14972.verbs, "koe2");

om in het property #14972.verbs de string "koe2" toe te voegen.

Bij het 'eval' commando werken de vastgelegde variabelen uit een verb (zoals, this, player, caller, etc.) helaas niet. Ook voor de commandolijn vastgelgegde variabelen (me en here) werken in de eerste instantie niet. Dus i.p.v.

;here.free_entry = 0;

of

;player.location.free_entry = 0;

zul je het objectnummer van je kamer in moeten vullen, bijv.

;#15431.free_entry = 0;

Toch kun je dingen zoals 'me' en 'here' gebruiken door ze te definieren in een slim property wat al (meestal leeg) op jezelf zit. Je wilt bijv. dat 'me' altijd over jouw gaat, en dat 'here' altijd gaat over de kamer waar je nu inzit. Dus me=player en here=player.location. (Zo zou het er in verb-taal uit zien.) Tik nu in:

@setenv me=player;here=player.location

en de variabelen me en here werken nu wel in het eval commando! Het commando @setenv gebruik je dus om eval-waarden te zetten. (Voor de bitnerds, die waarden gaan naar je property .eval_env)

Veel plezier met evallen!