Rebol REPL Multi line if statement - rebol

I tried to run a multi line while statement in the Rebol REPL (aka, command line),
like in http://www.rebol.com/docs/expert-intro.html
if size [
print "ok"
]
I typed it line by line but after if size [, it says:
>> size: 0
== 0
>> if size [
** Syntax error: missing "]" at "end-of-script"
** Near: (line 1) if size [
>>
Is this a problem with the REPL, the way I am typing it, or something else?

In the Rebol 2 REPL, this should just work. After the first line, the prompt should change into a "continuation prompt":
>> if size [
[ ;<cursor here>
In Rebol 3, the REPL currently (2013-02) does not support multi-line expressions.

I too got very frustrated with this issue.
But I found a truly terrible work-around, namely: Pack up your code into a string and 'do it.
So for your example the way it can be entered is like this:
>> size: 0
== 0
>> do {if size [^/^-print "ok"^/]}
ok
>>
I warned you it was terrible, right?

Related

How do I get input from the console in Red language

I'm writing a console program (target MSDOS) in Red language and I need to ask the user to enter a character or a string, then to press Enter.
I can't seem to find how to do it, I've read the docs here (http://www.red-by-example.org/index.html) to no avail.
I tried something like this:
read.red
Red [
]
print "Please make your choice then press Enter"
x: input
print x
It works in the "Red Console" with red read.red but when I compile with red -r -t MSDOS read.red I get an error:
Compiling C:\apps\red-read\read.red ...
*** Compilation Error: undefined word input
*** in file: C:\apps\red-read\read.red
*** near: [
input
]
How do I ask for input from a Red console program?
I'm using Red version: --== Red 0.6.3 ==--.
Okay, I did some testing and got it working on my end. You need 2 things.
1) You need the latest build, not 0.63. You can grab the automated build from master from the downloads page.
2) You need a reference in your file to use the console. Here is the updated code which will work on Windows with the latest version.
Red [
]
#include %environment/console/CLI/input.red
print "Please make your choice then press Enter"
x: input
print x
This info was buried away in an article on github. Also, you were right about MSDOS.

Rakudo Perl 6: clear screen while using Readline module

Here's my test program:
use Readline;
shell 'clear';
my $r = Readline.new;
loop {
my $a = $r.readline("> ");
{say ''; last} if not defined $a;
$r.add-history( $a );
say $a;
}
After I enter any string, it exits with the following message:
> abc
Internal error: unhandled encoding
in method CALL-ME at /opt/rakudo-pkg/share/perl6/sources/24DD121B5B4774C04A7084827BFAD92199756E03 (NativeCall) line 587
in method readline at /home/evb/.perl6/sources/D8BAC826F02BBAA2CCDEFC8B60D90C2AF8713C3F (Readline) line 1391
in block <unit> at abc.p6 line 7
If I comment the line shell 'clear';, everything is OK.
This is a bit of a guess, but I think when you tell your shell to clear the screen, it's sending a control character or control sequence as input to the terminal emulator. Readline is reading from that same stream, and those characters end up at the beginning of your "line" when you try to read a line. Those characters aren't valid UTF-8 (the default encoding) and so can't be interpreted as a string. You'll know more if you open the text files in the stack trace and look at the relevant line numbers.
You can try calling reset-terminal or reset-line-state to see if you can get rid of that character. What I would do in a low level programming language is to do a nonblocking read of the input (without converting it into a string), but I can't find the API for that in the Perl 6 library.

"test: argument expected " met when test a file using "-e" option

When executing following code segment, error "test: argument expected" always occurs. However, if I change "-e" to "-s", this error will disappear. Is it possible to eliminate this error but keep "-e" unchanged?
OAMPROXY_BKOUT_SPF="/var/ap/platform/rccCfgBkup/backout.spf"
if [ -e ${OAMPROXY_BKOUT_SPF} ] && [ "${IS_GENERIC_RETROFIT}" = "no" ]
then
# Do something here
fi
Thank you very much!
Did you try rewriting the expression as
if [[ -e "${OAMPROXY_BKOUT_SPF}" && "${IS_GENERIC_RETROFIT}" = "no" ]]
then
# do something
fi
Also, when I hear 'since this problem can only be re-produced by executing a very large script (the error won't happen if you execute above ksh command in KSH window directly).', my experience says that the error is really above the error that is getting flagged. Most likely a misspelled variable or possibly unmatched brace/bracket or quote.
I bet that when you have time to test with -f, you get the same error.
Let us know how it goes.

How to write an xcode user script to surround the string the cursor is inside with NSLocalizedString(<string>, nil)

I'm trying to figure out the best way to automatically add NSLocalizedString() around a string in xcode.
Ideally I'd like a way that I could position the cursor within #"foo", press a key binding, and it'd be turned into NSLocalizedString(#"foo", nil).
I've had a look at the documentation for user scripts and can't see an obvious way to get the current cursor position.
Did I miss something, or is there another way to achieve the same result?
Thanks!
You can use %%%{PBXSelectionStart}%%%
From the apple documentation:
Getting Text from the Active Window
These variables are replaced by text in the active window:
%%%{PBXSelectedText}%%% is replaced by the selected text in the active text object.
%%%{PBXAllText}%%% is replaced by the entire text in the active text object.
Getting Information on the Contents of the Active Window
These variables are replaced by information on the text in the active window:
%%%{PBXTextLength}%%% is replaced by the number of characters in the active text object.
%%%{PBXSelectionStart}%%% is replaced by the index of the first character in the selection in the active text object.
%%%{PBXSelectionEnd}%%% is replaced by the index of the first character after the selection in the active text object.
%%%{PBXSelectionLength}%%% is replaced by the number of characters in the current selection in the active text object.
Procrastination brought you this script.
It works and does what it should. But it is very basic, and there are bugs, and this is probably not the best way to do it.
Don't use # and " in the strings you want to replace. If I were you, I wouldn't use it anyway. ^^
Script Input is Selection, Output is Replace Document Contents
#!/bin/sh
if [ %%%{PBXSelectionLength}%%% -gt 0 ]
then
echo "This does not work if you select text. Put your cursor inside a String." >&2
exit
fi
Source=`cat "%%%{PBXFilePath}%%%"`
SelectionStart="%%%{PBXSelectionStart}%%%"
SelectionEnd="%%%{PBXSelectionEnd}%%%"
BOOL=1
StringStart=$SelectionStart
StringStop=$SelectionEnd
while [ $BOOL -eq 1 ]
do
tmpText=`echo "${Source:${StringStart}:1}"`
if [ "$tmpText" = "#" ]
then BOOL=0
else StringStart=$(($StringStart - 1))
fi
done
BOOL=1
while [ $BOOL -eq 1 ]
do
tmpText=`echo "${Source:${StringStop}:1}"`
if [ "$tmpText" = "\"" ]
then BOOL=0
fi
StringStop=$(($StringStop + 1))
done
StringToReplace=`echo ${Source:${StringStart}:$(($StringStop - $StringStart))}`
ReplacementString="NSLocalizedString($StringToReplace,nil)"
echo -n "${Source:0:${StringStart}}"
echo -n "$ReplacementString"
echo -n "${Source:${StringStop}}"
#!/bin/sh
echo -n 'NSLocalizedString(%%%{PBXSelectedText}%%%, nil)'
Make sure script input is "Selection" and output is "Repalce Selection"
Select string and run script.
This is not exactly you want, but I can't google this method, let it be here :)

What's the proper syntax in Rebol to execute an in-memory block of code including the header

This syntax doesn't work:
>> do load/header {rebol [Title: "Hello World"] Print System/Header/Script/Title }
** Script Error: Invalid path value: Header
** Near: Print System/Header/Script/Title
I want to get the meta-data in header.
My goal is mostly to be able to execute a whole rebol source including header to the clipboard and execute it in console by doing something like do read clipboard:// that doesn't work if I include the header, I can't strip it since I need it.
Rewritten in response to comment.
Use load/header/next to create a two-item block: the script header followed by the script content:
loaded: load/header/next {rebol [Title: "Hello World"] Print "this is my script"^/a: 99 + 5 print a}
probe loaded/1 ;; shows the header
do loaded/2 ;; executes the script