Dynamic variable names: Difference between revisions

Added Algol 68
(Added Algol 68)
 
(17 intermediate revisions by 11 users not shown)
Line 1:
{{task|Programming environment operations}}
{{omit from|6502 Assembly}}
{{omit from|68000 Assembly}}
{{omit from|Z80 Assembly}}
;Task:
Create a variable with a user-defined name.
Line 9 ⟶ 12:
*   [[Eval in environment]] is a similar task.
<br><br>
 
=={{header|ALGOL 68}}==
{{Trans|FreeBasic}}
This follows the FreeBASIC sample and simulates dynamic variable names using an array of name and values (both STRINGs).<br/>
Note, Algol 68G has a non-standard <code>to lower</code> procedure, which could be used in the LCASE operator, i.e.: <code>OP LCASE = ( CHAR c )CHAR: to lower( c );</code>.
<syntaxhighlight lang="algol68">
BEGIN # Simulate dynamic variables using an array, translation of the FreeBASIC sample #
 
MODE DYNAMICVARIABLE = STRUCT( STRING name, value );
 
OP LCASE = ( CHAR c )CHAR: IF c >= "A" AND c <= "Z" THEN REPR( ( ABS c - ABS "A" ) + ABS "a" ) ELSE c FI;
OP LCASE = ( STRING s )STRING:
BEGIN
STRING lc := s;
FOR i FROM LWB lc TO UPB lc DO lc[ i ] := LCASE lc[ i ] OD;
lc
END # LCASE # ;
OP TRIM = ( STRING s )STRING:
BEGIN
INT left := LWB s, right := UPB s;
WHILE IF left > right THEN FALSE ELSE s[ left ] = " " FI DO left +:= 1 OD;
WHILE IF right < left THEN FALSE ELSE s[ right ] = " " FI DO right -:= 1 OD;
s[ left : right ]
END # TRIM # ;
 
PROC find variable index = ( []DYNAMICVARIABLE a, STRING v, INT n elements )INT:
BEGIN
STRING name = LCASE TRIM v;
INT index := LWB a - 1;
INT max index = index + n elements;
FOR i FROM LWB a TO max index WHILE index < LWB a DO
IF name OF a[ i ] = name THEN index := i FI
OD;
index
END # find variable index # ;
 
INT n;
WHILE
print( ( "How many variables do you want to create (max 5) " ) );
read( ( n, newline ) );
n < 0 OR n > 5
DO SKIP OD;
 
[ 1 : n ]DYNAMICVARIABLE a;
 
print( ( newline, "OK, enter the variable names and their values, below", newline ) );
 
FOR i TO n DO
WHILE
print( ( " Variable ", whole( i, 0 ), newline ) );
print( ( " Name : " ) );
read( ( name OF a[ i ], newline ) );
name OF a[ i ] := LCASE TRIM name OF a[ i ];
# identifiers should not be case-sensitive in Algol 68 though #
# in upper stropped sources (such as this one) they have to #
# be in lower case #
find variable index( a, name OF a[ i ], i - 1 ) > 0
DO
print( ( " Sorry, you've already created a variable of that name, try again", newline ) )
OD;
print( ( " Value : " ) );
read( ( value OF a[ i ], newline ) );
value OF a[ i ] := TRIM value OF a[ i ]
OD;
 
print( ( newline, "Press q to quit" ) );
WHILE
STRING v;
print( ( newline, "Which variable do you want to inspect ? " ) );
read( ( v, newline ) );
v /= "q" AND v /= "Q"
DO
IF INT index = find variable index( a, v, n );
index = 0
THEN
print( ( "Sorry there's no variable of that name, try again", newline ) )
ELSE
print( ( "It's value is ", value OF a[ index ], newline ) )
FI
OD
 
END
</syntaxhighlight>
{{out}}
<pre>
How many variables do you want to create (max 5) 3
 
OK, enter the variable names and their values, below
Variable 1
Name : v1
Value : 123
Variable 2
Name : abc
Value : mnop
Variable 3
Name : l3
Value : 21
 
Press q to quit
Which variable do you want to inspect ? L3
It's value is 21
 
Which variable do you want to inspect ? MNOP
Sorry there's no variable of that name, try again
 
Which variable do you want to inspect ? AbC
It's value is mnop
 
Which variable do you want to inspect ? q
</pre>
 
=={{header|APL}}==
<syntaxhighlight lang="apl">
<lang APL>
is←{ t←⍵ ⋄ ⎕this⍎⍺,'←t' } ⍝⍝ the 'Slick Willie' function ;)
'test' is ⍳2 3
Line 17 ⟶ 130:
1 1 1 2 1 3
2 1 2 2 2 3
</syntaxhighlight>
</lang>
 
=={{header|Arturo}}==
 
<langsyntaxhighlight lang="rebol">name: strip input "enter a variable name: "
value: strip input "enter a variable value: "
let name value
print ["the value of variable" name "is:" var name]</langsyntaxhighlight>
 
{{out}}
Line 35 ⟶ 148:
 
=={{header|AutoHotkey}}==
<langsyntaxhighlight AutoHotkeylang="autohotkey">InputBox, Dynamic, Variable Name
%Dynamic% = hello
ListVars
MsgBox % %dynamic% ; says hello</langsyntaxhighlight>
 
=={{header|AWK}}==
<syntaxhighlight lang="awk">
<lang AWK>
# syntax: GAWK -f DYNAMIC_VARIABLE_NAMES.AWK
# Variables created in GAWK's internal SYMTAB (symbol table) can only be accessed via SYMTAB[name]
Line 78 ⟶ 191:
printf("\nsymbol table contains %d names of which %d are arrays\n\n",length(SYMTAB),count)
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 102 ⟶ 215:
{{works with|Beta BASIC|3.0}},
{{works with|SAM BASIC}}
<langsyntaxhighlight lang="basic">10 INPUT "Enter a variable name", v$
20 KEYIN "LET "+v$+"=42"</langsyntaxhighlight>
 
=={{header|Batch File}}==
<langsyntaxhighlight DOSlang="dos">@echo off
setlocal enableDelayedExpansion
 
Line 119 ⟶ 232:
 
::Display the value using delayed expansion
echo %name%=!%name%!</langsyntaxhighlight>
 
=={{header|BBC BASIC}}==
<langsyntaxhighlight lang="bbcbasic"> INPUT "Enter a variable name: " name$
INPUT "Enter a numeric value: " numeric$
dummy% = EVAL("FNassign("+name$+","+numeric$+")")
Line 128 ⟶ 241:
END
DEF FNassign(RETURN n, v) : n = v : = 0</langsyntaxhighlight>
 
=={{header|Bracmat}}==
<langsyntaxhighlight lang="bracmat">( put$"Enter a variable name: "
& get$:?name
& whl
Line 139 ⟶ 252:
& !numeric:?!name
& put$(str$("Variable " !name " now has the value " !!name \n))
);</langsyntaxhighlight>
 
=={{header|C sharp|C#}}==
{{works with|C sharp|5}}
Not exactly a variable, but ExpandoObject allows adding properties at runtime.
<langsyntaxhighlight lang="csharp">using System;
using System.Dynamic;
using System.Collections.Generic;
Line 160 ⟶ 273:
Console.WriteLine(expando.foo);
}
}</langsyntaxhighlight>
{{out}}
<pre>
Hello world!
</pre>
 
=={{header|C++}}==
C++ is a compiled language which means that it loses information about names in code in the compilation process of translation to machine code. This means you can't use any information from your code at runtime without manually storing it somewhere. We therefore simulate dynamic variables using an unordered_map.
<syntaxhighlight lang="c++">
#include <algorithm>
#include <cstdint>
#include <iostream>
#include <string>
#include <unordered_map>
 
int main() {
std::unordered_map<std::string, int32_t> variables;
 
std::string name;
std::cout << "Enter your variable name: " << std::endl;
std::cin >> name;
 
int32_t value;
std::cout << "Enter your variable value: " << std::endl;
std::cin >> value;
 
variables[name] = value;
 
std::cout << "You have created a variable '" << name << "' with a value of " << value << ":" << std::endl;
 
std::for_each(variables.begin(), variables.end(),
[](std::pair<std::string, int32_t> pair) {
std::cout << pair.first << " = " << pair.second << std::endl;
}
);
}
</syntaxhighlight>
{{ out }}
<pre>
Enter your variable name:
foo
Enter your variable value:
42
You have created a variable 'foo' with a value of 42:
foo = 42
</pre>
 
=={{header|Clojure}}==
<langsyntaxhighlight lang="clojure">(eval `(def ~(symbol (read)) 42))</langsyntaxhighlight>
 
=={{header|Common Lisp}}==
The short answer is this:
<langsyntaxhighlight lang="lisp">
(setq var-name (read)) ; reads a name into var-name
(set var-name 1) ; assigns the value 1 to a variable named as entered by the user
</syntaxhighlight>
</lang>
 
 
Line 188 ⟶ 342:
 
Therefore, there are two parts to dynamically creating a variable: we must declare it special, and give it a value. The first part is accomplished by the <code>proclaim</code> function for making declarations at run-time. The second part is simply assigning to the value slot.
<langsyntaxhighlight lang="lisp">(defun rc-create-variable (name initial-value)
"Create a global variable whose name is NAME in the current package and which is bound to INITIAL-VALUE."
(let ((symbol (intern name)))
(proclaim `(special ,symbol))
(setf (symbol-value symbol) initial-value)
symbol))</langsyntaxhighlight>
<langsyntaxhighlight lang="lisp">CL-USER> (rc-create-variable "GREETING" "hello")
GREETING
 
CL-USER> (print greeting)
"hello"</langsyntaxhighlight>
Things to note:
 
Line 209 ⟶ 363:
=={{header|Déjà Vu}}==
In Déjà Vu, variable names are idents, which are completely separate from strings, and cannot easily be created from them. The way around that is to invoke the compiler:
<langsyntaxhighlight lang="dejavu">local :var-name !run-blob !compile-string dup concat( ":" !prompt "Enter a variable name: " )
local var-name 42
 
#Assuming the user types THISISWEIRD, otherwise this'll error
!. THISISWEIRD</langsyntaxhighlight>
{{out}}
<pre>Enter a variable name: THISISWEIRD
Line 220 ⟶ 374:
=={{header|E}}==
In E, there are no global variables, and there is no modification of the local (lexical) environment. However, it is possible to construct a program which binds any given variable name.
<langsyntaxhighlight lang="e">def makeNounExpr := <elang:evm.makeNounExpr>
 
def dynVarName(name) {
Line 246 ⟶ 400:
 
? dynVarName("c")
# value: [1, 2, "BOO!"]</langsyntaxhighlight>
It is also possible to capture the environment object resulting from the evaluation of the constructed program and use it later; this is done by <code>bindX</code> in [[Eval in environment#E]] (except for the program being constant, which is independent).
 
Line 255 ⟶ 409:
Dynamic variables are not supported by the language. But it is possible to set a dynamic property.
 
ELENA 56.0x :
<langsyntaxhighlight lang="elena">import system'dynamic;
import extensions;
 
class TestClass
{
object theVariablesvariables;
 
constructor()
{
theVariablesvariables := new DynamicStruct()
}
function()
{
auto prop := new MessageName(console.write:("Enter the variable name:").readLine());
(prop.setPropertyMessage())(theVariablesvariables,42);
console.printLine(prop.toPrintable(),"=",(prop.getPropertyMessage())(theVariablesvariables)).readChar()
}
}
 
public program = new TestClass();</langsyntaxhighlight>
The program should be compiled as a vm-client:
<pre>
elena-cli sandbox.l -tvm_console
</pre>
{{out}}
<pre>
Line 287 ⟶ 445:
A variable is a symbol. A name can be read from the user as a string and interned to a symbol.
 
<langsyntaxhighlight Lisplang="lisp">(set (intern (read-string "Enter variable name: ")) 123)</langsyntaxhighlight>
 
This example deliberately doesn't use any temporary variables so their names won't clash with what the user might enter. A <code>set</code> like this hits any <code>let</code> dynamic binding or buffer-local setting in the usual way.
 
=={{header|Epoxy}}==
The debug library allows you to add, get, and delete variables.
<syntaxhighlight lang="epoxy">--Add user-defined variable to the stack
const VarName: io.prompt("Input Variable Name: "),
VarValue: io.prompt("Input Variable Value: ")
debug.newvar(VarName,VarValue)
 
--Outputting the results
log(debug.getvar(VarName))</syntaxhighlight>
{{out}}
<pre>
Input Variable Name: Test
Input Variable Value: Hello, world!
Hello, world!
</pre>
 
=={{header|Erlang}}==
This task uses functions from [[Eval_in_environment#Erlang| Runtime evaluation]].
<syntaxhighlight lang="erlang">
<lang Erlang>
-module( dynamic_variable_names ).
 
Line 302 ⟶ 477:
Form = runtime_evaluation:form_from_string( erlang:atom_to_list(Variable_name) ++ "." ),
io:fwrite( "~p has value ~p~n", [Variable_name, runtime_evaluation:evaluate_form(Form, {Variable_name, 42})] ).
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 312 ⟶ 487:
=={{header|Factor}}==
By convention, variable names are usually symbols, but because dynamic variables are implemented via implicit association lists, any object can be used as the key for a value. In this case, we use the string the user enters.
<syntaxhighlight lang ="factor">42 readln set</langsyntaxhighlight>
 
=={{header|Forth}}==
<langsyntaxhighlight lang="forth">s" VARIABLE " pad swap move
." Variable name: " pad 9 + 80 accept
pad swap 9 + evaluate</langsyntaxhighlight>
Of course, it is easier for the user to simply type VARIABLE ''name'' at the Forth console.
 
Line 323 ⟶ 498:
FreeBASIC is a statically typed, compiled language and so it is not possible to create new variables, dynamically, at run time. However, you can make it look to the user like you are doing so with code such as the following. Ideally, a 'map' should be used for an exercise such as this but, as there isn't one built into FB, I've used a dynamic array instead which is searched linearly for the variable name.
 
<langsyntaxhighlight lang="freebasic">' FB 1.05.0 Win64
 
Type DynamicVariable
Line 380 ⟶ 555:
End If
Loop
End</langsyntaxhighlight>
 
Sample input/output :
Line 420 ⟶ 595:
 
=={{header|GAP}}==
<langsyntaxhighlight lang="gap"># As is, will not work if val is a String
Assign := function(var, val)
Read(InputTextString(Concatenation(var, " := ", String(val), ";")));
end;</langsyntaxhighlight>
 
=={{header|Genyris}}==
The intern function creates a symbol from an arbitrary string. Defvar creates a binding. Weird symbols are quoted with pipe characters.
<langsyntaxhighlight lang="genyris">defvar (intern 'This is not a pipe.') 42
define |<weird>| 2009</langsyntaxhighlight>
 
=={{header|Go}}==
{{trans|FreeBASIC}}
Go is in the same boat as other statically typed, compiled languages here in that variables cannot be created dynamically at runtime. However, we can use the built-in map type to associate names input at runtime with values which, in practice, is just as good.
<langsyntaxhighlight lang="go">package main
 
import (
Line 503 ⟶ 678:
}
}
}</langsyntaxhighlight>
 
{{out}}
Line 543 ⟶ 718:
=={{header|Groovy}}==
Solution:
<langsyntaxhighlight lang="groovy">def varname = 'foo'
def value = 42
 
new GroovyShell(this.binding).evaluate("${varname} = ${value}")
 
assert foo == 42</langsyntaxhighlight>
 
=={{header|Haskell}}==
<langsyntaxhighlight lang="haskell">data Var a = Var String a deriving Show
main = do
putStrLn "please enter you variable name"
vName <- getLine
let var = Var vName 42
putStrLn $ "this is your variable: " ++ show var</langsyntaxhighlight>
 
{{omit cat|Unicon}}
 
=={{Header|Insitux}}==
 
This first approach creates a function that creates a variable of that name.
 
<syntaxhighlight lang="insitux">
(let var-name "hello")
((eval (str "(var " var-name ")")) 123)
</syntaxhighlight>
 
This second approach puts the variable value directly in the evaluated string.
 
<syntaxhighlight lang="insitux">
(let var-name "hello")
(eval (str "(var " var-name " 123)"))
</syntaxhighlight>
 
=={{header|J}}==
Line 564 ⟶ 755:
This code was written for J6.02. In J8.04 you will need to replace require'misc' with require'general/misc/prompt'
 
<langsyntaxhighlight lang="j">require 'misc'
(prompt 'Enter variable name: ')=: 0</langsyntaxhighlight>
 
For example: <langsyntaxhighlight lang="j"> require 'misc'
(prompt 'Enter variable name: ')=: 0
Enter variable name: FOO
FOO
0</langsyntaxhighlight>
Or, if the name is defined in the variable 'userDefined'
<langsyntaxhighlight lang="j"> userDefined=: 'BAR'
(userDefined)=: 1
BAR
1</langsyntaxhighlight>
 
=={{header|Java}}==
Java does not support dynamic naming of variables. Therefore, HashMap has been implemented here. It is similar to an array but allows the searching of values by String keys instead of simply index numbers.
<langsyntaxhighlight lang="java">public static void main(String... args){
HashMap<String, Integer> vars = new HashMap<String, Integer>();
//The variable name is stored as the String. The var type of the variable can be
Line 594 ⟶ 785:
System.out.println(vars.get(str));
}
</syntaxhighlight>
</lang>
=={{header|JavaScript}}==
<langsyntaxhighlight lang="javascript">var varname = 'foo'; // pretend a user input that
var value = 42;
eval('var ' + varname + '=' + value);</langsyntaxhighlight>
Alternatively, without using eval:
<langsyntaxhighlight lang="javascript">var varname = prompt('Variable name:');
var value = 42;
this[varname] = value;</langsyntaxhighlight>
 
=={{header|jq}}==
jq does not have variables in the usual sense, but in practice the key/value pairs of JSON objects can be used as variable/value bindings. Using this approach, the given task can be accomplished using the following program:
 
<langsyntaxhighlight lang="jq">"Enter a variable name:",
(input as $var
| ("Enter a value:" ,
(input as $value | { ($var) : $value })))</langsyntaxhighlight>
 
''Transcript''
Line 626 ⟶ 817:
Julia has powerful macros:
 
<langsyntaxhighlight lang="julia">print("Insert the variable name: ")
 
variable = Symbol(readline(STDIN))
Line 640 ⟶ 831:
@show variable
println("If I named the variable x:")
@show x</langsyntaxhighlight>
 
{{out}}
Line 655 ⟶ 846:
Kotlin is a statically typed, compiled language and so it is not possible to create new variables, dynamically, at run time. However, you can make it look to the user like you are doing so with code such as the following which uses a map:
{{trans|FreeBASIC}}
<langsyntaxhighlight lang="scala">// version 1.1.4
 
fun main(args: Array<String>) {
Line 695 ⟶ 886:
else println("It's value is $v")
}
}</langsyntaxhighlight>
Sample input/output:
{{out}}
Line 727 ⟶ 918:
 
Which variable do you want to inspect : q
</pre>
 
=={{header|Lang}}==
<syntaxhighlight lang="lang">
fn.print(Enter a variable name:\s)
$varName = fn.input()
$value = 42
 
fn.exec(\$$varName = \$value)
 
fn.println(fn.exec({{{return $}}}$varName))
</syntaxhighlight>
{{out}}
<pre>
Enter a variable name: X
42
</pre>
 
Line 733 ⟶ 940:
 
The example below outputs a random decimal that was assigned to the variable name entered as part of the GET params.
<langsyntaxhighlight Lassolang="lasso">local(thename = web_request->param('thename')->asString)
if(#thename->size) => {^
var(#thename = math_random)
Line 739 ⟶ 946:
else
'<a href="?thename=xyz">Please give the variable a name!</a>'
^}</langsyntaxhighlight>
 
=={{header|Lingo}}==
<langsyntaxhighlight lang="lingo">-- varName might contain a string that was entered by a user at runtime
 
-- A new global variable with a user-defined name can be created at runtime like this:
Line 748 ⟶ 955:
 
-- An new instance variable (object property) with a user-defined name can be created at runtime like this:
obj[varName] = 23 -- or obj.setProp(varName, 23)</langsyntaxhighlight>
 
=={{header|Logo}}==
<langsyntaxhighlight lang="logo">? make readword readword
julie
12
? show :julie
12</langsyntaxhighlight>
 
=={{header|Logtalk}}==
Logtalk objects can be create or compiled such that new predicates can be added at runtime. A simple example:
<langsyntaxhighlight lang="logtalk">
| ?- create_object(Id, [], [set_logtalk_flag(dynamic_declarations,allow)], []),
write('Variable name: '), read(Name),
Line 778 ⟶ 985:
| ?- o1::foo(X).
X = 42.
</syntaxhighlight>
</lang>
 
=={{header|Lua}}==
<langsyntaxhighlight lang="lua">_G[io.read()] = 5 --puts 5 in a global variable named by the user</langsyntaxhighlight>
 
=={{header|M2000 Interpreter}}==
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Module DynamicVariable {
input "Variable Name:", a$
Line 801 ⟶ 1,008:
Keyboard "George"+chr$(13)
DynamicVariable
</syntaxhighlight>
</lang>
 
=={{header|M4}}==
<langsyntaxhighlight M4lang="m4">Enter foo, please.
define(`inp',esyscmd(`echoinp'))
define(`trim',substr(inp,0,decr(len(inp))))
define(trim,42)
foo</langsyntaxhighlight>
 
DOS batch file echoinp.bat:
Line 818 ⟶ 1,025:
 
=={{header|Mathematica}} / {{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">varname = InputString["Enter a variable name"];
varvalue = InputString["Enter a value"];
ReleaseHold[ Hold[Set["nameholder", "value"]] /. {"nameholder" -> Symbol[varname], "value" -> varvalue}];
Print[varname, " is now set to ", Symbol[varname]]</langsyntaxhighlight>
{{out|Example output}}
<pre>-> testvar is now set to 86</pre>
 
=={{header|Maxima}}==
<langsyntaxhighlight lang="maxima">/* Use :: for indirect assignment */
block([name: read("name?"), x: read("value?")], name :: x);</langsyntaxhighlight>
 
=={{header|min}}==
{{works with|min|0.19.3}}
<langsyntaxhighlight lang="min">42 "Enter a variable name" ask define</langsyntaxhighlight>
 
=={{header|MUMPS}}==
This is done in immediate mode so you can see the variable is created, although you will have to reference it through the indirection operator, "@".
<langsyntaxhighlight lang="mumps">USER>KILL ;Clean up workspace
USER>WRITE ;show all variables and definitions
Line 846 ⟶ 1,053:
A="GIBBERISH"
GIBBERISH=3.14159</langsyntaxhighlight>
 
=={{header|Nanoquery}}==
<langsyntaxhighlight Nanoquerylang="nanoquery">print "Enter a variable name: "
name = input()
 
print name + " = "
exec(name + " = 42")
exec("println " + name)</langsyntaxhighlight>
{{out}}
<pre>Enter a variable name: test
Line 863 ⟶ 1,070:
 
This solution emulates dynamic variables by mapping a string to a pointer to a variable (using a table).
<langsyntaxhighlight Nimlang="nim">import tables
 
var
Line 879 ⟶ 1,086:
 
when isMainModule:
main()</langsyntaxhighlight>
{{out}}
<pre>Enter a var name: varZ
Line 885 ⟶ 1,092:
 
=={{header|Octave}}==
<langsyntaxhighlight lang="octave">varname = input ("Enter variable name: ", "s");
value = input ("Enter value: ", "s");
eval([varname,"=",value]);</langsyntaxhighlight>
 
=={{header|Oforth}}==
<langsyntaxhighlight lang="oforth">: createVar(varname)
"tvar: " varname + eval ;
 
Line 896 ⟶ 1,103:
 
12 myvar put
myvar at .</langsyntaxhighlight>
 
=={{header|PARI/GP}}==
<langsyntaxhighlight lang="parigp">eval(Str(input(), "=34"))</langsyntaxhighlight>
 
=={{header|Pascal}}==
===Free Pascal===
{{works with|Free Pascal|version 3.2.0 }}
<syntaxhighlight lang="pascal">
<lang Pascal>
PROGRAM ExDynVar;
 
Line 915 ⟶ 1,122:
(*)
Free Pascal Compiler version 3.2.0 [2020/06/14] for x86_64
The free and readable alternative at C/C++ speeds
compiles natively to almost any platform, including raspberry PI
Line 922 ⟶ 1,129:
(*)
 
USES
uses
Generics.Collections,
SysUtils,
Variants;
 
TYPE
Line 941 ⟶ 1,148:
D: Tdict;
 
FUNCTION SetType ( strVal: ansistring ) : variant ;
 
(*)
If the value is numeric, store it as numeric, otherwise store it as ansistring
(*)
 
BEGIN
 
TRY
SetType := StrToFloat ( strVal ) ;
Line 951 ⟶ 1,161:
SetType := strVal ;
END;
 
END;
 
BEGIN
 
D := TDict.Create;
REPEAT
Line 973 ⟶ 1,185:
UNTIL ( strValue = '' ) ;
D.Free;
 
END.
</langsyntaxhighlight>JPD 2021/05/13
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">print "Enter a variable name: ";
$varname = <STDIN>; # type in "foo" on standard input
chomp($varname);
Line 983 ⟶ 1,196:
# treated as a "symbolic reference", where they
# take the string as the name of the variable
print "$foo\n"; # prints "42"</langsyntaxhighlight>
If you are operating in a strict environment, this isn't possible. You need to use 'eval' in this case
<langsyntaxhighlight lang="perl">use strict;
 
print "Enter a variable name: ";
Line 993 ⟶ 1,206:
my $varref = eval('\$' . $varname);
$$varref = 42;
print "$foo\n"; # prints "42"</langsyntaxhighlight>
 
=={{header|Phix}}==
=== dictionary ===
In a sense, this is kinda faking it:
<langsyntaxhighlight Phixlang="phix">constant globals = new_dict()
 
while 1 do
Line 1,010 ⟶ 1,223:
setd(name,data,globals)
end if
end while</langsyntaxhighlight>
{{Out}}
<pre>
Line 1,027 ⟶ 1,240:
=== dynamic classes ===
{{libheader|Phix/Class}}
<langsyntaxhighlight Phixlang="phix">requires("0.8.2")
class dc dynamic
-- public string fred = "555" -- (predefine some fields if you like)
Line 1,044 ⟶ 1,257:
d[name] = data
end if
end while</langsyntaxhighlight>
Same output as above (for the same input)<br>
Note you would get a fatal crash were that predefined fred not made public, and you entered that, which you could I suppose avoid by testing the result of get_field_flags(d,name) for SF_PRIVATE (and then skipping the prompt and any attempt to store).
 
=={{header|PHP}}==
<langsyntaxhighlight lang="php"><?php
$varname = rtrim(fgets(STDIN)); # type in "foo" on standard input
$$varname = 42;
echo "$foo\n"; # prints "42"
?></langsyntaxhighlight>
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(de userVariable ()
(prin "Enter a variable name: ")
(let Var (line T) # Read transient symbol
(prin "Enter a value: ")
(set Var (read)) # Set symbol's value
(println 'Variable Var 'Value (val Var)) ) ) # Print them</langsyntaxhighlight>
{{out}}
<pre>Enter a variable name: Tom
Line 1,069 ⟶ 1,282:
 
=={{header|PowerShell}}==
<langsyntaxhighlight lang="powershell">$variableName = Read-Host
New-Variable $variableName 'Foo'
Get-Variable $variableName</langsyntaxhighlight>
 
=={{header|ProDOS}}==
<syntaxhighlight lang="text">editvar /newvar /value=a /userinput=1 /title=Enter a variable name:
editvar /newvar /value=b /userinput=1 /title=Enter a variable title:
editvar /newvar /value=-a- /title=-b-</langsyntaxhighlight>
 
=={{header|Prolog}}==
<syntaxhighlight lang="prolog">test :- read(Name), atomics_to_string([Name, "= 50, writeln('", Name, "' = " , Name, ")"], String), term_string(Term, String), Term.</syntaxhighlight>
Testing:
<syntaxhighlight lang="prolog">?- test.
|: "Foo".
Foo = 50.
true.
</syntaxhighlight>
 
=={{header|Python}}==
{{works with|Python|2.x}}
<langsyntaxhighlight lang="python">>>> name = raw_input("Enter a variable name: ")
Enter a variable name: X
>>> globals()[name] = 42
>>> X
42</langsyntaxhighlight>
{{works with|Python|3.x}}
<langsyntaxhighlight lang="python">>>> name = input("Enter a variable name: ")
Enter a variable name: X
>>> globals()[name] = 42
>>> X
42</langsyntaxhighlight>
Note: most of the time when people ask how to do this on newsgroups and other forums, on investigation, it is found that a neater solution is to '''map name to value in a dictionary'''.
 
Line 1,097 ⟶ 1,319:
Quackery does not have variables, but it does have ''ancillary stacks'' which can be used as variables.
 
<langsyntaxhighlight Quackerylang="quackery"> [ say "The word "
dup echo$
names find names found iff
Line 1,113 ⟶ 1,335:
$ "[ stack ] is " over join quackery
cr cr
exists? cr ] is task ( --> )</langsyntaxhighlight>
 
{{out}}
Line 1,131 ⟶ 1,353:
 
=={{header|R}}==
<langsyntaxhighlight Rlang="r"># Read the name in from a command prompt
varname <- readline("Please name your variable >")
# Make sure the name is valid for a variable
Line 1,140 ⟶ 1,362:
#Check that the value has been assigned ok
ls(pattern=varname)
get(varname)</langsyntaxhighlight>
 
=={{header|Racket}}==
This works on the Racket REPL:
 
<syntaxhighlight lang="racket">
<lang Racket>
-> (begin (printf "Enter some name: ")
(namespace-set-variable-value! (read) 123))
Line 1,151 ⟶ 1,373:
-> bleh
123
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
Line 1,158 ⟶ 1,380:
You can [https://docs.raku.org/language/packages#Interpolating_into_names interpolate strings as variable names]:
 
<syntaxhighlight lang="raku" perl6line>our $our-var = 'The our var';
my $my-var = 'The my var';
 
Line 1,169 ⟶ 1,391:
 
put qq/Var ($name) ends with value 「{$::('name')}」/;
</syntaxhighlight>
</lang>
 
=={{header|REBOL}}==
<langsyntaxhighlight REBOLlang="rebol">REBOL [
Title: "Dynamic Variable Name"
URL: http://rosettacode.org/wiki/Dynamic_variable_names
Line 1,185 ⟶ 1,407:
; accepts the new word and the string ("Hello!") to be assigned.
 
set to-word ask "Variable name? " "Hello!"</langsyntaxhighlight>
{{out|Session output}}
<pre>Variable name? glister
Line 1,193 ⟶ 1,415:
 
=={{header|Retro}}==
<langsyntaxhighlight Retrolang="retro">:newVariable ("-) s:get var ;
 
newVariable: foo</langsyntaxhighlight>
 
=={{header|REXX}}==
Line 1,201 ⟶ 1,423:
:::* &nbsp; check for the minimum number of arguments
:::* &nbsp; check for a legitimate REXX variable name
<langsyntaxhighlight lang="rexx">/*REXX program demonstrates the use of dynamic variable names & setting a val.*/
parse arg newVar newValue
say 'Arguments as they were entered via the command line: ' newVar newValue
Line 1,207 ⟶ 1,429:
call value newVar, newValue
say 'The newly assigned value (as per the VALUE bif)------' newVar value(newVar)
/*stick a fork in it, we're all done. */</langsyntaxhighlight>
'''output''' &nbsp; for the input: &nbsp; <tt> abc &nbsp; 456 </tt>
<pre>
Line 1,216 ⟶ 1,438:
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
See "Enter the variable name: " give cName eval(cName+"=10")
See "The variable name = " + cName + " and the variable value = " + eval("return "+cName) + nl
</syntaxhighlight>
</lang>
Output
<langsyntaxhighlight lang="ring">
Enter the variable name: test
The variable name = test and the variable value = 10
</syntaxhighlight>
</lang>
 
=={{header|RLaB}}==
In RLaB all the objects are located in a global list $$. To create a variable dynamically, one writes a new entry into the global list. Consider the following example:
<langsyntaxhighlight RLaBlang="rlab">>> s = "myusername"
myusername
>> $$.[s] = 10;
>> myusername
10</langsyntaxhighlight>
 
=={{header|RPL}}==
≪ → uservar
≪ 42 uservar STO
"Value of " uservar →STR + " = " uservar EVAL →STR +
≫ ≫ 'GETVAR' STO
{{in}}
<pre>
Xyz GETVAR
</pre>
{{out}}
<pre>
1: "Value of 'Xyz' = 42"
</pre>
The variable still exists after execution, until the user deletes it through the <code>PURGE</code> instruction.
=={{header|Ruby}}==
<langsyntaxhighlight lang="ruby">p "Enter a variable name"
x = "@" + gets.chomp!
instance_variable_set x, 42
p "The value of #{x} is #{instance_variable_get x}"
</syntaxhighlight>
</lang>
{{out|Example output}}
"Enter a variable name"
Line 1,246 ⟶ 1,482:
 
=={{header|Scheme}}==
<langsyntaxhighlight lang="scheme">=> (define (create-variable name initial-val)
(eval `(define ,name ,initial-val) (interaction-environment)))
 
Line 1,253 ⟶ 1,489:
 
=> hello
50</langsyntaxhighlight>
 
=={{header|Sidef}}==
It is not possible to create a new lexical variable at run-time, but there are other various ways to do something similar.
 
<langsyntaxhighlight lang="ruby">var name = read("Enter a variable name: ", String); # type in 'foo'
 
class DynamicVar(name, value) {
Line 1,267 ⟶ 1,503:
 
var v = DynamicVar(name, 42); # creates a dynamic variable
say v.foo; # retrieves the value</langsyntaxhighlight>
 
=={{header|Slate}}==
Slate symbols are objects that name methods and slots. "Variable definition" is like defining a method which holds the value of a slot, and "variable access" is just method-call to get that value back.
<langsyntaxhighlight lang="slate">define: #name -> (query: 'Enter a variable name: ') intern. "X"
define: name -> 42.
X print.</langsyntaxhighlight>
 
=={{header|Smalltalk}}==
Line 1,280 ⟶ 1,516:
Set that variable to 42.
Print that variable's name and value.
<langsyntaxhighlight lang="smalltalk">| varName |
varName := FillInTheBlankMorph
request: 'Enter a variable name'.
Line 1,288 ⟶ 1,524:
show: ''value of ', varName, ''';
show: '' is '';
show: ', varName).</langsyntaxhighlight>
the above creates a variable which is visible only inside the evaluated block (which is considered good style). It will not be visible outside.
 
A bad style alternative which creates a globally visible variable in the Smalltalk namespace (and is therefore visible everywhere) is:
<langsyntaxhighlight lang="smalltalk">| varName |
varName := Stdin request: 'Enter a global variable name:'.
Smalltalk at:varName asSymbol put:42.
expr := Stdin request:'Enter an expression:'.
(Compiler evaluate:expr) printCR
</syntaxhighlight>
</lang>
Be reminded again: this is considered *very very bad style*, and every programmer doing this should be fired.
{{out}}<pre>Enter a global variable name: abc
Line 1,305 ⟶ 1,541:
=={{header|SNOBOL4}}==
Indirect string reference of variables is a basic feature of Snobol, using the $ operator. trim( ) is needed for Snobol4+.
<langsyntaxhighlight SNOBOL4lang="snobol4">* # Get var name from user
output = 'Enter variable name:'
invar = trim(input)
Line 1,315 ⟶ 1,551:
* Display
output = invar ' == ' $invar
end</langsyntaxhighlight>
{{out}}
<pre>Enter variable name:
Line 1,326 ⟶ 1,562:
Here a scalar variable is created, but one could create a dataset variable, a matrix... Notice the name of the variable is not "s", but the name stored in the global macro "s".
 
<langsyntaxhighlight lang="stata">display "Name?" _request(s)
scalar $s=10
display $s</langsyntaxhighlight>
 
=={{header|Tcl}}==
<langsyntaxhighlight Tcllang="tcl">puts "Enter a variable name:"
gets stdin varname
set $varname 42
puts "I have set variable $varname to [set $varname]"</langsyntaxhighlight>
Note that it is more normal to use the user's name to index into a Tcl associative array, as the syntax gets easier to work with in that case:
<langsyntaxhighlight lang="tcl">puts -nonewline "Enter an element name: "; flush stdout
gets stdin elemname
set ary($elemname) [expr int(rand()*100)]
puts "I have set element $elemname to $ary($elemname)"</langsyntaxhighlight>
Another common method for working with dynamic variables is to make an alias to the variable with a fixed name:
<langsyntaxhighlight lang="tcl">puts -nonewline "Enter a variable name: "; flush stdout
gets stdin varname
upvar 0 $varname v; # The ‘0’ for “current scope”
set v [expr int(rand()*100)]
puts "I have set variable $varname to $v (see for yourself: [set $varname])"</langsyntaxhighlight>
 
=={{header|TI-89 BASIC}}==
<langsyntaxhighlight lang="ti89b">Local varName,value
InputStr "Variable name", varName
Prompt value
value → #varName</langsyntaxhighlight>
 
=={{header|TUSCRIPT}}==
<langsyntaxhighlight lang="tuscript">
$$ MODE TUSCRIPT
ASK "Enter variablename": name=""
Line 1,361 ⟶ 1,597:
@name=$value
PRINT @name
</syntaxhighlight>
</lang>
Output:
<pre>
Line 1,373 ⟶ 1,609:
 
=={{header|UNIX Shell}}==
<langsyntaxhighlight lang="bash">read name
declare $name=42
echo "${name}=${!name}"</langsyntaxhighlight>
 
=={{header|Wren}}==
{{libheader|Wren-ioutil}}
Although Wren is dynamically typed, it is not possible to create new variables at run time. We therefore follow the example of some of the statically typed languages here and use a map instead.
{{libheader|Wren-trait}}
<lang ecmascript>import "io" for Stdin, Stdout
Although Wren is dynamically typed, it is not possible to create new variables at run time. However, we can simulate this using a map which is what the Var class in Wren-trait does under the hood.
<syntaxhighlight lang="wren">import "./ioutil" for Input
import "./trait" for Var
 
var userVars = {}
System.print("Enter three variables:")
for (i in 0..2) {
Systemvar name = Input.writetext("\n name : ")
var value = Input.text(" value : ")
Stdout.flush()
var Var[name] = StdinNum.readLinefromString(value)
System.write(" value: ")
Stdout.flush()
var value = Num.fromString(Stdin.readLine())
userVars[name] = value
}
 
System.print("\nYour variables are:\n")
for (kv in userVarsVar.entries) {
System.print(" %(kv.key) = %(kv.value)")
}</langsyntaxhighlight>
 
{{out}}
Line 1,403 ⟶ 1,637:
Enter three variables:
 
name : pip
value : 3
 
name : squeak
value : 4
 
name : wilfred
value : 5
 
Your variables are:
Line 1,418 ⟶ 1,652:
wilfred = 5
</pre>
 
=={{header|Z80 Assembly}}==
This example is admittedly crude but was made to be as simple as possible. To that end, the variable name was made to be only one letter long. A key press is taken from the user, which is used as an offset into an array of 256 null bytes, and then a value is stored at that offset and retrieved from there. Self-modifying code is used to store the user's input as the offset of the <code>IX</code> register. A more practical implementation would store this value into normal RAM first so that it can be more easily retrieved.
 
Both the user variable name and the value of that variable are printed. The value is set to 0x42 automatically before printing it.
 
<syntaxhighlight lang="z80">org &8000
WaitChar equ &BB06 ;Amstrad CPC BIOS call, loops until user presses a key. That key's ASCII value is returned in A.
PrintChar equ &BB5A ;Amstrad CPC BIOS call, A is treated as an ASCII value and is printed to the screen.
getInput:
call WaitChar
;returns key press in A
 
or a ;set flags according to accumulator
jp m,getInput
;most keyboards aren't capable of going over ascii 127
;but just in case they can prevent it.
;IX/IY offsets are signed, thus a key press outside of 7-bit ASCII would index out of bounds
push af
call PrintChar ;prints the user variable name to the screen.
pop af
call NewLine
 
ld (LoadFromUserNamedVariable+2),a ;offset byte is at addr+2
ld (StoreToUserNamedVariable+2),a
 
; This self-modifying code turns both instances of (IX+0) into (IX+varname)
ld a,&42 ;set the value of the dynamically named variable
; to &42
ld ix,ExtraRam ;storage location of dynamically named variables
StoreToUserNamedVariable:
ld (IX+0),a ;store 42 at the named offset
;"+0" is overwritten with the dynamic user ram name
xor a
dec a
;just to prove that the value is indeed stored where the code
; is intending to, set A to 255 so that the next section of
; code will show that the variable is indeed retrieved and
; is shown to the screen
LoadFromUserNamedVariable:
ld a,(IX+0) ;retrieve the value at the stored offset. The "+0" was overwritten with the user-defined offset.
call ShowHex ;prints to the terminal the value stored at the dynamically named user variable
 
ReturnToBasic
RET
 
ShowHex: ;credit to Keith S. of Chibiakumas
push af
and %11110000
rrca
rrca
rrca
rrca
call PrintHexChar
pop af
and %00001111
;call PrintHexChar
;execution flows into it naturally.
PrintHexChar:
or a ;Clear Carry Flag
daa
add a,&F0
adc a,&40
jp PrintChar
;ret
 
NewLine:
push af
ld a,13 ;Carriage return
call PrintChar
ld a,10 ;Line Feed
call PrintChar
pop af
ret
 
 
org &9000
ExtraRam:
ds 256,0 ;256 bytes of ram, each initialized to zero</syntaxhighlight>
 
{{out}}
<pre>
Ready
run"go.bas
s
42
Ready
</pre>
 
 
 
=={{header|zkl}}==
zkl doesn't support adding vars to an existing class but can create a new class with new vars:
<langsyntaxhighlight lang="zkl">vname:="foo"; // or vname:=ask("var name = ");
klass:=Compiler.Compiler.compileText("var %s=123".fmt(vname))(); // compile & run the constructor
klass.vars.println();
klass.foo.println();
klass.setVar(vname).println(); // setVar(name,val) sets the var</langsyntaxhighlight>
{{out}}
<pre>
Line 1,434 ⟶ 1,770:
 
=={{header|Zsh}}==
<langsyntaxhighlight lang="zsh">read name
typeset $name=42</langsyntaxhighlight>
 
{{omit from|ACL2}}
3,026

edits