こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

AppleScript、変数名の中に変数

AppleScriptを少しかじっただけで他の言語にうとい素人です。

repeat with i from 1 to 2
set aData(i) to...
end repeat

これでaData1とaData2という変数が作れたり呼び出せたりしたら便利だと思うのですが、
試してみたところできませんでした。

AppleScriptでも、特別な宣言などをすれば可能なのでしょうか?

また、できたらで結構ですが、他の言語ならできる、という情報もあれば教えて下さい。


手抜きせず、リストに格納してやるのが王道ってことでしょうか? ^-^;

投稿日時 - 2013-01-12 17:56:59

QNo.7888331

困ってます

質問者が選んだベストアンサー

AppleScriptのリストが配列と同じと考えられます。
set item 1 of aData to ....
で使えます。

AppleScriptは結構癖があるので、Rubyなどのスクリプト言語を基本に使い、アプリケーションなどを操作するときにはスクリプト言語からShellを呼び出し、osascript などのコマンドでAppleScriptを使うのが楽なように思います。

投稿日時 - 2013-01-13 14:22:29

補足

回答ありがとうございます。

すみません。質問に書いているとおり、リストでできることは理解しています。
Rubyでは「変数名に変数を織り交ぜることが可能」ということでしょうか?

投稿日時 - 2013-01-13 14:55:57

お礼

ありがとうございました。

投稿日時 - 2013-01-13 23:43:33

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

No.1,2です
>どちらもベストアンサーにしたいんですが…
回答者にとってはベストアンサーよりも、お礼欄や補足欄で反応していただけいるのが
一番うれしいわけで、

No3でevalについては的確な回答をされていますので、付け加えることもないのですが、evalを使うとプログラムの見通しが悪くなりますので、他の方法がないか考えてみる必要があると思います。

ちょっと別の視点から
AppleScriptの質問で、他の言語を勧めるのも気がひけますが、プログラム言語一般に言えることですが、ある程度完成されてきますと、互換性を重視することから、大きな変更ができないようになってしまいます。
AppleScriptは登場した当初は先進的で、アプリケーションを外部からコントロールする方法として定着してきましたが、いろいろな問題を抱えたまま現在に至っているように感じます。(特に文字列の処理と外部ルーチンの追加についての使いづらさが目立ちます)
これからOSXで使うことを前提としてスクリプト言語を選ぶとなると、Rubyが有力な候補に挙がるのではないかと思います。私自身Rubyを中心に使っていますのでひいき目に見てしまいますが、後はPython, Perlあたりでしょうか。いずれも簡単にshellに命令を渡せますので、osascript命令で多少の使いずらさはありますが、AppleScriptを使うことは可能です。

投稿日時 - 2013-01-15 17:25:06

補足

kmeeさん、すみません。
次回同じ状況になったらkmeeさんに一票入れます!
今後ともよろしくお願いします!

投稿日時 - 2013-01-17 00:09:10

お礼

私もお礼がもらえるのが一番嬉しいですが、ベストアンサーも大好きです(笑

手間をかけて、その上見通しが悪くなるようなら辞めた方が良いですね^-^;
素直にリスト使います。

汎用性のある言語を習得すべきことは頭では分かっているのですが…なかなかその一歩が踏み出せずにいます(汗
少しでも話についていけるようになりたいです。

今後ともよろしくお願いします!

投稿日時 - 2013-01-17 00:09:37

ANo.3

いくつかの言語では「eval」という命令や関数が用意されていて、
eval(文字列)
という感じで使用すると、文字列を命令と解釈して、現在の環境で実行します。

Perlの例:
$t=1;
print $t,"\n" ; # 1と出力
eval('$t=2') ; # ここに $t=2; と書いたのと同等
print $t,"\n" ; # 2と出力

また、変数等を使って、変数名を指定できる仕組みが用意されている言語もあります。
http://php.net/manual/ja/language.variables.variable.php
http://perldoc.jp/docs/perl/5.16.1/perlref.pod#Symbolic32references


いずれの方法も、大変危険な方法であって、これでしかできない、というときの最終手段です。
# 例えば、「ファイルを消去する命令」をevalに渡すと、ファイルが消去されます。
これらを使わなければならないようなプログラムなら、設計から考えなおした方がよいです。
リストや配列、ハッシュテーブル等の機能があるのなら、そちらを使うのが普通でしょう。


AppleScriptにはあまり詳しくないのですが、ざっと眺める限りでは、eval相当のものは無いようです。
参照とかプロパティとかをうまく使えば、sData1でもsData(1)でも同じものをアクセスするように作れそうな気はします。

投稿日時 - 2013-01-14 08:58:16

補足

お礼の訂正:リンク2つ目がまさしくそれですね(汗

それと、ki073さんだと思ってコメントしてました。すみません。
evalとosascriptの例示、ありがとうございました!


どちらもベストアンサーにしたいんですが…
ランダムに決めるか、敢えて引き分けとして締め切りにするか…
結果は恨みっこなしでお願いしますm(_ _)m

投稿日時 - 2013-01-14 16:51:39

お礼

ありがとうございました!
リンク1つ目がまさに私がやりたかったことです。


evalについてもようやく理解しました。
別途、命令文の体をなす「文字列を生成」させておいて、
それをevalで「命令として実行」ということですね。
素人なので前者を察するのに苦労しました^-^;

その方法ならosascriptでも同じようにできますね。
もっと簡単に出来る方法もありそうです。

勉強になりました!

投稿日時 - 2013-01-14 16:31:01

ANo.2

aData1とaData(1)は違った変数ですので、同じに扱える方がおかしいのですが、どういうことをされたいのでしょうか?
変数をスクリプトの中で作るには、Rubyの場合はevalを使えば可能です。
いつでもaData1と配列要素のaData[1]が同じ値を取るようにすることも工夫すれば出来そうな気がしますが、確認していません。

AppleScriptの場合の記事がありますが、内容を理解できていません。
http://blog.dtpwiki.jp/dtp/2009/05/applescript-d40.html

投稿日時 - 2013-01-13 22:27:30

補足

恐らく私の質問が悪いせいで伝わっていないようです。

aData1, aData2という変数を手入力で設定せず、
AppleScript自身で、実行時にaData1,aData2という「変数名」を設定させる方法があるか、という質問です。

これでも伝わらなかったらスルーして下さいm(_ _)m

投稿日時 - 2013-01-13 23:43:07

お礼

度々ありがとうございます。

私のしたいこととRubyのevalの用途とは違うようですし、参考の記事はレコードからの参照の話ですので、質問とは関係無いようです。

投稿日時 - 2013-01-13 23:43:02