@@ -26,6 +26,7 @@ struct PythonIntrinsicProcedures {
26
26
PythonIntrinsicProcedures () {
27
27
comptime_eval_map = {
28
28
{" abs" , {m_builtin, &eval_abs}},
29
+ {" str" , {m_builtin, &eval_str}},
29
30
};
30
31
}
31
32
@@ -100,6 +101,36 @@ struct PythonIntrinsicProcedures {
100
101
}
101
102
}
102
103
104
+ static ASR::expr_t *eval_str (Allocator &al, const Location &loc, Vec<ASR::expr_t *> &args) {
105
+ ASR::ttype_t * str_type = ASRUtils::TYPE (ASR::make_Character_t (al,
106
+ loc, 1 , 1 , nullptr , nullptr , 0 ));
107
+ if (args.size () == 0 ) { // create an empty string
108
+ return ASR::down_cast<ASR::expr_t >(ASR::make_ConstantString_t (al, loc, s2c (al, " " ), str_type));
109
+ }
110
+ ASR::expr_t * arg = ASRUtils::expr_value (args[0 ]);
111
+ ASR::ttype_t * arg_type = ASRUtils::expr_type (arg);
112
+ if (ASRUtils::is_integer (*arg_type)) {
113
+ int64_t ival = ASR::down_cast<ASR::ConstantInteger_t>(arg)->m_n ;
114
+ std::string s = std::to_string (ival);
115
+ return ASR::down_cast<ASR::expr_t >(ASR::make_ConstantString_t (al, loc, s2c (al, s), str_type));
116
+ } else if (ASRUtils::is_real (*arg_type)) {
117
+ double rval = ASR::down_cast<ASR::ConstantReal_t>(arg)->m_r ;
118
+ std::string s = std::to_string (rval);
119
+ return ASR::down_cast<ASR::expr_t >(ASR::make_ConstantString_t (al, loc, s2c (al, s), str_type));
120
+ } else if (ASRUtils::is_logical (*arg_type)) {
121
+ bool rv = ASR::down_cast<ASR::ConstantLogical_t>(arg)->m_value ;
122
+ std::string s = rv ? " True" : " False" ;
123
+ return ASR::down_cast<ASR::expr_t >(ASR::make_ConstantString_t (al, loc, s2c (al, s), str_type));
124
+ } else if (ASRUtils::is_character (*arg_type)) {
125
+ char * c = ASR::down_cast<ASR::ConstantString_t>(arg)->m_s ;
126
+ std::string s = std::string (c);
127
+ return ASR::down_cast<ASR::expr_t >(ASR::make_ConstantString_t (al, loc, s2c (al, s), str_type));
128
+ } else {
129
+ throw SemanticError (" str() argument must be real, integer, logical, or a string, not '" +
130
+ ASRUtils::type_to_str (arg_type) + " '" , loc);
131
+ }
132
+ }
133
+
103
134
}; // ComptimeEval
104
135
105
136
} // namespace LFortran
0 commit comments